国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 語言 > PHP > 正文

PHP實現APP微信支付的實例講解

2024-05-05 00:02:22
字體:
來源:轉載
供稿:網友

一、PHP后臺后臺生成預支付交易單,返回正確的預支付交易回話標識后再在APP里面調起支付!

官方文檔:https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=9_1

根據文檔拼接微信需要的參數,這里需要幾個方法,直接上代碼!

傳輸給微信的參數要組裝成xml格式發送,傳如參數數組!

public function ToXml($data=array()) { if(!is_array($data) || count($data) <= 0) {  return '數組異常'; } $xml = "<xml>"; foreach ($data as $key=>$val) {  if (is_numeric($val)){  $xml.="<".$key.">".$val."</".$key.">";  }else{  $xml.="<".$key."><![CDATA[".$val."]]></".$key.">";  } } $xml.="</xml>"; return $xml; }

2.生成隨機字符串,微信所需參數! 這里方法很多,看自己愛好都行!

function rand_code(){ $str = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';//62個字符 $str = str_shuffle($str); $str = substr($str,0,32); return $str;}

3.這里是微信比較重要的一步了,這個方法會多次用到!生成簽名

private function getSign($params) { ksort($params); //將參數數組按照參數名ASCII碼從小到大排序 foreach ($params as $key => $item) {  if (!empty($item)) {  //剔除參數值為空的參數  $newArr[] = $key.'='.$item; // 整合新的參數數組  } } $stringA = implode("&", $newArr);  //使用 & 符號連接參數 $stringSignTemp = $stringA."&key="."************************"; //拼接key // key是在商戶平臺API安全里自己設置的 $stringSignTemp = MD5($stringSignTemp); //將字符串進行MD5加密 $sign = strtoupper($stringSignTemp); //將所有字符轉換為大寫 return $sign; }

4.傳遞參數給微信,生成預支付訂單! 接收微信返回的數據,在反給APP端,APP端調用支付接口,完成支付 ! APP端所需參數見微信文檔:https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=9_12&index=2

public function wx_pay() { $nonce_str = $this->rand_code(); //調用隨機字符串生成方法獲取隨機字符串 $data['appid'] ='wxdbc5dc*******'; //appid $data['mch_id'] = '1493*****' ; //商戶號 $data['body'] = "APP支付測試"; $data['spbill_create_ip'] = $_SERVER['HTTP_HOST']; //ip地址 $data['total_fee'] = 1;    //金額 $data['out_trade_no'] = time().mt_rand(10000,99999); //商戶訂單號,不能重復 $data['nonce_str'] = $nonce_str;   //隨機字符串 $data['notify_url'] = 'http://xxx.xxx.com/wx_notify'; //回調地址,用戶接收支付后的通知,必須為能直接訪問的網址,不能跟參數 $data['trade_type'] = 'APP'; //支付方式 //將參與簽名的數據保存到數組 注意:以上幾個參數是追加到$data中的,$data中應該同時包含開發文檔中要求必填的剔除sign以外的所有數據 $data['sign'] = $this->getSign($data); //獲取簽名 $xml = $this->ToXml($data);  //數組轉xml //curl 傳遞給微信方 $url = "https://api.mch.weixin.qq.com/pay/unifiedorder"; //header("Content-type:text/xml"); $ch = curl_init(); curl_setopt($ch,CURLOPT_URL, $url); if(stripos($url,"https://")!==FALSE){  curl_setopt($ch, CURLOPT_SSLVERSION, CURL_SSLVERSION_TLSv1);  curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);  curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE); } else {  curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,TRUE);  curl_setopt($ch,CURLOPT_SSL_VERIFYHOST,2);//嚴格校驗 } //設置header curl_setopt($ch, CURLOPT_SSLVERSION, CURL_SSLVERSION_TLSv1); curl_setopt($ch, CURLOPT_HEADER, FALSE); //要求結果為字符串且輸出到屏幕上 curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE); //設置超時 curl_setopt($ch, CURLOPT_TIMEOUT, 30); curl_setopt($ch, CURLOPT_POST, TRUE); //傳輸文件 curl_setopt($ch, CURLOPT_POSTFIELDS, $xml); //運行curl $data = curl_exec($ch); //返回結果 if($data){  curl_close($ch);  //返回成功,將xml數據轉換為數組.  $re = $this->FromXml($data);  if($re['return_code'] != 'SUCCESS'){  json("201",'簽名失敗');  }  else{  //接收微信返回的數據,傳給APP!  $arr =array(   'prepayid' =>$re['prepay_id'],   'appid' => 'wxdbc5dc*****',   'partnerid' => '14937****',   'package' => 'Sign=WXPay',   'noncestr' => $nonce_str,   'timestamp' =>time(),  );  //第二次生成簽名  $sign = $this->getSign($arr);  $arr['sign'] = $sign;  json('200','簽名成功',$arr);  } } else {  $error = curl_errno($ch);  curl_close($ch);  json('201',"curl出錯,錯誤碼:$error"); } }

5.將xml數據轉換為數組,接收微信返回數據時用到.

public function FromXml($xml) { if(!$xml){  echo "xml數據異常!"; } //將XML轉為array //禁止引用外部xml實體 libxml_disable_entity_loader(true); $data = json_decode(json_encode(simplexml_load_string($xml, 'SimpleXMLElement', LIBXML_NOCDATA)), true); return $data; }

二、APP支付成功后,會調用你填寫的回調地址.

返回參數詳見微信文檔:https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=9_7&index=3

// 微信支付回調 function wx_notify(){  //接收微信返回的數據數據,返回的xml格式  $xmlData = file_get_contents('php://input');  //將xml格式轉換為數組  $data = $this->FromXml($xmlData);  //用日志記錄檢查數據是否接受成功,驗證成功一次之后,可刪除。  $file = fopen('./log.txt', 'a+');  fwrite($file,var_export($data,true));  //為了防止假數據,驗證簽名是否和返回的一樣。  //記錄一下,返回回來的簽名,生成簽名的時候,必須剔除sign字段。  $sign = $data['sign'];  unset($data['sign']);  if($sign == $this->getSign($data)){  //簽名驗證成功后,判斷返回微信返回的  if ($data['result_code'] == 'SUCCESS') {  //根據返回的訂單號做業務邏輯  $arr = array(   'pay_status' => 1,   );  $re = M('order')->where(['order_sn'=>$data['out_trade_no']])->save($arr);  //處理完成之后,告訴微信成功結果!  if($re){   echo '<xml>  <return_code><![CDATA[SUCCESS]]></return_code>  <return_msg><![CDATA[OK]]></return_msg>  </xml>';exit();  }  }  //支付失敗,輸出錯誤信息  else{  $file = fopen('./log.txt', 'a+');  fwrite($file,"錯誤信息:".$data['return_msg'].date("Y-m-d H:i:s"),time()."/r/n");   } } else{  $file = fopen('./log.txt', 'a+');  fwrite($file,"錯誤信息:簽名驗證失敗".date("Y-m-d H:i:s"),time()."/r/n");   }}

在這里,微信APP支付流程就成功走完了!謝謝支持!

以上這篇PHP實現APP微信支付的實例講解就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持VeVb武林網。


注:相關教程知識閱讀請移步到PHP教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

主站蜘蛛池模板: 密云县| 佛山市| 孝义市| 三原县| 饶阳县| 连江县| 宣汉县| 岳普湖县| 龙门县| 鄂托克前旗| 科技| 郁南县| 商河县| 胶州市| 邯郸县| 廉江市| 原平市| 余江县| 东明县| 甘肃省| 长丰县| 远安县| 五大连池市| 迁西县| 曲阳县| 林口县| 新田县| 微山县| 商丘市| 赣榆县| 稷山县| 安岳县| 志丹县| 宾川县| 永和县| 武宣县| 噶尔县| 津南区| 交口县| 和林格尔县| 诸暨市|