小程序与php 实现微信支付

小程序访问地址:

payfee.php:


[php] view plain copy
  1. include 'WeixinPay.php';  
  2. $appid='';  
  3. $openid= $_GET['id'];  
  4. $mch_id='';  
  5. $key='';  
  6. $out_trade_no = $mch_id. time();  
  7. $total_fee = $_GET['fee'];  
  8. if(empty($total_fee)) //押金  
  9. {  
  10.     $body = "充值押金";  
  11.     $total_fee = floatval(99*100);  
  12. }  
  13.  else {  
  14.      $body = "充值余额";  
  15.      $total_fee = floatval($total_fee*100);  
  16.  }  
  17. $weixinpay = new WeixinPay($appid,$openid,$mch_id,$key,$out_trade_no,$body,$total_fee);  
  18. $return=$weixinpay->pay();  
  19.   
  20. echo json_encode($return);  

WeixinPay.php:

[php] view plain copy
  1. <?php  
  2.   
  3.   
  4. /* 
  5.  * 小程序微信支付 
  6.  */  
  7.   
  8.   
  9. class WeixinPay {  
  10.   
  11.   
  12.     protected $appid;  
  13.     protected $mch_id;  
  14.     protected $key;  
  15.     protected $openid;  
  16.     protected $out_trade_no;  
  17.     protected $body;  
  18.     protected $total_fee;  
  19.             function __construct($appid, $openid, $mch_id, $key,$out_trade_no,$body,$total_fee) {  
  20.         $this->appid = $appid;  
  21.         $this->openid = $openid;  
  22.         $this->mch_id = $mch_id;  
  23.         $this->key = $key;  
  24.         $this->out_trade_no = $out_trade_no;  
  25.         $this->body = $body;  
  26.         $this->total_fee = $total_fee;  
  27.     }  
  28.   
  29.   
  30.     public function pay() {  
  31.         //统一下单接口  
  32.         $return = $this->weixinapp();  
  33.         return $return;  
  34.     }  
  35.   
  36.   
  37.     //统一下单接口  
  38.     private function unifiedorder() {  
  39.         $url = 'https://api.mch.weixin.qq.com/pay/unifiedorder';  
  40.         $parameters = array(  
  41.             'appid' => $this->appid, //小程序ID  
  42.             'mch_id' => $this->mch_id, //商户号  
  43.             'nonce_str' => $this->createNoncestr(), //随机字符串  
  44. //            'body' => 'test', //商品描述  
  45.             'body' => $this->body,  
  46. //            'out_trade_no' => '2015450806125348', //商户订单号  
  47.             'out_trade_no'=> $this->out_trade_no,  
  48. //            'total_fee' => floatval(0.01 * 100), //总金额 单位 分  
  49.             'total_fee' => $this->total_fee,  
  50. //            'spbill_create_ip' => $_SERVER['REMOTE_ADDR'], //终端IP  
  51.             'spbill_create_ip' => '192.168.0.161', //终端IP  
  52.             'notify_url' => 'http://www.weixin.qq.com/wxpay/pay.php', //通知地址  确保外网能正常访问  
  53.             'openid' => $this->openid, //用户id  
  54.             'trade_type' => 'JSAPI'//交易类型  
  55.         );  
  56.         //统一下单签名  
  57.         $parameters['sign'] = $this->getSign($parameters);  
  58.         $xmlData = $this->arrayToXml($parameters);  
  59.         $return = $this->xmlToArray($this->postXmlCurl($xmlData, $url, 60));  
  60.         return $return;  
  61.     }  
  62.   
  63.   
  64.     private static function postXmlCurl($xml, $url, $second = 30)   
  65.     {  
  66.         $ch = curl_init();  
  67.         //设置超时  
  68.         curl_setopt($ch, CURLOPT_TIMEOUT, $second);  
  69.         curl_setopt($ch, CURLOPT_URL, $url);  
  70.         curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);  
  71.         curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE); //严格校验  
  72.         //设置header  
  73.         curl_setopt($ch, CURLOPT_HEADER, FALSE);  
  74.         //要求结果为字符串且输出到屏幕上  
  75.         curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);  
  76.         //post提交方式  
  77.         curl_setopt($ch, CURLOPT_POST, TRUE);  
  78.         curl_setopt($ch, CURLOPT_POSTFIELDS, $xml);  
  79.   
  80.   
  81.         curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 20);  
  82.         curl_setopt($ch, CURLOPT_TIMEOUT, 40);  
  83.         set_time_limit(0);  
  84.   
  85.   
  86.         //运行curl  
  87.         $data = curl_exec($ch);  
  88.         //返回结果  
  89.         if ($data) {  
  90.             curl_close($ch);  
  91.             return $data;  
  92.         } else {  
  93.             $error = curl_errno($ch);  
  94.             curl_close($ch);  
  95.             throw new WxPayException("curl出错,错误码:$error");  
  96.         }  
  97.     }  
  98.       
  99.       
  100.       
  101.     //数组转换成xml  
  102.     private function arrayToXml($arr) {  
  103.         $xml = "<root>";  
  104.         foreach ($arr as $key => $val) {  
  105.             if (is_array($val)) {  
  106.                 $xml .= "<" . $key . ">" . arrayToXml($val) . "</" . $key . ">";  
  107.             } else {  
  108.                 $xml .= "<" . $key . ">" . $val . "</" . $key . ">";  
  109.             }  
  110.         }  
  111.         $xml .= "</root>";  
  112.         return $xml;  
  113.     }  
  114.   
  115.   
  116.     //xml转换成数组  
  117.     private function xmlToArray($xml) {  
  118.   
  119.   
  120.         //禁止引用外部xml实体   
  121.   
  122.   
  123.         libxml_disable_entity_loader(true);  
  124.   
  125.   
  126.         $xmlstring = simplexml_load_string($xml, 'SimpleXMLElement', LIBXML_NOCDATA);  
  127.   
  128.   
  129.         $val = json_decode(json_encode($xmlstring), true);  
  130.   
  131.   
  132.         return $val;  
  133.     }  
  134.   
  135.   
  136.     //微信小程序接口  
  137.     private function weixinapp() {  
  138.         //统一下单接口  
  139.         $unifiedorder = $this->unifiedorder();  
  140. //        print_r($unifiedorder);  
  141.         $parameters = array(  
  142.             'appId' => $this->appid, //小程序ID  
  143.             'timeStamp' => '' . time() . '', //时间戳  
  144.             'nonceStr' => $this->createNoncestr(), //随机串  
  145.             'package' => 'prepay_id=' . $unifiedorder['prepay_id'], //数据包  
  146.             'signType' => 'MD5'//签名方式  
  147.         );  
  148.         //签名  
  149.         $parameters['paySign'] = $this->getSign($parameters);  
  150.         return $parameters;  
  151.     }  
  152.   
  153.   
  154.     //作用:产生随机字符串,不长于32位  
  155.     private function createNoncestr($length = 32) {  
  156.         $chars = "abcdefghijklmnopqrstuvwxyz0123456789";  
  157.         $str = "";  
  158.         for ($i = 0; $i < $length; $i++) {  
  159.             $str .= substr($chars, mt_rand(0, strlen($chars) - 1), 1);  
  160.         }  
  161.         return $str;  
  162.     }  
  163.   
  164.   
  165.     //作用:生成签名  
  166.     private function getSign($Obj) {  
  167.         foreach ($Obj as $k => $v) {  
  168.             $Parameters[$k] = $v;  
  169.         }  
  170.         //签名步骤一:按字典序排序参数  
  171.         ksort($Parameters);  
  172.         $String = $this->formatBizQueryParaMap($Parameters, false);  
  173.         //签名步骤二:在string后加入KEY  
  174.         $String = $String . "&key=" . $this->key;  
  175.         //签名步骤三:MD5加密  
  176.         $String = md5($String);  
  177.         //签名步骤四:所有字符转为大写  
  178.         $result_ = strtoupper($String);  
  179.         return $result_;  
  180.     }  
  181.   
  182.   
  183.     ///作用:格式化参数,签名过程需要使用  
  184.     private function formatBizQueryParaMap($paraMap, $urlencode) {  
  185.         $buff = "";  
  186.         ksort($paraMap);  
  187.         foreach ($paraMap as $k => $v) {  
  188.             if ($urlencode) {  
  189.                 $v = urlencode($v);  
  190.             }  
  191.             $buff .= $k . "=" . $v . "&";  
  192.         }  
  193.         $reqPar;  
  194.         if (strlen($buff) > 0) {  
  195.             $reqPar = substr($buff, 0, strlen($buff) - 1);  
  196.         }  
  197.         return $reqPar;  
  198.     }  
  199.   
  200.   
  201. }  


