微信支付之掃碼支付、公眾號(hào)支付、H5支付、小程序支付相關(guān)業(yè)務(wù)流程分析總結(jié)
前言
很久以來(lái),一直想寫(xiě)一篇微信支付有關(guān)的總結(jié)文檔;一方面是總結(jié)自己的一些心得,另一方面也可以幫助別人,但是因種種原因未能完全理解透徹微信支付的幾大支付方式,今天有幸做一些總結(jié)上的文章,也趁此機(jī)會(huì),將一年多以來(lái)的相關(guān)經(jīng)驗(yàn)分享一下。
概述
1. 掃碼支付
商戶(hù)在pc端展示一個(gè)支付二維碼,用戶(hù)使用微信掃一掃功能,掃碼后實(shí)現(xiàn)付款的支付方式。
2. 公眾號(hào)支付
商戶(hù)在微信APP內(nèi)(微信瀏覽器)打開(kāi)H5網(wǎng)頁(yè),通過(guò)微信支付實(shí)現(xiàn)付款的支付方式。
3. H5支付
商戶(hù)在微信瀏覽器以外的手機(jī)瀏覽器打開(kāi)H5網(wǎng)頁(yè),通過(guò)微信支付實(shí)現(xiàn)付款的支付方式。
4. 小程序支付
商戶(hù)在小程序內(nèi),通過(guò)微信支付實(shí)現(xiàn)付款功能的支付方式。
開(kāi)發(fā)前準(zhǔn)備
第一步,登錄到商戶(hù)平臺(tái)設(shè)置相關(guān)參數(shù)配置
首先到微信商戶(hù)平臺(tái)申請(qǐng)一個(gè)企業(yè)賬號(hào),并開(kāi)通微信支付,設(shè)置好相應(yīng)的公眾號(hào)支付、掃碼支付、H5支付的相關(guān)參數(shù)配置。


其中,公眾號(hào)支付需要設(shè)置JSAPI支付授權(quán)目錄,且最多只能設(shè)置5個(gè);
掃碼支付需要設(shè)置掃碼回調(diào)鏈接,既用戶(hù)通過(guò)掃碼支付完畢后微信回調(diào)到商戶(hù)的頁(yè)面鏈接;
H5支付則需要設(shè)置安全支付域名即可。
第二步,引入微信官方SDK
微信官方提供了一套Java、.NET、PHP等三個(gè)版本的開(kāi)發(fā)SDK;我目前使用的是.NET,因此只需要下載.NTE的SDK即可。
地址:https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=11_1

下載完以后,在Visual Studio中打開(kāi)項(xiàng)目,結(jié)構(gòu)如下:

文件夾example是一些封裝好的實(shí)例,lib跟business中的內(nèi)容是SDK的核心部分,因此需要將這兩個(gè)文件夾原樣復(fù)制到我們實(shí)際的開(kāi)發(fā)項(xiàng)目中:

