隨著微信小程式的發展,越來越多的移動端應用選擇了微信產品做為媒介。無論是公眾號開發還是小程式開發,微信支付永遠都是繞不開的話題。由於微信支付涉及了很多場景,本文我們只學習如何在公眾號、小程式中接入微信支付。
一、微信支付的前提條件
1.1 公眾號
微信公眾號大體上可以分為服務號和訂閱號,訂閱號和服務號的具體區別在以前寫過的一篇文章Spring Boot開發微信公眾號中具體介紹了,這裡就不再贅述,總的來說就是服務號提供了更高階的功能。
微信支付接入需要已經完成微信認證的服務號。如果是小程式的話,也需要完成微信認證。
公眾號可以關聯同一主體的10個小程式,不同主體的3個小程式,如果是和公眾號同一主體的小程式並且公眾號已經完成認證,則直接可以在公眾號後臺的小程式管理
中,進行快速註冊並認證,這樣就無需重複支付微信認證所需的300
RMB了。
1.2 微信商戶平臺
微信認證完成後,在公眾號後臺的 微信支付
中開通微信支付功能。提交微信支付申請後,3-5個工作日內,會進行稽核,稽核通過後會往你填寫的郵箱裡傳送一份包含商戶號資訊的郵件,同時會往你填寫的對公賬戶中打幾毛錢的匯款,需要你檢視具體金額後在商戶平臺中驗證。
商戶分為普通商戶和服務商商戶,千萬不要申請錯了。
普通商戶是可以進行交易,但是不能擴充商戶。
服務商可以擴充商戶,但是不能交易。
服務商就是提供統一的支付入口,它需要繫結具體的普通商戶,微信支付時會在支付介面中攜帶普通商戶引數,支付成功後金額會直接到具體的普通商戶賬戶上。
申請時直接申請普通商戶就可以了。
1.3 繫結商戶
微信支付發起依賴於公眾號、小程式等應用與商戶號的繫結關係。因此在進行開發前,需要將商戶與具體應用進行繫結。
如果商戶和需要繫結的AppID是同一主體,只需要以下步驟即可完成繫結。
- 在商戶平臺-產品中心-AppID賬戶管理中關聯AppID,輸入AppId申請繫結
- 在公眾號或小程式後臺微信支付-商戶號管理中進行確認。
如果商戶和需要繫結的AppID是不同主體,步驟和上述一樣,除了輸入AppId之外,還需要填入AppId的認證資訊。
二、微信支付相關配置
2.1 支付產品型別
1. 付款碼支付
使用者開啟微信錢包-付款碼的介面,商戶掃碼後提交完成支付。
2. JSAPI支付
使用者通過微信掃碼,關注公眾號等方式進入商家H5頁面,並在微信內呼叫JSSDK完成支付。
3. Native支付
使用者開啟微信掃一掃,掃描商戶的二維碼後完成支付。
4. APP支付
商戶APP中整合微信SDK,使用者點選後跳轉到微信內完成支付。
5. H5支付
使用者在微信以外的手機瀏覽器請求微信支付的場景喚起微信支付。
6. 小程式支付
使用者在微信小程式中使用微信支付的場景。
7. 刷臉支付
無需掏出手機,刷臉完成支付,適合線下各種場景。
在商戶平臺-產品中心-我的產品中申請開通支付產品。
2.2 支付授權目錄配置
在商戶平臺-產品中心-開發配置中進行支付授權目錄的配置(即你開發的下單介面地址),需要注意的是授權目錄最多可以配置五個,在開發過程中請合理定義支付介面。
2.3 配置商戶金鑰
在商戶平臺-賬戶中心-API安全中設定API金鑰。
第一次設定時,需要安裝操作證照,傻瓜式安裝,按照提示一步一步操作就可以。
API金鑰需要時一個32位的隨機字串,記得不要隨意更改API金鑰。
在微信API v3版本中,除了要配置API金鑰外,還需要配置APIv3金鑰和申請CA頒發的API證照。
-
API v3金鑰主要用於平臺證照解密、回撥資訊解密。
-
API證照用於呼叫更高階別的api介面,包含退款、紅包等介面。
如果使用開源的微信開發包,請了解是否支援v3版本。
2.4 配置伺服器
在公眾號後臺-開發-基本配置-伺服器配置中啟用並填寫伺服器資訊。
2.5 白名單配置
在公眾號後臺-開發-基本配置-公眾號開發資訊中配置開發者金鑰,同時填寫IP白名單。
2.6 JS介面安全域名
在公眾號後臺-公眾號設定-功能設定中設定JS介面安全域名。
上面的配置是基於公眾號支付配置的,小程式支付沒有這麼麻煩,小程式支付不用配置支付授權目錄和授權域名。
JSAPI | 小程式 | |
---|---|---|
支付協議 | HTTP/HTTPS | HTTPS |
支付目錄 | 有 | 無 |
授權域名 | 有 | 無 |
三、微信支付流程
由於微信升級了API介面,在API v3介面中,需要載入申請的API證照,微信已經封裝了相關jar包,並且提供了載入示例,具體可參考“https://pay.weixin.qq.com/wiki/doc/apiv3/open/pay/chapter2_3.shtml”,這裡就不再贅述。我們以API v2為例詳細學習一下微信接入的主要流程(因為API v3的一些介面還在持續升級,v2介面相對完整)。
上面的這張圖片來自微信開發文件,我們詳細分析一下支付流程。
3.1 微信下單介面
使用者通過微信客戶端發起支付,在商戶後臺生成訂單,然後呼叫微信下單介面,生成預支付訂單,返回訂單號!
下單介面涉及到的主要引數,只列舉重要的幾個引數:
請求引數 | 是否必傳 | 型別 | 描述 |
---|---|---|---|
appid | 是 | String | 公眾號appid |
mch_id | 是 | String | 商戶號 |
nonce_str | 是 | String | 隨機字串,32位以內 |
sign | 是 | String | 簽名,預設使用MD5進行加密 |
out_trade_no | 是 | String | 系統內部訂單號 |
total_fee | 是 | Int | 訂單總金額,單位是分 |
notify_url | 是 | String | 支付結果通知介面 |
sign
的簽名也比較通用,涉及了一個保證簽名不可預測的nonce_str
- 將所有傳送的非空引數使用字典排序生成鍵值對(key1=value1&key2=value2);
- 將商戶平臺金鑰拼接在上述字串的最後("String"+&key=金鑰);
- 將上述字串採用MD5加密
3.2 支付
拉起微信支付,輸入密碼,完成支付。這一步需要在H5網頁中執行JS調起支付。
需要以下引數,因此在預付訂單返回和,需要將下列引數封裝後響應給頁面,由頁面完成支付。
引數名 | 是否必傳 | 型別 | 描述 |
---|---|---|---|
appId | 是 | String | 公眾號id |
timeStamp | 是 | String | 當前時間戳 |
nonceStr | 是 | String | 隨機字串 |
package | 是 | String | 預支付訂單,格式為prepay_id=*** |
signType | 是 | String | 簽名型別,預設MD5 |
paySign | 是 | String | 簽名 |
簽名和下單介面的簽名方式一樣。
JS虛擬碼如下:
function onBridgeReady(){
WeixinJSBridge.invoke(
'getBrandWCPayRequest', {
// 公眾號ID,由商戶傳入
"appId":"wx2421b1c4370ec43b",
// 時間戳,自1970年以來的秒數
"timeStamp":"1395712654",
// 隨機串
"nonceStr":"e61463f8efa94090b1f366cccfbbb444",
"package":"prepay_id=u802345jgfjsdfgsdg888",
// 微信簽名方式
"signType":"MD5",
// 微信簽名
"paySign":"70EA570631E4BB79628FBCA90534C63FF7FADD89"
},
function(res){
if(res.err_msg == "get_brand_wcpay_request:ok" ){
// 使用以上方式判斷前端返回,微信團隊鄭重提示:
// res.err_msg將在使用者支付成功後返回ok,但並不保證它絕對可靠。
}
});
}
if (typeof WeixinJSBridge == "undefined"){
if( document.addEventListener ){
document.addEventListener('WeixinJSBridgeReady', onBridgeReady, false);
}else if (document.attachEvent){
document.attachEvent('WeixinJSBridgeReady', onBridgeReady);
document.attachEvent('onWeixinJSBridgeReady', onBridgeReady);
}
}else{
onBridgeReady();
}
注意虛擬碼中的這句話 // res.err_msg將在使用者支付成功後返回ok,但並不保證它絕對可靠。
為什麼這麼說呢,我舉個例子應該就明白了。假如你去超市買東西,是不是你說支付成功了你就可以把東西帶走呢?肯定不是,是當商家收到錢後才算你支付成功,你才可以把東西帶走。也就是說,這裡提示的成功並不能說一定支付成功了,具體是否成功,微信平臺會以非同步的方式給你進行通知。
3.3 非同步通知
非同步通知是比較重要的一步,在這裡你可以根據通知結果處理你的業務邏輯。但是,可能會由於網路波動等原因通知不到,或者說微信接收到的響應不符合API的規定,微信會持續發起多次通知(請在回撥通知介面中合理處理,避免重複通知造成業務重複處理),直到成功為止,通知頻率為15s
/15s
/30s
/3m
/10m
/20m
/30m
/30m
/30m
/60m
/3h
/3h
/3h
/6h
/6h
- 總計 24h4m
)。但是微信不保證通知最終一定會成功。
非同步通知響應引數如下:
引數名 | 是否必傳 | 型別 | 描述 |
---|---|---|---|
return_code | 是 | String | 返回狀態碼,SUCCESS /FAIL |
return_msg | 否 | String | 返回資訊 |
如果微信一直通知不成功怎麼?還是剛才那個例子,你明明支付成功了,但是商家卻一直說她沒收到錢,這時候你怎麼辦?肯定是去看一下她的手機是否真的沒有收到錢!這裡也一樣。
3.4 支付狀態查詢
-
商戶APP或者前端頁面收到支付返回時,商戶需要呼叫商戶查單介面確認訂單狀態,並把查詢結果展示給使用者。
-
商戶後臺需要準確、高效地處理微信支付傳送的非同步支付結果通知,並按介面規範把處理結果返回給微信支付。
-
商戶後臺未收到非同步支付結果通知時,商戶應該主動呼叫
微信支付查單介面
,同步訂單狀態。 -
商戶在T+1日從微信支付側獲取T日的交易賬單,並與商戶系統中的訂單核對。如出現訂單在微信支付側成功,但是在商戶側未成功的情況,商戶需要給使用者補發貨或者退款處理。
四、總結
本文主要以公眾號支付為例,總結了接入微信支付需要的相關配置和支付流程。其他支付像APP支付也是開發中比較常見的應用場景,APP支付需要在 微信開放平臺
去建立應用來接入微信支付。除此之外,微信支付API在向v3平滑升級,有些介面也還沒有升級完成,升級完的介面相較於v2發生了一些資料格式方面的變化。如果引用第三方開發包進行開發,需要注意介面對應的版本。
參考
微信支付開發文件
點關注、不迷路
如果覺得文章不錯,歡迎關注、點贊、收藏,你們的支援是我創作的動力,感謝大家。
如果文章寫的有問題,請不要吝惜文筆,歡迎留言指出,我會及時核查修改。
如果你還想看到更多別的東西,可以微信搜尋「Java旅途」進行關注。回覆“手冊”領取Java面試手冊!