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 中文和编码判断代码
May 16 PHP
WIN8.1下搭建PHP5.6环境
Apr 29 PHP
PHP+AJAX实现投票功能的方法
Sep 28 PHP
php封装的表单验证类完整实例
Oct 19 PHP
浅谈php中的循环while、do...while、for、foreach四种循环
Nov 05 PHP
PHP/HTML混写的四种方式总结
Feb 27 PHP
OAuth认证协议中的HMACSHA1加密算法(实例)
Oct 25 PHP
PHP实现基于图的深度优先遍历输出1,2,3...n的全排列功能
Nov 10 PHP
PHP聊天室简单实现方法详解
Dec 08 PHP
使用PHP反射机制来构造"CREATE TABLE"的sql语句
Mar 21 PHP
ThinkPHP3.2框架操作Redis的方法分析
May 05 PHP
基于PHP实现解密或加密Cloudflar邮箱保护
Jun 24 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重定向的三种方法分享
2012/02/22 PHP
redirect_uri参数错误的解决方法(必看)
2017/02/16 PHP
showModelessDialog()使用详解
2006/09/07 Javascript
javascript globalStorage类代码
2009/06/04 Javascript
Jquery Validation插件防止重复提交表单的解决方法
2010/03/05 Javascript
js 纯数字不重复排列的另类方法
2010/07/17 Javascript
100个不能错过的实用JS自定义函数
2014/03/05 Javascript
用jquery写的菜单从左往右滑动出现
2014/04/11 Javascript
深入解析JavaScript编程中的this关键字使用
2015/11/09 Javascript
AngularJs  E2E Testing 详解
2016/09/02 Javascript
jQuery删除节点用法示例(remove方法)
2016/09/08 Javascript
Vue2.5 结合 Element UI 之 Table 和 Pagination 组件实现分页功能
2018/01/26 Javascript
jQuery+vue.js实现的多选下拉列表功能示例
2019/01/15 jQuery
vue响应式更新机制及不使用框架实现简单的数据双向绑定问题
2019/06/27 Javascript
JS运算符简单用法示例
2020/01/19 Javascript
[01:40]2014DOTA2国际邀请赛 三冰SOLO赛后采访恶搞
2014/07/09 DOTA
Python 内置函数complex详解
2016/10/23 Python
简单谈谈python基本数据类型
2018/09/26 Python
python将.ppm格式图片转换成.jpg格式文件的方法
2018/10/27 Python
Python Series从0开始索引的方法
2018/11/06 Python
Python实现点云投影到平面显示
2020/01/18 Python
tensorflow指定GPU与动态分配GPU memory设置
2020/02/03 Python
Python while循环使用else语句代码实例
2020/02/07 Python
Python 线性回归分析以及评价指标详解
2020/04/02 Python
Django多个app urls配置代码实例
2020/11/26 Python
Python基础进阶之海量表情包多线程爬虫功能的实现
2020/12/17 Python
用HTML5 实现橡皮擦的涂抹效果的教程
2015/05/11 HTML / CSS
HTML5 History API 实现无刷新跳转
2016/01/11 HTML / CSS
英国舒适型鞋履品牌:FitFlop
2017/05/17 全球购物
C语言怎样定义和声明全局变量和函数最好
2013/11/26 面试题
列车长先进事迹材料
2014/01/25 职场文书
消防应急演练方案
2014/02/12 职场文书
2014年妇幼卫生工作总结
2014/12/09 职场文书
故宫的导游词
2015/01/31 职场文书
上市公司财务总监岗位职责
2015/04/03 职场文书
2022新作动画《福星小子》释出宣传影片 加入内田真礼&宫野真守配音演出
2022/04/08 日漫