PHP实现的微信APP支付功能示例【基于TP5框架】


Posted in PHP onSeptember 16, 2019

本文实例讲述了PHP实现的微信APP支付功能。分享给大家供大家参考,具体如下:

1.进行支付请求 他给的DEMO 用的时候有时候会报错

1)我遇到的情况 把  WxPay.Api.php这个文件的 postXmlCurl 这个 方法里

//   curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,TRUE);
//  curl_setopt($ch,CURLOPT_SSL_VERIFYHOST,2);//严格校验
curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,FALSE);
curl_setopt($ch,CURLOPT_SSL_VERIFYHOST,FALSE);

这两行的严格验证给注掉

2)有时候还会报终端IP错误  我的修改方案是 要么写死 要么注掉 他不是必填参数

3)有时候还会报写入 日志文件 包含错误  把他的相对路径改成绝对路径就好了

4)以下就是APP请求参数

require_once "./payment/wxpay/php/lib/WxPay.Api.php";
require_once "./payment/wxpay/php/example/WxPay.NativePay.php";
$notify = new \NativePay();
$input = new \WxPayUnifiedOrder();
$input->SetBody("购买订单");
$input->SetOut_trade_no($order_data['order_number']);
$input->SetTotal_fee($zongMoney*100);
$input->SetNonce_str($this->createNoncestr());
$input->SetNotify_url(config('u_wx_notify_url'));
$input->SetTrade_type('APP');
$input->SetProduct_id(rand(10000,99999));
$result = $notify->GetPayUrl($input);
//我还遇到了 $result 返回值为空 也不报错
// 然后我发现是因为我用的请求方法为 GetPayUrl()
// 这个方法是扫码支付请求的方法 方法里有个判断
$input->GetTrade_type() == "NATIVE"
//这个NATIVE 是扫码支付的类型
// 我就在这个方法里的if判断又加了一个if判断
$input->GetTrade_type() == "APP"
//如果他等于APP的时候就让他再次发下请求 这样就可以得到参数了
$prepay_id = $result["prepay_id"];
//他所范围的参数最重要的为 prepay_id 需要再进行参数加密 进入 getOrder()进行加密
$response = $this->getOrder($prepay_id);
// correctStatus 此函数是我自定义的 跟APP对接的 json 数据 根据自己的实际情况 定义
$json = correctStatus($response);
//最后输出给 APP 就好了
echo $json;
//执行第二次签名,才能返回给客户端使用
public function getOrder($prepayId){
  $pay=\think\Db::name('pay_type')->where(['pay_id'=>2])->field('pay_json')->find();
  $wx=json_decode($pay['pay_json'],true);
  $data["appid"] = $wx['web_appid'];
  //createNoncestr 获取随机字符串 他写的demo里有方法 不过你也可以自定义
  $data["noncestr"] = $this->createNoncestr();
  $data["package"] = "Sign=WXPay";
  $data["partnerid"] = $wx['web_mch_id'];
  $data["prepayid"] = $prepayId;
  $data["timestamp"] = time();
  // 加密方法 getSign() 同样的 在他的demo 里也有方法  这些方法都再 WxPay.Data.php 这个文件里
  $s = $this->getSign($data,$wx['web_key']);
  $data["sign"] = $s;
  return $data;
}
//那些 appid key 什么的参数配置 我是直接在他的 WxPay.Config.php这个文件里写了个构造方法 直接赋值
private $appid;
private $mch_id;
private $key;
private $appsecret;
public function __construct()
{
    $pay=\think\Db::name('pay_type')->where(['pay_id'=>2])->field('pay_json')->find();
    $wx=json_decode($pay['pay_json'],true);
    $this->appid=$wx['web_appid'];
    $this->mch_id=$wx['web_mch_id'];
    $this->key=$wx['web_key'];
    $this->appsecret=$wx['web_appsecret'];
}

2.微信回调地址的处理

//因为我 在WxPay.Config.php文件里已经赋值给了 appid 所以 这边 new 一下 就会获取所有的配置参数
require_once "./payment/wxpay/php/lib/WxPay.Api.php";
require_once './payment/wxpay/php/lib/WxPay.Notify.php';
require_once './payment/wxpay/php/lib/WxPay.Data.php';
require_once "./payment/wxpay/php/example/WxPay.Config.php";
$config = new \WxPayConfig();
$notify = new \WxPayNotify();
$notify->Handle($config, false);
//存储微信的回调
$objData = $GLOBALS['HTTP_RAW_POST_DATA'];
//自定义日志 函数
log_result("【接收到的notify通知】:\n".$objData."\n");
$data=\WxPayResults::Init($config,$objData);
// $data = $objData->GetValues();
//TODO 1、进行参数校验
if(!array_key_exists("return_code", $data) || (array_key_exists("return_code", $data) && $data['return_code'] != "SUCCESS")) {
   //TODO失败,不是支付成功的通知
   //如果有需要可以做失败时候的一些清理处理,并且做一些监控
   $msg = "异常异常";
   log_result("【接收到的notify通知】:\n".$msg."\n");
   return false;
}
if(!array_key_exists("transaction_id", $data)){
   $msg = "输入参数不正确";
   log_result("【接收到的notify通知】:\n".$msg."\n");
   return false;
}
//这里可以多一步 参数 具体情况 自己定
//TODO 2、处理业务逻辑