小程序页面处理:

[html] view plain copy
  1. wx.request({  
  2. url:'https://www.yourhost.com/weixin/WeiActivity/payfee.php',//改成你自己的链接  
  3. header:{  
  4. 'Content-Type':'application/x-www-form-urlencoded'  
  5. },  
  6. method:'POST',  
  7. success:function(res){  
  8. console.log(res.data);  
  9. console.log('调起支付');  
  10. wx.requestPayment({  
  11. 'timeStamp': res.data.timeStamp,  
  12. 'nonceStr': res.data.nonceStr,  
  13. 'package': res.data.package,  
  14. 'signType':'MD5',  
  15. 'paySign': res.data.paySign,  
  16. 'success':function(res){  
  17. console.log('success');  
  18. wx.showToast({  
  19. title:'支付成功',  
  20. icon:'success',  
  21. duration:3000  
  22. });  
  23. },  
  24. 'fail':function(res){  
  25. console.log('fail');  
  26. },  
  27. 'complete':function(res){  
  28. console.log('complete');  
  29. }  
  30. });  
  31. },  
  32. fail:function(res){  
  33. console.log(res.data)  
  34. }  
  35. });  

回调url:notify.php

[php] view plain copy
  1. $postXml = $GLOBALS["HTTP_RAW_POST_DATA"]; //接收微信参数  
  2. if (empty($postXml)) {  
  3.     return false;  
  4. }  
  5.   
  6. //将xml格式转换成数组  
  7. function xmlToArray($xml) {  
  8.   
  9.     //禁止引用外部xml实体   
  10.     libxml_disable_entity_loader(true);  
  11.   
  12.     $xmlstring = simplexml_load_string($xml, 'SimpleXMLElement', LIBXML_NOCDATA);  
  13.   
  14.     $val = json_decode(json_encode($xmlstring), true);  
  15.   
  16.     return $val;  
  17. }  
  18.   
  19. $attr = xmlToArray($postXml);  
  20.   
  21. $total_fee = $attr[total_fee];  
  22. $open_id = $attr[openid];  
  23. $out_trade_no = $attr[out_trade_no];  
  24. $time = $attr[time_end];  
文章来源: 小程序与php 实现微信支付

人吐槽 人点赞

猜你喜欢

发表评论

用户名: 密码:
验证码: 匿名发表

你可以使用这些语言

查看评论:小程序与php 实现微信支付