《PHP實例:淺談使用PHP開發(fā)微信支付的流程》要點:
本文介紹了PHP實例:淺談使用PHP開發(fā)微信支付的流程,希望對您有用。如果有疑問,可以聯(lián)系我們。
下面以PHP語言為例,對微信支付的開發(fā)流程進(jìn)行一下闡明.PHP應(yīng)用
1.獲取訂單信息PHP應(yīng)用
2.根據(jù)訂單信息和支付相關(guān)的賬號生成sign,而且生成支付參數(shù)PHP應(yīng)用
3.將付出參數(shù)信息POST到微信服務(wù)器,獲取返回信息PHP應(yīng)用
4.根據(jù)返回信息生成相應(yīng)的付出代碼(微信內(nèi)部)或是付出二維碼(非微信內(nèi)),完成付出.PHP應(yīng)用
下面分步調(diào)的講一下:PHP應(yīng)用
1.微信支付中相關(guān)的必需的訂單參數(shù)有三個,分別是:body(商品名或訂單描述),out_trade_no(一般為訂單號)和total_fee(訂單金額,單位“分”,要注意單位問題),在不同的應(yīng)用中,首先要做的就是獲取訂單中的相關(guān)信息,為支付參數(shù)生成做準(zhǔn)備.PHP應(yīng)用
2.其他必需的支付參數(shù)有 appid(微信appid),mch_id(申請成功后告知),device_info(web端和微信端該參數(shù)都是統(tǒng)一的,為大寫的”WEB“),trade_type(根據(jù)使用場景不同,該值也是不同的,微信外部為”NATIVE“,微信內(nèi)部為”JSAPI“),nonce_str(32位隨機字符串),spbill_create_ip(發(fā)起支付的終端IP,即服務(wù)器IP),notify_url(支付回調(diào)地址,微信服務(wù)器通知網(wǎng)站支付完成與否,修改訂單狀態(tài)),sign(簽名),還有一個需要說明的地方,如果trade_type為JSAPI的話,openid為必填的參數(shù).PHP應(yīng)用
簽名算法是比擬容易出錯的地方,在于簽名步驟繁瑣,其實很關(guān)鍵的是,sign不參與簽名PHP應(yīng)用
?A:將1、2中提到的除sign外的參數(shù)賦值,放到一個數(shù)組array里面,依照字典順序排序,其實就是鍵值依照A―Z的順序進(jìn)行排序.PHP應(yīng)用
B:將數(shù)組轉(zhuǎn)換成字符串string,格式為 k1=v1&k2=v2&...kN=vNPHP應(yīng)用
C:在此string后加上KEY值(在微信支付商戶后臺用戶本身設(shè)定的)現(xiàn)在string = k1=v1&k2=v2&...kN=vN&key=KEY.PHP應(yīng)用
D:string = md5(string)PHP應(yīng)用
E: sign = strtoupper(string)PHP應(yīng)用
至此,sign生成完畢.PHP應(yīng)用
將sign添加到array數(shù)組里面生成新的數(shù)組.將該數(shù)組轉(zhuǎn)換為XML.至此,微信付出的參數(shù)準(zhǔn)備工作完成.PHP應(yīng)用
3.將2中生成的XML,使用POST的方式發(fā)送哀求到微信(https://api.mch.weixin.qq.com/pay/unifiedorder),獲取返回的XML信息,將該信息轉(zhuǎn)換成數(shù)組格式方便操作.返回的XML信息如下:PHP應(yīng)用
<xml> <return_code><![CDATA[SUCCESS]]></return_code> <return_msg><![CDATA[OK]]></return_msg> <appid><![CDATA[wx2421b1c4370ec43b]]></appid> <mch_id><![CDATA[10000100]]></mch_id> <nonce_str><![CDATA[IITRi8Iabbblz1Jc]]></nonce_str> <sign><![CDATA[7921E432F65EB8ED0CE9755F0E86D72F]]></sign> <result_code><![CDATA[SUCCESS]]></result_code> <prepay_id><![CDATA[wx201411101639507cbf6ffd8b0779950874]]></prepay_id> <trade_type><![CDATA[JSAPI]]></trade_type> </xml>
如果是trade_type==native付出的話,還會多一個參數(shù)code_url,該URL為微信掃碼付出的地址.PHP應(yīng)用
4.下面便是支付的過程了.PHP應(yīng)用
如果trade_type==native,那么使用一些方式將code_url轉(zhuǎn)換成二維碼,使用微信掃碼就可以了,如果是微信內(nèi)部點擊支付的話,必要調(diào)用微信js-sdk中的相關(guān)東西,這一步中最關(guān)鍵是生成一個json格式的字符串.PHP應(yīng)用
首先要生成轉(zhuǎn)換json字符串的數(shù)組array_jsapi.PHP應(yīng)用
A:該數(shù)組的參數(shù)包含:appId,timeStamp,nonceStr,package,signType(默認(rèn)為”MD5“),要注意大小寫和上面的數(shù)組里面是不一樣的.PHP應(yīng)用
B:使用該數(shù)組生成paySign參數(shù),簽名方式同上.PHP應(yīng)用
C:將paySign參數(shù)追加到array_jsapi數(shù)組中.PHP應(yīng)用
D:將該數(shù)組使用json_encode格式化為字符串js_string.PHP應(yīng)用
完成上面的工作,就可以在微信內(nèi)部進(jìn)行付出了.PHP應(yīng)用
下面為相關(guān)付出的示例代碼:PHP應(yīng)用
<script type='text/javascript'> function jsApiCall() { WeixinJSBridge.invoke( 'getBrandWCPayRequest', $js_string, function(res){ WeixinJSBridge.log(res.err_msg); if(res.err_msg=='get_brand_wcpay_request:ok') { alert('支付勝利'); } else { alert('支付失敗'); } } ); } function callpay() { if (typeof WeixinJSBridge == 'undefined'){ if( document.addEventListener ){ document.addEventListener('WeixinJSBridgeReady', jsApiCall, false); }else if (document.attachEvent){ document.attachEvent('WeixinJSBridgeReady', jsApiCall); document.attachEvent('onWeixinJSBridgeReady', jsApiCall); } }else{ jsApiCall(); } } </script>
代碼中js_string即為我們生成的字符串.PHP應(yīng)用
HTML代碼中挪用callpay()函數(shù)發(fā)起支付.PHP應(yīng)用
這樣微信付出的付出工作就完成了.PHP應(yīng)用
下面是回調(diào)工作,該功能確保訂單支付勝利后,有正確的狀態(tài)顯示給用戶.PHP應(yīng)用
支付完成后,微信使用POST哀求,將支付結(jié)果反饋給網(wǎng)站服務(wù)器,網(wǎng)站服務(wù)器獲取POST信息,根據(jù)支付成功與否,來確定是否修改訂單信息.PHP應(yīng)用
A:將POST參數(shù)中的sign去除,而且記錄下來該值.PHP應(yīng)用
B:對剩余的參數(shù)進(jìn)行簽名PHP應(yīng)用
C:將簽名結(jié)果和POST中的sign進(jìn)行比對,相同闡明簽名正確,根據(jù)支付結(jié)果修改訂單狀態(tài).PHP應(yīng)用
E:返回XML信息給微信,確保微信知道網(wǎng)站已經(jīng)收到該通知,避免微信再次推送POST,示例如下:PHP應(yīng)用
<xml> <return_code><![CDATA[SUCCESS]]></return_code> <return_msg><![CDATA[OK]]></return_msg> </xml>
如果失敗,則返回PHP應(yīng)用
<xml> <return_code><![CDATA[FAIL]]></return_code> <return_msg><![CDATA[失敗原因]]></return_msg> </xml>
至此,微信付出的整個開發(fā)介紹完畢.
PHP應(yīng)用
歡迎參與《PHP實例:淺談使用PHP開發(fā)微信支付的流程》討論,分享您的想法,維易PHP學(xué)院為您提供專業(yè)教程。
轉(zhuǎn)載請注明本頁網(wǎng)址:
http://www.snjht.com/jiaocheng/8620.html