微信支付之掃碼支付、公眾號支付、H5支付、小程序支付相關業務流程分析總結
前言
很久以來,一直想寫一篇微信支付有關的總結文檔;一方面是總結自己的一些心得,另一方面也可以幫助別人,但是因種種原因未能完全理解透徹微信支付的幾大支付方式,今天有幸做一些總結上的文章,也趁此機會,將一年多以來的相關經驗分享一下。
概述
1. 掃碼支付
商戶在pc端展示一個支付二維碼,用戶使用微信掃一掃功能,掃碼后實現付款的支付方式。
2. 公眾號支付
商戶在微信APP內(微信瀏覽器)打開H5網頁,通過微信支付實現付款的支付方式。
3. H5支付
商戶在微信瀏覽器以外的手機瀏覽器打開H5網頁,通過微信支付實現付款的支付方式。
4. 小程序支付
商戶在小程序內,通過微信支付實現付款功能的支付方式。
開發前準備
第一步,登錄到商戶平臺設置相關參數配置
首先到微信商戶平臺申請一個企業賬號,并開通微信支付,設置好相應的公眾號支付、掃碼支付、H5支付的相關參數配置。
其中,公眾號支付需要設置JSAPI支付授權目錄,且最多只能設置5個;
掃碼支付需要設置掃碼回調鏈接,既用戶通過掃碼支付完畢后微信回調到商戶的頁面鏈接;
H5支付則需要設置安全支付域名即可。
第二步,引入微信官方SDK
微信官方提供了一套Java、.NET、PHP等三個版本的開發SDK;我目前使用的是.NET,因此只需要下載.NTE的SDK即可。
地址:https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=11_1
下載完以后,在Visual Studio中打開項目,結構如下:
文件夾example是一些封裝好的實例,lib跟business中的內容是SDK的核心部分,因此需要將這兩個文件夾原樣復制到我們實際的開發項目中:
業務流程
掃碼支付
1. 用戶下單,選擇微信支付;
2. 商戶后臺根據訂單信息,調用微信統一下單接口;
3. 統一下單接口返回預支付信息,商戶后臺將預支付信息通過技術手段生成二維碼圖片,并展示在網頁中;
4. 用戶使用微信掃碼進行支付,輸入支付密碼;
5. 支付完成,微信后臺向商戶后臺發出異步通知;
6. 商戶后臺接收到微信的異步通知后,獲取相關參數,進行對應的業務處理,如修改訂單狀態,并返回SUCCESS或FAIL的標志以告知微信。
7. 微信向商戶后臺發送異步通知的同時,會向預先在商戶平臺設置的回調地址發起跳轉,商戶需在回調地址中獲取相關參數并進行業務處理,一旦得知訂單狀態是已付款狀態,則跳轉至相應支付成功界面。
詳細說明請看微信支付官方開發文檔:
https://pay.weixin.qq.com/wiki/doc/api/native.php?chapter=6_1
公眾號支付
1. 用戶下單,選擇微信支付;
2. 商戶后臺根據訂單信息,調用微信統一下單接口;
3. 統一下單接口返回預支付信息,商戶后臺獲取預支付信息,并通過JSAPI發起支付請求,JSAPI調起微信支付;
4. 用戶輸入支付密碼,支付完成;
5. 微信后臺向商戶后臺發出異步通知,同時會在JSAPI發起頁面返回支付信息;
6. 商戶后臺收到微信的異步通知,進行相關業務處理,并返回SUCCESS或FAIL的標志以告知微信。
7. 商戶在JSAPI發起頁面獲取微信回調的信息,請求數據庫獲取訂單狀態,并進行支付成功或失敗對應的頁面跳轉。
詳細說明請看微信支付官方開發文檔:
https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=7_1
H5支付
1. 用戶下單,選擇微信支付;
2. 商戶后臺根據appid向微信獲取code參數,再通過code參數向微信換取openid參數;
3. 商戶后臺根據訂單信息,調用微信統一下單接口;
4. 統一下單接口返回預支付信息,商戶后臺獲取預支付信息中的mweb_url參數,該參數是調起微信支付的URL,商戶后臺根據實際需要決定是否在該URL中增加支付完成后的回調頁面地址,然后跳轉至該URL,即可調起微信支付。
5. 用戶輸入支付密碼,支付完成。
6. 微信后臺向商戶后臺發出異步通知,并跳轉至支付發起頁或回調頁;
7. 商戶后臺在支付發起頁或回調頁面接收微信回調的信息,請求數據庫獲取訂單狀態,并進行支付成功或失敗對應的頁面跳轉。
詳細說明請看微信支付官方開發文檔:
https://pay.weixin.qq.com/wiki/doc/api/H5.php?chapter=15_1
小程序支付
1. 用戶在小程序內下單,選擇微信支付;
2. 商戶在小程序中調用小程序登錄API,獲得參數code;
3. 小程序端向商戶后臺發起接口調用,并將code及訂單相關參數一起發送到商戶后臺。
4. 商戶后臺接收小程序發送的code和訂單相關參數,并結合appid,secret兩個參數,獲取openid;
5. 商戶后臺根據訂單信息,調用統一下單接口;
6. 統一下單接口返回預支付信息,商戶后臺獲取預支付信息,并進行再次簽名,返回支付參數(5個參數和sign)給小程序;
7. 小程序獲得支付參數,發起支付請求;
8. 用戶輸入支付密碼,支付完成;
9. 微信后臺向商戶后臺發出異步通知,同時給小程序回調支付結果;
10.商戶后臺接收微信發送到異步通知,并進行相關業務處理,并返回SUCCESS或FAIL的標志以告知微信;
11.小程序獲取支付回調結果,并向商戶后臺發起接口請求,獲取訂單狀態;并進行支付成功或失敗對應的頁面跳轉。
詳細說明請看微信支付官方開發文檔:
https://pay.weixin.qq.com/wiki/doc/api/wxa/wxa_api.php?chapter=7_3&index=1
業務流程圖
分析和總結
掃碼支付、公眾號支付、H5支付、小程序支付都有一個同步回調地址跟異步通知地址,只是設置方式有所區別 :
1. 掃碼支付
同步回調地址在微信商戶平臺中設置,異步通知地址在統一下單接口的請求參數中設置;
2. 公眾號支付
同步回調地址在JSAPI發起支付的回到函數中進行回到,異步通知地址在統一下單接口的請求參數中設置;
3. H5支付
同步回調地址:在統一下單接口的返回參數中有一個參數mweb_url,在mweb_url中以get傳參形式新增一個參數redirect_url,redirect_url即是同步回調函數;
異步通知地址:統一下單接口的請求參數中設置;
4. 小程序支付
同步回調地址:在小程序獲得支付參數,并通過js調起微信支付以后,js中會有一個回調函數,同步回調地址在該回調函數中添加;
異步通知地址:統一下單接口的請求參數中設置。
其中掃碼支付主要用于電腦端;公眾號支付跟H5支付主要用于移動端,因此商戶在移動端使用微信支付的時候需要判斷當前打開的瀏覽器是否是微信瀏覽器,并根據結果決定選擇公眾號支付或H5支付;小程序支付的話主要用于小程序內部,因此比如獲取openid,調用統一下單接口等操作均在給小程序提供數據接口服務的接口后臺實現。
同步回調地址是作為微信后臺跟商戶進行頁面跳轉的渠道,因此同步回調地址是至關重要的,如果不填寫,則可能導致支付完成后無法做頁面跳轉。
異步通知地址是微信后臺對商戶后臺在完成微信支付后進行通知的重要通道,商戶后臺的異步通知地址必須是可訪問的,在接收到微信的通知后,要做相關業務處理,并最終返回SUCCESS或FAIL的標識給微信,以告知微信不要在發送通知。
結尾
這里只是針對微信掃碼支付、公眾號支付、H5支付、小程序支付等微信的四中支付方式做了一個大概的分析和總結,具體的每一個支付方式的接入方法還請以微信支付開發文檔為重要參考;因篇幅有限,代碼量大,這里就不貼具體的實現代碼了。
參考文檔:
微信掃碼支付:https://pay.weixin.qq.com/wiki/doc/api/native.php?chapter=6_1
微信公眾號支付: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
如有發現錯誤及解釋不當之處,歡迎大家指正。