業(yè)務(wù)流程
掃碼支付
1. 用戶(hù)下單,選擇微信支付;
2. 商戶(hù)后臺(tái)根據(jù)訂單信息,調(diào)用微信統(tǒng)一下單接口;
3. 統(tǒng)一下單接口返回預(yù)支付信息,商戶(hù)后臺(tái)將預(yù)支付信息通過(guò)技術(shù)手段生成二維碼圖片,并展示在網(wǎng)頁(yè)中;
4. 用戶(hù)使用微信掃碼進(jìn)行支付,輸入支付密碼;
5. 支付完成,微信后臺(tái)向商戶(hù)后臺(tái)發(fā)出異步通知;
6. 商戶(hù)后臺(tái)接收到微信的異步通知后,獲取相關(guān)參數(shù),進(jìn)行對(duì)應(yīng)的業(yè)務(wù)處理,如修改訂單狀態(tài),并返回SUCCESS或FAIL的標(biāo)志以告知微信。
7. 微信向商戶(hù)后臺(tái)發(fā)送異步通知的同時(shí),會(huì)向預(yù)先在商戶(hù)平臺(tái)設(shè)置的回調(diào)地址發(fā)起跳轉(zhuǎn),商戶(hù)需在回調(diào)地址中獲取相關(guān)參數(shù)并進(jìn)行業(yè)務(wù)處理,一旦得知訂單狀態(tài)是已付款狀態(tài),則跳轉(zhuǎn)至相應(yīng)支付成功界面。
詳細(xì)說(shuō)明請(qǐng)看微信支付官方開(kāi)發(fā)文檔:
https://pay.weixin.qq.com/wiki/doc/api/native.php?chapter=6_1
公眾號(hào)支付
1. 用戶(hù)下單,選擇微信支付;
2. 商戶(hù)后臺(tái)根據(jù)訂單信息,調(diào)用微信統(tǒng)一下單接口;
3. 統(tǒng)一下單接口返回預(yù)支付信息,商戶(hù)后臺(tái)獲取預(yù)支付信息,并通過(guò)JSAPI發(fā)起支付請(qǐng)求,JSAPI調(diào)起微信支付;
4. 用戶(hù)輸入支付密碼,支付完成;
5. 微信后臺(tái)向商戶(hù)后臺(tái)發(fā)出異步通知,同時(shí)會(huì)在JSAPI發(fā)起頁(yè)面返回支付信息;
6. 商戶(hù)后臺(tái)收到微信的異步通知,進(jìn)行相關(guān)業(yè)務(wù)處理,并返回SUCCESS或FAIL的標(biāo)志以告知微信。
7. 商戶(hù)在JSAPI發(fā)起頁(yè)面獲取微信回調(diào)的信息,請(qǐng)求數(shù)據(jù)庫(kù)獲取訂單狀態(tài),并進(jìn)行支付成功或失敗對(duì)應(yīng)的頁(yè)面跳轉(zhuǎn)。
詳細(xì)說(shuō)明請(qǐng)看微信支付官方開(kāi)發(fā)文檔:
https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=7_1
H5支付
1. 用戶(hù)下單,選擇微信支付;
2. 商戶(hù)后臺(tái)根據(jù)appid向微信獲取code參數(shù),再通過(guò)code參數(shù)向微信換取openid參數(shù);
3. 商戶(hù)后臺(tái)根據(jù)訂單信息,調(diào)用微信統(tǒng)一下單接口;
4. 統(tǒng)一下單接口返回預(yù)支付信息,商戶(hù)后臺(tái)獲取預(yù)支付信息中的mweb_url參數(shù),該參數(shù)是調(diào)起微信支付的URL,商戶(hù)后臺(tái)根據(jù)實(shí)際需要決定是否在該URL中增加支付完成后的回調(diào)頁(yè)面地址,然后跳轉(zhuǎn)至該URL,即可調(diào)起微信支付。
5. 用戶(hù)輸入支付密碼,支付完成。
6. 微信后臺(tái)向商戶(hù)后臺(tái)發(fā)出異步通知,并跳轉(zhuǎn)至支付發(fā)起頁(yè)或回調(diào)頁(yè);
7. 商戶(hù)后臺(tái)在支付發(fā)起頁(yè)或回調(diào)頁(yè)面接收微信回調(diào)的信息,請(qǐng)求數(shù)據(jù)庫(kù)獲取訂單狀態(tài),并進(jìn)行支付成功或失敗對(duì)應(yīng)的頁(yè)面跳轉(zhuǎn)。
詳細(xì)說(shuō)明請(qǐng)看微信支付官方開(kāi)發(fā)文檔:
https://pay.weixin.qq.com/wiki/doc/api/H5.php?chapter=15_1
小程序支付
1. 用戶(hù)在小程序內(nèi)下單,選擇微信支付;
2. 商戶(hù)在小程序中調(diào)用小程序登錄API,獲得參數(shù)code;
3. 小程序端向商戶(hù)后臺(tái)發(fā)起接口調(diào)用,并將code及訂單相關(guān)參數(shù)一起發(fā)送到商戶(hù)后臺(tái)。
4. 商戶(hù)后臺(tái)接收小程序發(fā)送的code和訂單相關(guān)參數(shù),并結(jié)合appid,secret兩個(gè)參數(shù),獲取openid;
5. 商戶(hù)后臺(tái)根據(jù)訂單信息,調(diào)用統(tǒng)一下單接口;
6. 統(tǒng)一下單接口返回預(yù)支付信息,商戶(hù)后臺(tái)獲取預(yù)支付信息,并進(jìn)行再次簽名,返回支付參數(shù)(5個(gè)參數(shù)和sign)給小程序;
7. 小程序獲得支付參數(shù),發(fā)起支付請(qǐng)求;
8. 用戶(hù)輸入支付密碼,支付完成;
9. 微信后臺(tái)向商戶(hù)后臺(tái)發(fā)出異步通知,同時(shí)給小程序回調(diào)支付結(jié)果;
10.商戶(hù)后臺(tái)接收微信發(fā)送到異步通知,并進(jìn)行相關(guān)業(yè)務(wù)處理,并返回SUCCESS或FAIL的標(biāo)志以告知微信;
11.小程序獲取支付回調(diào)結(jié)果,并向商戶(hù)后臺(tái)發(fā)起接口請(qǐng)求,獲取訂單狀態(tài);并進(jìn)行支付成功或失敗對(duì)應(yīng)的頁(yè)面跳轉(zhuǎn)。
詳細(xì)說(shuō)明請(qǐng)看微信支付官方開(kāi)發(fā)文檔:
https://pay.weixin.qq.com/wiki/doc/api/wxa/wxa_api.php?chapter=7_3&index=1
業(yè)務(wù)流程圖

