当前位置:首页 > PHP教程 > php高级应用 > 列表

PHP实现的微信APP支付功能示例【基于TP5框架】

发布:smiling 来源: PHP粉丝网  添加日期:2021-12-18 21:25:40 浏览: 评论:0 

本文实例讲述了PHP实现的微信APP支付功能,分享给大家供大家参考,具体如下:

1.进行支付请求 他给的DEMO 用的时候有时候会报错

1)我遇到的情况 把  WxPay.Api.php这个文件的 postXmlCurl 这个 方法里

  1. //   curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,TRUE); 
  2. //  curl_setopt($ch,CURLOPT_SSL_VERIFYHOST,2);//严格校验 
  3. curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,FALSE); 
  4. curl_setopt($ch,CURLOPT_SSL_VERIFYHOST,FALSE); 

这两行的严格验证给注掉

2)有时候还会报终端IP错误  我的修改方案是 要么写死 要么注掉 他不是必填参数

3)有时候还会报写入 日志文件 包含错误  把他的相对路径改成绝对路径就好了

4)以下就是APP请求参数

  1. require_once "./payment/wxpay/php/lib/WxPay.Api.php"
  2. require_once "./payment/wxpay/php/example/WxPay.NativePay.php"
  3. $notify = new \NativePay(); 
  4. $input = new \WxPayUnifiedOrder(); 
  5. $input->SetBody("购买订单"); 
  6. $input->SetOut_trade_no($order_data['order_number']); 
  7. $input->SetTotal_fee($zongMoney*100); 
  8. $input->SetNonce_str($this->createNoncestr()); 
  9. $input->SetNotify_url(config('u_wx_notify_url')); 
  10. $input->SetTrade_type('APP'); 
  11. $input->SetProduct_id(rand(10000,99999)); 
  12. $result = $notify->GetPayUrl($input); 
  13. //我还遇到了 $result 返回值为空 也不报错 
  14. // 然后我发现是因为我用的请求方法为 GetPayUrl() 
  15. // 这个方法是扫码支付请求的方法 方法里有个判断 
  16. $input->GetTrade_type() == "NATIVE" 
  17. //这个NATIVE 是扫码支付的类型 
  18. // 我就在这个方法里的if判断又加了一个if判断 
  19. $input->GetTrade_type() == "APP" 
  20. //如果他等于APP的时候就让他再次发下请求 这样就可以得到参数了 
  21. $prepay_id = $result["prepay_id"]; 
  22. //他所范围的参数最重要的为 prepay_id 需要再进行参数加密 进入 getOrder()进行加密 
  23. $response = $this->getOrder($prepay_id); 
  24. // correctStatus 此函数是我自定义的 跟APP对接的 json 数据 根据自己的实际情况 定义 
  25. $json = correctStatus($response); 
  26. //最后输出给 APP 就好了 
  27. echo $json
  28.  
  29. //执行第二次签名,才能返回给客户端使用 
  30. public function getOrder($prepayId){ 
  31.   $pay=\think\Db::name('pay_type')->where(['pay_id'=>2])->field('pay_json')->find(); 
  32.   $wx=json_decode($pay['pay_json'],true); 
  33.   $data["appid"] = $wx['web_appid']; 
  34.   //createNoncestr 获取随机字符串 他写的demo里有方法 不过你也可以自定义 
  35.   $data["noncestr"] = $this->createNoncestr(); 
  36.   $data["package"] = "Sign=WXPay"
  37.   $data["partnerid"] = $wx['web_mch_id']; 
  38.   $data["prepayid"] = $prepayId
  39.   $data["timestamp"] = time(); 
  40.   // 加密方法 getSign() 同样的 在他的demo 里也有方法  这些方法都再 WxPay.Data.php 这个文件里 
  41.   $s = $this->getSign($data,$wx['web_key']); 
  42.   $data["sign"] = $s
  43.   return $data

那些 appid key 什么的参数配置 我是直接在他的 WxPay.Config.php这个文件里写了个构造方法 直接赋值

  1. private $appid
  2. private $mch_id
  3. private $key
  4. private $appsecret
  5. public function __construct() 
  6.     $pay=\think\Db::name('pay_type')->where(['pay_id'=>2])->field('pay_json')->find(); 
  7.     $wx=json_decode($pay['pay_json'],true); 
  8.     $this->appid=$wx['web_appid']; 
  9.     $this->mch_id=$wx['web_mch_id']; 
  10.     $this->key=$wx['web_key']; 
  11.     $this->appsecret=$wx['web_appsecret']; 

2.微信回调地址的处理

因为我 在WxPay.Config.php文件里已经赋值给了 appid 所以 这边 new 一下 就会获取所有的配置参数。

  1. require_once "./payment/wxpay/php/lib/WxPay.Api.php"
  2. require_once './payment/wxpay/php/lib/WxPay.Notify.php'
  3. require_once './payment/wxpay/php/lib/WxPay.Data.php'
  4. require_once "./payment/wxpay/php/example/WxPay.Config.php"
  5. $config = new \WxPayConfig(); 
  6. $notify = new \WxPayNotify(); 
  7. $notify->Handle($config, false); 
  8. //存储微信的回调 
  9. $objData = $GLOBALS['HTTP_RAW_POST_DATA']; 
  10. //自定义日志 函数 
  11. log_result("【接收到的notify通知】:\n".$objData."\n"); 
  12. $data=\WxPayResults::Init($config,$objData); 
  13. // $data = $objData->GetValues(); 
  14. //TODO 1、进行参数校验 
  15. if(!array_key_exists("return_code"$data) || (array_key_exists("return_code"$data) && $data['return_code'] != "SUCCESS")) { 
  16.    //TODO失败,不是支付成功的通知 
  17.    //如果有需要可以做失败时候的一些清理处理,并且做一些监控 
  18.    $msg = "异常异常"
  19.    log_result("【接收到的notify通知】:\n".$msg."\n"); 
  20.    return false; 
  21. if(!array_key_exists("transaction_id"$data)){ 
  22.    $msg = "输入参数不正确"
  23.    log_result("【接收到的notify通知】:\n".$msg."\n"); 
  24.    return false; 

这里可以多一步 参数 具体情况 自己定

TODO 2、处理业务逻辑

以下就可以写 业余逻辑了

Tags: PHP微信APP支付

分享到: