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 相关文章推荐
vBulletin Forum 2.3.xx SQL Injection
Oct 09 PHP
PHP发明人谈MVC和网站设计架构 貌似他不支持php用mvc
Jun 04 PHP
php若干单维数组遍历方法的比较
Sep 20 PHP
PHP防CC攻击实现代码
Dec 29 PHP
php DOS攻击实现代码(附如何防范)
May 29 PHP
编写Smarty插件在模板中直接加载数据的详细介绍
Jun 26 PHP
php使用类继承解决代码重复的问题
Feb 11 PHP
用php来限制每个ip每天浏览页面数量的实现思路
Feb 24 PHP
用php代码限制国内IP访问我们网站
Sep 26 PHP
PHP对象克隆clone用法示例
Sep 28 PHP
详解PHP处理字符串类似indexof的方法函数
Jun 11 PHP
PHP文件类型检查及fileinfo模块安装使用详解
May 09 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
成本8450万,票房仅2亿,口碑两极分化,又一部DC电影扑街了
2020/04/09 欧美动漫
使用PHP备份MYSQL数据的多种方法
2014/01/15 PHP
php的declare控制符和ticks教程(附示例)
2014/03/21 PHP
PHP 9 大缓存技术总结
2015/09/17 PHP
PHP基于curl后台远程登录正方教务系统的方法
2016/10/14 PHP
php解决DOM乱码的方法示例代码
2016/11/20 PHP
Javascript 获取字符串字节数的多种方法
2009/06/02 Javascript
jQuery第三课 修改元素属性及内容的代码
2010/03/14 Javascript
始终在屏幕中间显示Div的代码(css+js)
2011/03/10 Javascript
node.js入门教程迷你书、node.js入门web应用开发完全示例
2014/04/06 Javascript
jQuery+PHP打造滑动开关效果
2014/12/16 Javascript
javascript判断css3动画结束 css3动画结束的回调函数
2015/03/10 Javascript
详解JavaScript中的blink()方法的使用
2015/06/08 Javascript
javascript中的altKey 和 Event属性大全
2015/11/06 Javascript
第一次动手实现bootstrap table分页效果
2016/09/22 Javascript
Bootstrap的class样式小结
2016/12/01 Javascript
vue修改对象的属性值后页面不重新渲染的实例
2018/08/09 Javascript
vue打包使用Nginx代理解决跨域问题
2018/08/27 Javascript
基于vue实现移动端圆形旋钮插件效果
2018/11/28 Javascript
通过实践编写优雅的JavaScript代码
2019/05/30 Javascript
用webpack4开发小程序的实现方法
2019/06/04 Javascript
详解vue项目中实现图片裁剪功能
2019/06/07 Javascript
如何在微信小程序中实现Mixins方案
2019/06/20 Javascript
Node.js API详解之 assert模块用法实例分析
2020/05/26 Javascript
关于vue 结合原生js 解决echarts resize问题
2020/07/26 Javascript
【Python】Python的urllib模块、urllib2模块批量进行网页下载文件
2016/11/19 Python
PyQt5内嵌浏览器注入JavaScript脚本实现自动化操作的代码实例
2019/02/13 Python
python中break、continue 、exit() 、pass终止循环的区别详解
2019/07/08 Python
python 项目目录结构设置
2020/02/14 Python
解决virtualenv -p python3 venv报错的问题
2021/02/05 Python
Europcar葡萄牙:葡萄牙汽车和货车租赁
2017/10/13 全球购物
C#面试题
2016/05/06 面试题
党的群众路线教育实践活动心得体会(乡镇)
2014/11/03 职场文书
论语读书笔记
2015/06/26 职场文书
如何用threejs实现实时多边形折射
2021/05/07 Javascript
使用 Apache Superset 可视化 ClickHouse 数据的两种方法
2021/07/07 Servers