微信小程序支付 后端PHP

前端:比较简单,在对应的支付事件上进行网络请求就好:

微信小程序支付 后端PHP(二)

[javascript]  view plain  copy
  1. view_moneysure:function(){  
  2.   
  3.   var code = this.data.code;  
  4.   console.log('code是' +code)  
  5.   wx.request({  
  6.     url: 'https://...com/pay.php',//这个链接是后端写的  
  7.     header: {  
  8.       'Content-Type''application/x-www-form-urlencoded'  
  9.     },  
  10.     data: {  
  11.       code: code,  
  12.     },  
  13.     method: 'POST',   
  14.     success: function (response) {  
  15.       console.log( response.data);  
  16.       // 发起支付  
  17.       wx.requestPayment({  
  18.         'appId': response.data.appId,  
  19.         'timeStamp': response.data.timeStamp,  
  20.         'nonceStr': response.data.nonceStr,  
  21.         'package': response.data.package,  
  22.         'signType''MD5',  
  23.         'paySign': response.data.paySign,  
  24.         'success'function (res) {  
  25.           wx.showToast({  
  26.               title: '支付成功'  
  27.           });  
  28.           console.log(res);  
  29.         },  
  30.         'fail'function (res) {  
  31.           console.log(res)  
  32.         }  
  33.       });  
  34.     },  
  35.     fail: function (res) {  
  36.       console.log(res)  
  37.     }  
  38.   })  
  39. },  
后端代码:

1. pay.php //小程序请求的后端地址

[php]  view plain  copy
  1. <?php  
  2. /** 
  3.  * Created by PhpStorm. 
  4.  * User: UFO 
  5.  * Date: 17/7/18 
  6.  * Time: 下午5:31 
  7.  */  
  8. require_once  ('WxPay.Api.php');  
  9.   
  10. class WXPay  {  
  11.     function index() {  
  12.         //         初始化值对象  
  13.         $input = new WxPayUnifiedOrder();  
  14.         //         文档提及的参数规范:商家名称-销售商品类目  
  15.         $input->SetBody("testceshi");  
  16.         //         订单号应该是由小程序端传给服务端的,在用户下单时即生成,demo中取值是一个生成的时间戳  
  17.         $input->SetOut_trade_no(time().'');  
  18.         //         费用应该是由小程序端传给服务端的,在用户下单时告知服务端应付金额,demo中取值是1,即1分钱  
  19.         $input->SetTotal_fee("1");  
  20.         $input->SetNotify_url("https://...com/notify.php");//需要自己写的notify.php  
  21.         $input->SetTrade_type("JSAPI");  
  22.         //         由小程序端传给后端或者后端自己获取,写自己获取到的,  
  23.         $input->SetOpenid('UdhncondJcnkJnjknkcssdcAbckn');  
  24.         //$input->SetOpenid($this->getSession()->openid);  
  25.         //         向微信统一下单,并返回order,它是一个array数组  
  26.         $order = WxPayApi::unifiedOrder($input);  
  27.         //         json化返回给小程序端  
  28.         header("Content-Type: application/json");  
  29.         echo $this->getJsApiParameters($order);  
  30.     }  
  31.   
  32.     private function getJsApiParameters($UnifiedOrderResult)  
  33.     {    //判断是否统一下单返回了prepay_id  
  34.         if(!array_key_exists("appid"$UnifiedOrderResult)  
  35.             || !array_key_exists("prepay_id"$UnifiedOrderResult)  
  36.             || $UnifiedOrderResult['prepay_id'] == "")  
  37.         {  
  38.             throw new WxPayException("参数错误");  
  39.         }  
  40.         $jsapi = new WxPayJsApiPay();  
  41.         $jsapi->SetAppid($UnifiedOrderResult["appid"]);  
  42.         $timeStamp = time();  
  43.         $jsapi->SetTimeStamp("$timeStamp");  
  44.         $jsapi->SetNonceStr(WxPayApi::getNonceStr());  
  45.         $jsapi->SetPackage("prepay_id=" . $UnifiedOrderResult['prepay_id']);  
  46.         $jsapi->SetSignType("MD5");  
  47.         $jsapi->SetPaySign($jsapi->MakeSign());  
  48.         $parameters = json_encode($jsapi->GetValues());  
  49.         return $parameters;  
  50.     }  
  51. //这里是服务器端获取openid的函数  
  52. //    private function getSession() {  
  53. //        $code = $this->input->post('code');  
  54. //        $url = 'https://api.weixin.qq.com/sns/jscode2session?appid='.WxPayConfig::APPID.'&secret='.WxPayConfig::APPSECRET.'&js_code='.$code.'&grant_type=authorization_code';  
  55. //        $response = json_decode(file_get_contents($url));  
  56. //        return $response;  
  57. //    }  
  58. }  
  59. $WxPay = new WXPay();  
  60. $WxPay->index();  

