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 相关文章推荐
在PHP3中实现SESSION的功能(二)
Oct 09 PHP
linux php mysql数据库备份实现代码
Mar 10 PHP
php入门学习知识点四 PHP正则表达式基本应用
Jul 14 PHP
Server.HTMLEncode让代码在页面里显示为源代码
Dec 08 PHP
php实现文件下载实例分享
Jun 02 PHP
PHP根据传来的16进制颜色代码自动改变背景颜色
Jun 13 PHP
php创建session的方法实例详解
Jan 27 PHP
WordPress后台中实现图片上传功能的实例讲解
Jan 11 PHP
PHP Filter过滤器全面解析
Aug 09 PHP
PHP Header用于页面跳转时的几个注意事项
Oct 21 PHP
PHP 根据key 给二维数组分组
Dec 09 PHP
thinkPHP5使用Rabc实现权限管理
Aug 28 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 Ubb代码编辑器函数代码
2012/07/05 PHP
PHP使用pcntl_fork实现多进程下载图片的方法
2014/12/16 PHP
PHP工程师VIM配置分享
2015/12/15 PHP
PHP正则删除HTML代码中宽高样式的方法
2017/06/12 PHP
Laravel5.3+框架定义API路径取消CSRF保护方法详解
2020/04/06 PHP
Js的MessageBox
2006/12/03 Javascript
让FireFox支持innerText的实现代码
2009/12/01 Javascript
JS控件的生命周期介绍
2012/10/22 Javascript
jQuery 追加元素的方法如append、prepend、before
2014/01/16 Javascript
js编写一个简单的产品放大效果代码
2016/06/27 Javascript
Select下拉框模糊查询功能实现代码
2016/07/22 Javascript
Vue 滚动行为的具体使用方法
2017/09/13 Javascript
JS表单传值和URL编码转换
2018/03/03 Javascript
原生js实现淘宝放大镜效果
2020/10/28 Javascript
layui的表单提交以及验证和修改弹框的实例
2019/09/09 Javascript
[01:35]辉夜杯战队访谈宣传片—LGD
2015/12/25 DOTA
简单的抓取淘宝图片的Python爬虫
2014/12/25 Python
python实现根据月份和日期得到星座的方法
2015/03/27 Python
python使用socket向客户端发送数据的方法
2015/04/29 Python
python3实现全角和半角字符转换的方法示例
2017/09/21 Python
python文件名和文件路径操作实例
2017/09/29 Python
python使用正则表达式替换匹配成功的组并输出替换的次数
2017/11/22 Python
对python添加模块路径的三种方法总结
2018/10/16 Python
对Python的多进程锁的使用方法详解
2019/02/18 Python
python对execl 处理操作代码
2020/06/22 Python
一款纯css3制作的2015年元旦雪人动画特效教程
2014/12/29 HTML / CSS
canvas实现二维码和图片合成的示例代码
2018/08/01 HTML / CSS
Currentbody澳大利亚:美容仪专家
2019/11/11 全球购物
小学优秀班集体申报材料
2014/05/25 职场文书
销售目标责任书
2014/07/23 职场文书
践行党的群众路线心得体会
2014/11/05 职场文书
2014年党务工作总结
2014/11/25 职场文书
2015新学期校长寄语(3篇)
2015/03/25 职场文书
单方投资意向书
2015/05/11 职场文书
刑事上诉状范文
2015/05/22 职场文书
CSS 实现磨砂玻璃(毛玻璃)效果样式
2023/05/21 HTML / CSS