以下就可以写 业余逻辑了

希望本文所述对大家基于ThinkPHP框架的PHP程序设计有所帮助。

PHP 相关文章推荐
PHP循环语句笔记(foreach,list)
Nov 29 PHP
php递归函数中使用return的注意事项
Jan 17 PHP
PHP中UNIX时间戳和日期间的转换与计算实例
Nov 19 PHP
php上传文件并存储到mysql数据库的方法
Mar 16 PHP
PHP经典面试题之设计模式(经常遇到)
Oct 15 PHP
php实现网站文件批量压缩下载功能
Oct 28 PHP
php 输出json及显示json中的中文汉字详解及实例
Nov 09 PHP
详谈php ip2long 出现负数的原因及解决方法
Apr 05 PHP
yii2.0整合阿里云oss上传单个文件的示例
Sep 19 PHP
PHP实现负载均衡下的session共用功能
Apr 17 PHP
Laravel关系模型指定条件查询方法
Oct 10 PHP
php字符串倒叙
Apr 01 PHP
php实现的支付宝网页支付功能示例【基于TP5框架】
Sep 16 #PHP
PHP实现的AES 128位加密算法示例
Sep 16 #PHP
Laravel项目中timeAgo字段语言转换的改善方法示例
Sep 16 #PHP
php解决crontab定时任务不能写入文件问题的方法分析
Sep 16 #PHP
PHP实现一个限制实例化次数的类示例
Sep 16 #PHP
thinkPHP5框架路由常用知识点汇总
Sep 15 #PHP
php项目中类的自动加载实例讲解
Sep 12 #PHP
You might like
ThinkPHP中自定义目录结构的设置方法
2014/08/15 PHP
PHP中if和or运行效率对比
2014/12/12 PHP
PHP访问Google Search API的方法
2015/03/05 PHP
基于php判断客户端类型
2016/10/14 PHP
使用phpQuery获取数组的实例
2017/03/13 PHP
PHP配合fiddler抓包抓取微信指数小程序数据的实现方法分析
2020/01/02 PHP
RGB颜色值转HTML十六进制(HEX)代码的JS函数
2009/04/25 Javascript
解决JQeury显示内容没有边距内容紧挨着浏览器边线
2013/12/20 Javascript
浅谈轻量级js模板引擎simplite
2015/02/13 Javascript
深入理解JavaScript系列(42):设计模式之原型模式详解
2015/03/04 Javascript
jquery.validate使用时遇到的问题
2015/05/25 Javascript
使用RequireJS优化JavaScript引用代码的方法
2015/07/01 Javascript
浅谈JavaScript中小数和大整数的精度丢失
2016/05/31 Javascript
微信小程序通过api接口将json数据展现到小程序示例
2017/01/20 Javascript
bootstrap datetimepicker控件位置异常的解决方法
2017/11/23 Javascript
Node.js进阶之核心模块https入门
2018/05/23 Javascript
使用纯前端JavaScript实现Excel导入导出方法过程详解
2020/08/07 Javascript
在vue中通过render函数给子组件设置ref操作
2020/11/17 Vue.js
Python中字典创建、遍历、添加等实用操作技巧合集
2015/06/02 Python
python爬取王者荣耀全皮肤的简单实现代码
2020/01/31 Python
Python脚本去除文件的只读性操作
2020/03/05 Python
Python爬虫获取页面所有URL链接过程详解
2020/06/04 Python
python实现mean-shift聚类算法
2020/06/10 Python
德国低价购买灯具和家具网站:Style-home.de
2016/11/25 全球购物
在网上学习全世界最好的课程:Coursera
2017/11/07 全球购物
用Python匹配HTML tag的时候,<.*>和<.*?>有什么区别
2012/11/04 面试题
护理专业学生的求职信范文
2013/12/11 职场文书
财务主管自我鉴定
2014/01/17 职场文书
分公司负责人任命书
2014/06/04 职场文书
安全资料员岗位职责范本
2014/06/28 职场文书
安全生产月宣传标语
2014/10/06 职场文书
董事长开业致辞
2015/07/29 职场文书
2017公司年会主持人开幕词
2016/03/04 职场文书
2019职场实习报告该怎么写?
2019/07/01 职场文书
python开发实时可视化仪表盘的示例
2021/05/07 Python
Spring Boot 的创建和运行示例代码详解
2022/07/23 Java/Android