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 相关文章推荐
攻克CakePHP系列一 连接MySQL数据库
Oct 22 PHP
PHP 加密解密内部算法
Apr 22 PHP
windows下开发并编译PHP扩展的方法
Mar 18 PHP
抓取并下载CSS中所有图片文件的php代码
Sep 26 PHP
mantis安装、配置和使用中的问题小结
Jul 14 PHP
简单谈谈php延迟静态绑定
Jan 26 PHP
php微信公众号开发(4)php实现自定义关键字回复
Dec 15 PHP
PHP面相对象中的重载与重写
Feb 13 PHP
redirect_uri参数错误的解决方法(必看)
Feb 16 PHP
PHP+MySQL实现消息队列的方法分析
May 09 PHP
PHP实现数组转JSon和JSon转数组的方法示例
Jun 14 PHP
ThinkPHP 框架实现的读取excel导入数据库操作示例
Apr 14 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/23 PHP
深入了解PHP类Class的概念
2012/06/14 PHP
PHP模板引擎Smarty的缓存使用总结
2014/04/24 PHP
自己写的php中文截取函数mb_strlen和mb_substr
2015/02/09 PHP
CentOS安装php v8js教程
2015/02/26 PHP
Yii中CArrayDataProvider和CActiveDataProvider区别实例分析
2016/03/02 PHP
jQuery去掉字符串起始和结尾的空格(多种方法实现)
2013/04/01 Javascript
JQuery表格拖动调整列宽效果(自己动手写的)
2014/09/01 Javascript
js实现随机抽选效果、随机抽选红色球效果
2017/01/13 Javascript
RequireJS 依赖关系的实例(推荐)
2017/01/21 Javascript
理解Angular的providers给Http添加默认headers
2017/07/04 Javascript
详解在Vue中如何使用axios跨域访问数据
2017/07/07 Javascript
原生JS实现移动端web轮播图详解(结合Tween算法造轮子)
2017/09/10 Javascript
angular中不同的组件间传值与通信的方法
2017/11/04 Javascript
JavaScript检查数据中是否存在相同的元素(两种方法)
2018/10/07 Javascript
微信小程序实现banner图轮播效果
2020/06/28 Javascript
详解Vue-cli3 项目在安卓低版本系统和IE上白屏问题解决
2019/04/14 Javascript
每周一练 之 数据结构与算法(Stack)
2019/04/16 Javascript
使用layui 的layedit定义自己的toolbar方法
2019/09/18 Javascript
详解如何在Vue项目中发送jsonp请求
2019/10/25 Javascript
python小技巧之批量抓取美女图片
2014/06/06 Python
记录Django开发心得
2014/07/16 Python
Python实现替换文件中指定内容的方法
2018/03/19 Python
django 类视图的使用方法详解
2019/07/24 Python
Pycharm 如何一键加引号的方法步骤
2021/02/05 Python
HTML5是什么 HTML5是什么意思 HTML5简介
2012/10/26 HTML / CSS
美国百年历史早餐食品供应商:Wolferman’s
2017/01/18 全球购物
Urban Outfitters德国官网:美国跨国生活方式零售公司
2018/05/21 全球购物
在使用非全零作为空指针内部表达的机器上, NULL是如何定义
2014/11/09 面试题
护士思想汇报
2014/01/12 职场文书
四年级学生评语大全
2014/04/21 职场文书
2014党员自我评议表范文
2014/09/20 职场文书
2014年企业员工工作总结
2014/12/09 职场文书
材料员岗位职责范本
2015/04/11 职场文书
2015社区六五普法工作总结
2015/04/21 职场文书
小学四年级作文之写景
2019/08/23 职场文书