在開發(fā)中我們會(huì)經(jīng)常遇到微信支付的場景,不管是 從微信付錢到商戶,還是從商戶提現(xiàn)到微信 都屬于支付。都需要在微信開放平臺(tái)注冊(cè)應(yīng)用,申請(qǐng)支付權(quán)限,對(duì)接SDK。下面,我們就來了解一下具體的支付流程。
對(duì)于支付過程,請(qǐng)看開放平臺(tái)文檔:https://developers.weixin.qq.com/doc/oplatform/Mobile_App/Resource_Center_Homepage.html?action=dir_list&t=resource%2Fres_list&verify=1&lang=zh_CN
支付模式
- 付款碼支付
付款碼支付是用戶展示微信錢包內(nèi)的“刷卡條碼/二維碼”給商戶系統(tǒng)掃描后直接完成支付的模式。主要用于線下的面對(duì)面收銀的場景。 - Native 支付
Native支付是商戶系統(tǒng)按微信支付協(xié)議生成支付二維碼,用戶再用微信“掃一掃”完成支付的模式。該模式適用于PC網(wǎng)站支付,實(shí)體店單品或訂單支付,媒體廣告支付等場景。 - JSAPI支付
JSAPI支付 是用戶在微信中打開商戶的H5頁面,商戶在H5頁面通過調(diào)用微信支付提供的JSAPI接口調(diào)起微信支付模塊完成支付。應(yīng)用場景有:
1> 用戶在微信公眾號(hào)內(nèi)進(jìn)入商家公眾號(hào),打開某個(gè)頁面,完成支付。
2> 用戶的好友在朋友圈,聊天窗口等分享商家頁面鏈接,用戶點(diǎn)擊鏈接打開商家頁面,完成支付
3> 將商戶頁面轉(zhuǎn)換成二維碼,用戶掃描二維碼后在微信瀏覽器中打開頁面后完成支付。 - APP支付
APP 支付又稱移動(dòng)端支付,是商戶通過在移動(dòng)端應(yīng)用APP中集成開放SDK調(diào)起微信支付模塊完成支付的模式 - H5支付
H5支付主要是在手機(jī),iPad等移動(dòng)設(shè)備中通過瀏覽器來喚起微信支付產(chǎn)品 - 小程序支付
小程序支付是專門被定義使用在小程序中的支付產(chǎn)品。目前在小程序中能且只能使用小程序支付的方式來喚起微信支付。
接口規(guī)則
- 傳輸方式
為保證交易安全性,采用HTTPS傳輸 - 提交方式
采用post方法提交 - 數(shù)據(jù)格式
提交和返回?cái)?shù)據(jù)都為xml 格式,節(jié)點(diǎn)為xml - 字符編碼
微信支付API 僅支持UTF-8 字符編碼的一個(gè)子集: 使用一到三個(gè)字節(jié)編碼的字符。也就是說 不支持Unicode輔助平面中的四至六字節(jié)編碼的字符 - 簽名算法
MD5 - 簽名要求
請(qǐng)求和接收數(shù)據(jù)均需要校驗(yàn)簽名 - 證書要求
調(diào)用申請(qǐng)退款,撤銷訂單接口需要商戶證書 - 判斷邏輯
先判斷協(xié)議字段返回,再判斷業(yè)務(wù)返回,最后判斷交易狀態(tài)
簽名算法 (https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=4_3)
- 設(shè)所有發(fā)送或者接收到的數(shù)據(jù)為集合M,將集合M內(nèi)非空參數(shù)值的參數(shù)按照參數(shù)名ASCII碼從小到大排序(字典序),使用URL鍵值對(duì)的格式(key1=value1&key2=value2),拼接成字符串stringA
- 在stringA最后拼接上key得到stringSing temp 字符串,并對(duì)stringSign Temp 進(jìn)行MD5云算,再將得到的字符串所有字符轉(zhuǎn)換為大寫,得到sign值 signValue。注意 秘鑰的長度為32字節(jié)
**** key 設(shè)置路徑:審核后的郵件有返回 或者 微信商戶平臺(tái)(pay.weixin.qq.com)-->賬戶設(shè)置-->API安全-->密鑰設(shè)置
例如: 傳送的參數(shù)如下
appid: wxd930ea5d5a258f4f
mch_id: 10000100
device_info: 1000
body: test
nonce_str: ibuaiVcKdpRxkhJA
1> 對(duì)參數(shù)按照key = value 的格式,并按照參數(shù)名ASCII字典排序如下:
stringA="appid=wxd930ea5d5a258f4f&body=test&device_info=1000&mch_id=10000100&nonce_str=ibuaiVcKdpRxkhJA";
2> 拼接API秘鑰
MD5簽名方式:
stringSignTemp=stringA+"&key=192006250b4c09247ec02edce69f6a2d" [//注:key為商戶平臺(tái)設(shè)置的密鑰key](https://kf.qq.com/faq/180830UVRZR7180830Ij6ZZz.html)
sign=MD5(stringSignTemp).toUpperCase()="9A0A8659F005D6984697E2CA0A9CF3B7" //注:MD5簽名方式
3> 最終得到最終發(fā)送的數(shù)據(jù):
<xml>
<appid>wxd930ea5d5a258f4f</appid>
<mch_id>10000100</mch_id>
<device_info>1000</device_info>
<body>test</body>
<nonce_str>ibuaiVcKdpRxkhJA</nonce_str>
<sign>9A0A8659F005D6984697E2CA0A9CF3B7</sign>
</xml>
以下就是APP 支付流程圖:

用戶使用商戶APP 客戶端,選擇商品進(jìn)行下單,將訂單信息給 商戶后臺(tái)系統(tǒng),請(qǐng)求生成支付訂單
商戶后臺(tái)收到用戶訂單信息,生成平臺(tái)訂單,調(diào)用微信支付統(tǒng)一下單接口,請(qǐng)求創(chuàng)建訂單
-
微信統(tǒng)一下單接口 會(huì)返回正常的prepay_id, 然后再按照簽名規(guī)范重新生成簽名,將數(shù)據(jù)傳輸給APP。參與簽名的字段為,appid, partnerid,prepayid,noncestr,timestamp,package,其中package 的格式為Sign=WXPay
這些參數(shù)都會(huì)返回給APP
123.png 商戶APP 用這些參數(shù),調(diào)起微信客戶端,發(fā)起支付
微信客戶端向微信后臺(tái)發(fā)起支付請(qǐng)求,微信后臺(tái)驗(yàn)證支付授權(quán)權(quán)限,向微信客戶端返回支付授權(quán)
用戶輸入密碼,提交授權(quán),微信后臺(tái)驗(yàn)證授權(quán),完成支付
獲取支付結(jié)果
在方法onResq 中會(huì)獲取回調(diào),如果支付成功,則去后臺(tái)查詢支付結(jié)果再展示用戶實(shí)際支付結(jié)果。注意一定不能以客戶端返回作為用戶支付的結(jié)果,應(yīng)以服務(wù)器端的接收的支付通知或查詢API返回的結(jié)果為準(zhǔn)。
參考:
[1] https://blog.csdn.net/zhouxiangyu666666/article/details/71136906
[2] https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=8_3
