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

 

 

 

 

 

小程序页面处理:

 

[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];  

你可能感兴趣的:(小程序)