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 相关文章推荐
15种PHP Encoder的比较
Apr 17 PHP
php防攻击代码升级版
Dec 29 PHP
php设计模式 Mediator (中介者模式)
Jun 26 PHP
奉献出一个封装的curl函数 便于调用(抓数据专用)
Jul 22 PHP
PHP中把对象数组转换成普通数组的方法
Jul 10 PHP
PHP5.3新特性小结
Feb 14 PHP
LINUX下PHP程序实现WORD文件转化为PDF文件的方法
May 13 PHP
yum命令安装php7和相关扩展
Jul 04 PHP
PHP实现支付宝即时到账功能
Dec 21 PHP
thinkphp3.2.0 setInc方法 源码全面解析
Jan 29 PHP
php输出文字乱码的解决方法
Oct 04 PHP
如何用PHP实现多线程编程
May 26 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
php Calender(日历)代码分享
2014/01/03 PHP
PHP文件缓存内容保存格式实例分析
2014/08/20 PHP
在Laravel框架里实现发送邮件实例(邮箱验证)
2016/05/20 PHP
用HTML/JS/PHP方式实现页面延时跳转的简单实例
2016/07/18 PHP
最简单的jQuery程序 入门者学习
2009/07/09 Javascript
jQuery的实现原理的模拟代码 -3 事件处理
2010/08/03 Javascript
js判断是否为数组的函数: isArray()
2011/10/30 Javascript
用jquery实现输入框获取焦点消失文字
2013/04/27 Javascript
js实现iframe跨页面调用函数的方法
2014/12/13 Javascript
基于jQuery倾斜打开侧边栏菜单特效代码
2015/09/15 Javascript
学习JavaScript正则表达式
2015/11/13 Javascript
理解javascript定时器中的setTimeout与setInterval
2016/02/23 Javascript
Vue 2.x教程之基础API
2017/03/06 Javascript
详解NodeJS框架express的路径映射(路由)功能及控制
2017/03/24 NodeJs
JS实现匀加速与匀减速运动的方法示例
2017/09/04 Javascript
jQuery实现动态加载select下拉列表项功能示例
2018/05/31 jQuery
vue实现前台列表数据过滤搜索、分页效果
2019/05/28 Javascript
微信小程序在ios下Echarts图表不能滑动的问题解决
2019/07/10 Javascript
VUE DEMO之模拟登录个人中心页面之间数据传值实例
2019/10/31 Javascript
vue路由跳转传递参数的方式总结
2020/05/10 Javascript
Node.js 深度调试方法解析
2020/07/28 Javascript
JavaScript常用8种数组去重代码实例
2020/09/09 Javascript
微信小程序接入vant Weapp组件的详细步骤
2020/10/28 Javascript
win10下python3.5.2和tensorflow安装环境搭建教程
2018/09/19 Python
Python获取excel内容及相关操作代码实例
2020/08/10 Python
html2canvas生成的图片偏移不完整的解决方法
2020/05/19 HTML / CSS
运动鞋、足球鞋和慕尼黑球衣:Sport Münzinger
2019/08/26 全球购物
Lovedrobe官网:英国领先的大码服装品牌
2019/09/19 全球购物
商场活动策划方案
2014/01/24 职场文书
学校对教师的评语
2014/04/28 职场文书
党员教师一句话承诺
2014/05/30 职场文书
共产党员批评与自我批评
2014/10/15 职场文书
家庭财产分割协议范文
2014/11/24 职场文书
宝葫芦的秘密观后感
2015/06/11 职场文书
银行安全保卫工作总结
2015/08/10 职场文书
导游词之海南-南湾猴岛
2019/10/12 职场文书