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 相关文章推荐
FCKeditor的安装(PHP)
Jan 13 PHP
php 前一天或后一天的日期
Jun 28 PHP
php array_slice函数的使用以及参数详解
Aug 30 PHP
.htaccess文件保护实例讲解
Feb 06 PHP
浅析PHP安装扩展mcrypt以及相关依赖项(PHP安装PECL扩展的方法)
Jul 05 PHP
Zend studio文件注释模板设置方法
Sep 29 PHP
以文件形式缓存php变量的方法
Jun 26 PHP
php脚本守护进程原理与实现方法详解
Jul 20 PHP
PHP5.5基于mysqli连接MySQL数据库和读取数据操作实例详解
Feb 16 PHP
thinkPHP5使用Rabc实现权限管理
Aug 28 PHP
PHP实现长轮询消息实时推送功能代码实例讲解
Feb 26 PHP
详解Laravel制作API接口
May 31 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部分常见问题总结
2008/03/27 PHP
PHP将字符分解为多个字符串的方法
2014/11/22 PHP
YII Framework框架教程之缓存用法详解
2016/03/14 PHP
PHP实现的链式队列结构示例
2017/09/15 PHP
浅析PHP 中move_uploaded_file 上传中文文件名失败
2019/04/17 PHP
php实现快速对二维数组某一列进行组装的方法小结
2019/12/04 PHP
JS远程获取网页源代码实例
2013/09/05 Javascript
jQuery动态创建html元素的常用方法汇总
2014/09/05 Javascript
浅谈javascript的分号的使用
2015/05/12 Javascript
jQuery实现向下滑出的平滑下拉菜单效果
2015/08/21 Javascript
js格式化输入框内金额、银行卡号
2016/02/01 Javascript
node实现简单的反向代理服务器
2017/07/26 Javascript
分析JavaScript数组操作难点
2017/12/18 Javascript
vue-cli 打包使用history模式的后端配置实例
2018/09/20 Javascript
JS实现拼图游戏
2021/01/29 Javascript
ant design vue中日期选择框混合时间选择器的用法说明
2020/10/27 Javascript
Python os模块学习笔记
2015/06/21 Python
Python列表推导式与生成器表达式用法示例
2018/02/08 Python
运用TensorFlow进行简单实现线性回归、梯度下降示例
2018/03/05 Python
Python PyQt4实现QQ抽屉效果
2018/04/20 Python
Python使用字典实现的简单记事本功能示例
2019/08/15 Python
Pycharm 2019 破解激活方法图文详解
2019/10/11 Python
opencv-python 读取图像并转换颜色空间实例
2019/12/09 Python
Python使用tkinter制作在线翻译软件
2021/02/22 Python
解决CSS3的opacity属性带来的层叠顺序问题
2016/05/09 HTML / CSS
广州品高软件.net笔面试题目
2012/04/18 面试题
关于是否需要写商业计划书
2014/02/07 职场文书
市级青年文明号申报材料
2014/05/26 职场文书
公务员培的训心得体会
2014/09/01 职场文书
领导干部作风整顿个人剖析材料
2014/10/11 职场文书
物业客服专员岗位职责
2015/04/07 职场文书
工程部岗位职责范本
2015/04/11 职场文书
2015年手术室工作总结
2015/05/11 职场文书
2015年教师业务工作总结
2015/05/26 职场文书
2016年党员创先争优公开承诺书
2016/03/25 职场文书
Mysql Show Profile
2021/04/05 MySQL