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如何编写易读的代码
Jul 10 PHP
解决phpmyadmin中缺少mysqli扩展问题的方法
May 06 PHP
php var_export与var_dump 输出的不同
Aug 09 PHP
php中try catch捕获异常实例详解
Nov 21 PHP
php使用cookie实现记住登录状态
Apr 27 PHP
PHP YII框架开发小技巧之模型(models)中rules自定义验证规则
Nov 16 PHP
php实现异步数据调用的方法
Dec 24 PHP
PHP实现查询两个数组中不同元素的方法
Feb 23 PHP
PHP弱类型的安全问题详细总结
Sep 25 PHP
php使用Jpgraph创建3D饼形图效果示例
Feb 15 PHP
php+js实现裁剪任意形状图片
Oct 31 PHP
PHP实现创建一个RPC服务操作示例
Feb 23 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
从C/C++迁移到PHP——判断字符类型的函数
2006/10/09 PHP
关于php连接mssql:pdo odbc sql server
2011/07/20 PHP
PHP5下$_SERVER变量不再受magic_quotes_gpc保护的弥补方法
2012/10/31 PHP
php动态生成函数示例
2014/03/21 PHP
PHP实现生成模糊图片的方法示例
2017/12/21 PHP
php记录搜索引擎爬行记录的实现代码
2018/03/02 PHP
PHP htmlspecialchars() 函数实例代码及用法大全
2018/09/18 PHP
jQuery的学习步骤
2011/02/23 Javascript
使用 JScript 创建 .exe 或 .dll 文件的方法
2011/07/13 Javascript
JavaScript实现拼音排序的方法
2012/11/20 Javascript
jQuery获取和设置表单元素的方法
2014/02/14 Javascript
javascript页面上使用动态时间具体实现
2014/03/18 Javascript
JQuery解析HTML、JSON和XML实例详解
2014/03/29 Javascript
js中substring和substr的定义和用法
2014/05/05 Javascript
JavaScript使用cookie记录临时访客信息的方法
2015/04/07 Javascript
Node.JS更改Windows注册表Regedit的方法小结
2017/08/18 Javascript
javascript观察者模式实现自动刷新效果
2017/09/05 Javascript
JS库particles.js创建超炫背景粒子插件(附源码下载)
2017/09/13 Javascript
Node.js学习之地址解析模块URL的使用详解
2017/09/28 Javascript
H5实现仿flash效果的实现代码
2017/09/29 Javascript
详解react内联样式使用webpack将px转rem
2018/09/13 Javascript
浅谈Python中列表生成式和生成器的区别
2015/08/03 Python
python django 增删改查操作 数据库Mysql
2017/07/27 Python
python的文件操作方法汇总
2017/11/10 Python
Python使用pandas处理CSV文件的实例讲解
2018/06/22 Python
纯用NumPy实现神经网络的示例代码
2018/10/24 Python
django实现模型字段动态choice的操作
2020/04/01 Python
python实现单机五子棋
2020/08/28 Python
HTML5 Canvas实现文本对齐的方法总结
2016/03/24 HTML / CSS
什么是属性访问器
2015/10/26 面试题
《水浒传》读后感3篇(范文)
2019/09/19 职场文书
导游词之京东大峡谷旅游区
2019/10/29 职场文书
Python自动化测试PO模型封装过程详解
2021/06/22 Python
mysql 数据插入优化方法之concurrent_insert
2021/07/01 MySQL
PostgreSQL数据库创建并使用视图以及子查询
2022/04/11 PostgreSQL
keepalived + nginx 实现高可用方案
2022/12/24 Servers