2.  微信SDK 下载链接: https://pay.weixin.qq.com/wiki/doc/api/download/WxpayAPI_php_v3.zip

 解压在lib文件夹下可以看到:


放到服务端可访问的目录下。

WxPayConfig.php里面配置账号信息:

扫描二维码关注公众号,回复: 1483579 查看本文章

[php]  view plain  copy
  1. class WxPayConfig  
  2. {  
  3.     //=======【基本信息设置】=====================================  
  4.     //  
  5.     /** 
  6.      * TODO: 修改这里配置为您自己申请的商户信息 
  7.      * 微信公众号信息配置 
  8.      *  
  9.      * APPID:绑定支付的APPID(必须配置,开户邮件中可查看) 
  10.      *  
  11.      * MCHID:商户号(必须配置,开户邮件中可查看) 
  12.      *  
  13.      * KEY:商户支付密钥,参考开户邮件设置(必须配置,登录商户平台自行设置) 
  14.      * 设置地址:https://pay.weixin.qq.com/index.php/account/api_cert 
  15.      *  
  16.      * APPSECRET:公众帐号secert(仅JSAPI支付的时候需要配置, 登录公众平台,进入开发者中心可设置), 
  17.      * 获取地址:https://mp.weixin.qq.com/advanced/advanced?action=dev&t=advanced/dev&token=2005451881&lang=zh_CN 
  18.      * @var string 
  19.      */  
  20.     const APPID = 'wx123456789...';//这里填上自己的对应信息  
  21.     const MCHID = '14151666888';  
  22.     const KEY = '11223344556677889900';  
  23.     const APPSECRET = '828bfsdibfsiubfikdbfik';  
  24.     const NOTIFY_URL='https://...com/notify.php';  


注:

期间遇到一个签名错误,一直不好,使用微信支付接口签名校验工具校验也没有错,像网上说的漏写错写参数都查了,就是一直返回<return_code><![CDATA[FAIL]]></return_code>

<return_msg><![CDATA[签名错误]]></return_msg>
这样的信息,最后解决办法是:重置了KEY (商户支付密钥),重置的和之前的一模一样,但竟然就可以了...

问题主要都是报签名错误,仔细检查就好,比如XML格式不对,MD5加密后的位数,字典排序没排好,缺少参数等...

https://pay.weixin.qq.com/wiki/doc/api/wxa/wxa_api.php?chapter=9_1&index=1

3.最后附上notify.php

[php]  view plain  copy
  1. <?php  
  2. /** 
  3.  * Created by PhpStorm. 
  4.  * User: UFO 
  5.  * Date: 17/7/13 
  6.  * Time: 下午6:42 
  7.  */  
  8. require_once ('WxPay.Api.php');  
  9. require_once ('WxPay.Notify.php');  
  10. class PayNotifyCallBack extends WxPayNotify  
  11. {  
  12.     //查询订单  
  13.     public function Queryorder($transaction_id)  
  14.     {  
  15.         $input = new WxPayOrderQuery();  
  16.         $input->SetTransaction_id($transaction_id);  
  17.         $result = WxPayApi::orderQuery($input);  
  18.         if(array_key_exists("return_code"$result)  
  19.             && array_key_exists("result_code"$result)  
  20.             && $result["return_code"] == "SUCCESS"  
  21.             && $result["result_code"] == "SUCCESS")  
  22.         {  
  23.             return true;  
  24.         }  
  25.         return false;  
  26.     }  
  27.   
  28.     //重写回调处理函数  
  29.     public function NotifyProcess($data, &$msg)  
  30.     {  
  31.         $notfiyOutput = array();  
  32.   
  33.         if(!array_key_exists("transaction_id"$data)){  
  34.             $msg = "输入参数不正确";  
  35.             return false;  
  36.         }  
  37.         //查询订单,判断订单真实性  
  38.         if(!$this->Queryorder($data["transaction_id"])){  
  39.             $msg = "订单查询失败";  
  40.             return false;  
  41.         }  
  42.         return true;  
  43.     }  
  44. }  
  45. $notify = new PayNotifyCallBack();  
  46. $notify->Handle(false);  


欢迎留言交流指正!

猜你喜欢

转载自blog.csdn.net/zhao_teng/article/details/80431383