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生成html分页列表的代码
Mar 18 PHP
PHP之数组学习
May 29 PHP
php提示Call-time pass-by-reference has been deprecated in的解决方法[已测]
May 06 PHP
浅析PHP原理之变量分离/引用(Variables Separation)
Aug 09 PHP
用PHP解决的一个栈的面试题
Jul 02 PHP
Java中final关键字详解
Aug 10 PHP
PHP实现上传多文件示例代码
Feb 20 PHP
php支付宝系列之电脑网站支付
May 30 PHP
php学习笔记之字符串常见操作总结
Jul 16 PHP
ThinkPHP3.1.2 使用cli命令行模式运行的方法
Apr 14 PHP
PHP SESSION跨页面传递失败解决方案
Dec 11 PHP
PHP使用QR Code生成二维码实例
Jul 07 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
咖啡因含量是由谁决定的?低因咖啡怎么来?低因咖啡适合什么人喝
2021/03/06 新手入门
PHP+MYSQL开发工具及资源收藏
2007/01/02 PHP
PHP中使用imagick实现把PDF转成图片
2015/01/26 PHP
php可应用于面包屑导航的递归寻找家谱树实现方法
2015/02/02 PHP
php支付宝APP支付功能
2020/07/29 PHP
基于laravel Request的所有方法详解
2019/09/29 PHP
JavaScript CSS修改学习第六章 拖拽
2010/02/19 Javascript
JS随即打乱数组实现代码
2012/12/03 Javascript
js从外部获取图片的实现方法
2016/08/05 Javascript
JavaScript中cookie工具函数封装的示例代码
2016/10/11 Javascript
JS实现焦点图轮播效果的方法详解
2016/12/19 Javascript
Bootstrap中datetimepicker使用小结
2016/12/28 Javascript
canvas实现十二星座星空图
2017/02/14 Javascript
正则验证小数点后面只能有两位数的方法
2017/02/28 Javascript
JavaScript获取URL参数的方法之一
2017/03/24 Javascript
jQuery插件imgAreaSelect基础讲解
2017/05/26 jQuery
nodejs操作mysql实现增删改查的实例
2017/05/28 NodeJs
vue+mockjs模拟数据实现前后端分离开发的实例代码
2017/08/08 Javascript
JavaScript继承与聚合实例详解
2019/01/22 Javascript
js实现继承的方法及优缺点总结
2019/05/08 Javascript
小程序实现悬浮搜索框
2019/07/12 Javascript
Js代码中的span拼接问题解决
2019/11/22 Javascript
Element el-button 按钮组件的使用详解
2021/02/01 Javascript
Python处理菜单消息操作示例【基于win32ui模块】
2018/05/09 Python
pandas.read_csv参数详解(小结)
2019/06/21 Python
使用APScheduler3.0.1 实现定时任务的方法
2019/07/22 Python
python dumps和loads区别详解
2020/02/04 Python
基于python爬取有道翻译过程图解
2020/03/31 Python
详解css3自定义滚动条样式写法
2017/12/25 HTML / CSS
SheIn俄罗斯:时尚女装网上商店
2017/02/28 全球购物
波兰办公用品和学校用品在线商店:Dlabiura24.pl
2020/11/18 全球购物
联强国际笔试题面试题
2013/07/10 面试题
请用Java实现列出某个目录下的所有文件
2013/09/23 面试题
个人先进事迹总结
2015/02/26 职场文书
公司清洁工岗位职责
2015/04/15 职场文书
Nginx使用ngx_http_upstream_module实现负载均衡功能示例
2022/08/05 Servers