分析和總結(jié)
掃碼支付、公眾號(hào)支付、H5支付、小程序支付都有一個(gè)同步回調(diào)地址跟異步通知地址,只是設(shè)置方式有所區(qū)別 :
1. 掃碼支付
同步回調(diào)地址在微信商戶(hù)平臺(tái)中設(shè)置,異步通知地址在統(tǒng)一下單接口的請(qǐng)求參數(shù)中設(shè)置;
2. 公眾號(hào)支付
同步回調(diào)地址在JSAPI發(fā)起支付的回到函數(shù)中進(jìn)行回到,異步通知地址在統(tǒng)一下單接口的請(qǐng)求參數(shù)中設(shè)置;
3. H5支付
同步回調(diào)地址:在統(tǒng)一下單接口的返回參數(shù)中有一個(gè)參數(shù)mweb_url,在mweb_url中以get傳參形式新增一個(gè)參數(shù)redirect_url,redirect_url即是同步回調(diào)函數(shù);
異步通知地址:統(tǒng)一下單接口的請(qǐng)求參數(shù)中設(shè)置;
4. 小程序支付
同步回調(diào)地址:在小程序獲得支付參數(shù),并通過(guò)js調(diào)起微信支付以后,js中會(huì)有一個(gè)回調(diào)函數(shù),同步回調(diào)地址在該回調(diào)函數(shù)中添加;
異步通知地址:統(tǒng)一下單接口的請(qǐng)求參數(shù)中設(shè)置。
其中掃碼支付主要用于電腦端;公眾號(hào)支付跟H5支付主要用于移動(dòng)端,因此商戶(hù)在移動(dòng)端使用微信支付的時(shí)候需要判斷當(dāng)前打開(kāi)的瀏覽器是否是微信瀏覽器,并根據(jù)結(jié)果決定選擇公眾號(hào)支付或H5支付;小程序支付的話(huà)主要用于小程序內(nèi)部,因此比如獲取openid,調(diào)用統(tǒng)一下單接口等操作均在給小程序提供數(shù)據(jù)接口服務(wù)的接口后臺(tái)實(shí)現(xiàn)。
同步回調(diào)地址是作為微信后臺(tái)跟商戶(hù)進(jìn)行頁(yè)面跳轉(zhuǎn)的渠道,因此同步回調(diào)地址是至關(guān)重要的,如果不填寫(xiě),則可能導(dǎo)致支付完成后無(wú)法做頁(yè)面跳轉(zhuǎn)。
異步通知地址是微信后臺(tái)對(duì)商戶(hù)后臺(tái)在完成微信支付后進(jìn)行通知的重要通道,商戶(hù)后臺(tái)的異步通知地址必須是可訪(fǎng)問(wèn)的,在接收到微信的通知后,要做相關(guān)業(yè)務(wù)處理,并最終返回SUCCESS或FAIL的標(biāo)識(shí)給微信,以告知微信不要在發(fā)送通知。
結(jié)尾
這里只是針對(duì)微信掃碼支付、公眾號(hào)支付、H5支付、小程序支付等微信的四中支付方式做了一個(gè)大概的分析和總結(jié),具體的每一個(gè)支付方式的接入方法還請(qǐng)以微信支付開(kāi)發(fā)文檔為重要參考;因篇幅有限,代碼量大,這里就不貼具體的實(shí)現(xiàn)代碼了。
參考文檔:
微信掃碼支付:https://pay.weixin.qq.com/wiki/doc/api/native.php?chapter=6_1
微信公眾號(hào)支付:https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=7_1
微信H5支付:https://pay.weixin.qq.com/wiki/doc/api/H5.php?chapter=15_1
微信小程序支付:https://pay.weixin.qq.com/wiki/doc/api/wxa/wxa_api.php?chapter=7_3&index=1
如有發(fā)現(xiàn)錯(cuò)誤及解釋不當(dāng)之處,歡迎大家指正。
轉(zhuǎn)載請(qǐng)注明本文出處:https://www.cnblogs.com/luckyyang/p/9509631.html