最近接觸到一個(gè)項(xiàng)目,涉及到微信支付,搞微信開(kāi)發(fā)這么久以來(lái),還沒(méi)搞過(guò)支付,之前也就搞過(guò)公眾號(hào)發(fā)紅包,感謝前輩們的探索,我看了他們的博文,讓我少走了很多彎路。 前期準(zhǔn)備: 1.微信認(rèn)證服務(wù)號(hào),并且開(kāi)通了微信支付 2.微信支付SDK,下載地址:https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=11_1 3.登錄微信支付平臺(tái)https://pay.weixin.qq.com/index.php/account/api_cert下載支付證書(shū) 方法步驟: 1.demo文件處理 (1)將官方的demo下載下來(lái),文件名為WxpayAPI_php_v3,把這文件重命名為wxpay,為了后邊書(shū)寫(xiě)目錄方便; (2)打開(kāi)lib文件夾下的WxPay.Api.php文件,在537行有一段curl網(wǎng)絡(luò)請(qǐng)求配置代碼:
替換成: 為了禁止 cURL 驗(yàn)證對(duì)等證書(shū)(peer's certificate)。
(3)打開(kāi)lib文件夾下的WxPay.Config.php文件,第25行開(kāi)始,根據(jù)自己的賬號(hào)完成基本信息設(shè)置; (4)打開(kāi)lib文件夾下的WxPay.Notify.php文件,第79行的代碼: 改成:
(5)打開(kāi)cert證書(shū)目錄,將里邊的兩個(gè)證書(shū)換成自己的支付證書(shū)。
2.公眾號(hào)后臺(tái)設(shè)置(1)配置網(wǎng)頁(yè)授權(quán)域名,我的域名是(xy.); (1)配置支付授權(quán)目錄,域名是(xy.),我將demo放到此域名指向的目錄的weixinopen/文件夾下,demo中jsapi.php文件位于example/目錄下,所以支付授權(quán)目錄為:xy./weixinopen/wxpay/example/ 打開(kāi)example目錄下的jsapi.php文件,支付發(fā)起和處理,都是在這里完成。 (1)獲取用戶(hù)openid 之前配置好了自己的APPID和APPSecert,所以這里不用處理。 這里首先初始化的一個(gè)JsApiPay()類(lèi)得到一個(gè)對(duì)象,文件對(duì)應(yīng)example/目錄下的WxPay.JsApiPay.php,調(diào)用GetOpenid()方法,會(huì)自動(dòng)獲取自己的openID。
(2)統(tǒng)一下單 對(duì)應(yīng)WxPay.Api.php的第24行的unifiedOrder()方法,配置訂單信息和支付回調(diào)函數(shù),這里需要修改幾個(gè)參數(shù):
A. 商品名稱(chēng):
B. 訂單號(hào)
C. 支付金額 $input->SetTotal_fee("1"); D. 支付驗(yàn)證鏈接 設(shè)置為你的notify.php文件所在的位置,所以我這里設(shè)置為:http://xy./weixinopen/wxpay/example/notify.php 也可以寫(xiě)其他地址,當(dāng)然要在支付授權(quán)域名之下,支付成功之后就會(huì)自動(dòng)回調(diào)到該鏈接指定的方法里邊,可以在里邊進(jìn)行判斷和數(shù)據(jù)庫(kù)操作. $input->SetNotify_url("http://paysdk.weixin.qq.com/example/notify.php"); E. 附加參數(shù)
附加參數(shù),可填可不填,填寫(xiě)的話(huà),里邊字符串最好不要出現(xiàn)空格。這時(shí)候,點(diǎn)擊支付應(yīng)該就可以成功支付了。 (3)發(fā)起支付 點(diǎn)擊立即支付按鈕調(diào)用的就是 callpay() 函數(shù),他有會(huì)調(diào)用jsApiCall() 函數(shù)打開(kāi)支付程序。
jsApiCall() 函數(shù)會(huì)監(jiān)聽(tīng)每一步動(dòng)作: res.err_msg 為get_brand_wcpay_request:cancel 表明前端判斷的取消支付,es.err_msg 為get_brand_wcpay_request:ok 表明前端判斷的支付成功,我們可以根據(jù)這個(gè)將支付跳轉(zhuǎn)到成功頁(yè)面。 (4)支持成功回調(diào)通過(guò)前端jsApiCall()函數(shù)可以監(jiān)聽(tīng)支付結(jié)果,但是這個(gè)并不可信。確認(rèn)是否支付成功還是應(yīng)當(dāng)通過(guò)notify.php 處理業(yè)務(wù)邏輯。前邊配置好了支付驗(yàn)證鏈接SetNotify_url(),支付完成后,微信服務(wù)器會(huì)根據(jù)鏈接自動(dòng)請(qǐng)求你的notify.php文件,打開(kāi)這個(gè)文件,其實(shí)這個(gè)文件最主要的代碼就兩行: 由此跟蹤到WxPay.Notify.php類(lèi)文件的Handle()函數(shù): 主要代碼: 然后來(lái)到WxPay.Api.php文件的第411行,notify()函數(shù): 這里面的$xml=$GLOBALS['HTTP_RAW_POST_DATA'],就是支付成功后用戶(hù)返回給你的一個(gè)結(jié)果,他是一個(gè)xml格式的字符串。
我們可以將這里返回的xml數(shù)據(jù)記錄下來(lái),然后打開(kāi)看看$out_trade_no就是在支付之前我自己設(shè)置的訂單號(hào)碼,$attach就是設(shè)置的附加參數(shù)。 得到了這個(gè)訂單號(hào),然后我就直接在下面寫(xiě)支付成功后的邏輯了,比如改變數(shù)據(jù)庫(kù)中的數(shù)據(jù)等等。 這樣 微信支付的 JsApi支付就大致分析完成了。 這是集成了官方的SDK實(shí)現(xiàn)的,如果不使用SDK,可以使用更簡(jiǎn)單的方法,見(jiàn):PHP實(shí)現(xiàn)微信支付(jsapi支付)和退款(無(wú)需集成支付SDK) |
|
來(lái)自: 學(xué)習(xí)的倉(cāng)庫(kù) > 《php》