隨着微信小程序的發展,愈來愈多的移動端應用選擇了微信產品作爲媒介。不管是公衆號開發仍是小程序開發,微信支付永遠都是繞不開的話題。因爲微信支付涉及了不少場景,本文咱們只學習如何在公衆號、小程序中接入微信支付。html
微信公衆號大致上能夠分爲服務號和訂閱號,訂閱號和服務號的具體區別在之前寫過的一篇文章Spring Boot開發微信公衆號中具體介紹了,這裏就再也不贅述,總的來講就是服務號提供了更高級的功能。前端
微信支付接入須要已經完成微信認證的服務號。若是是小程序的話,也須要完成微信認證。面試
公衆號能夠關聯同一主體的10個小程序,不一樣主體的3個小程序,若是是和公衆號同一主體的小程序而且公衆號已經完成認證,則直接能夠在公衆號後臺的小程序管理
中,進行快速註冊並認證,這樣就無需重複支付微信認證所需的300
RMB了。小程序
微信認證完成後,在公衆號後臺的 微信支付
中開通微信支付功能。提交微信支付申請後,3-5個工做日內,會進行審覈,審覈經過後會往你填寫的郵箱裏發送一份包含商戶號信息的郵件,同時會往你填寫的對公帳戶中打幾毛錢的匯款,須要你查看具體金額後在商戶平臺中驗證。微信小程序
商戶分爲普通商戶和服務商商戶,千萬不要申請錯了。api
普通商戶是能夠進行交易,可是不能拓展商戶。瀏覽器
服務商能夠拓展商戶,可是不能交易。安全
服務商就是提供統一的支付入口,它須要綁定具體的普通商戶,微信支付時會在支付接口中攜帶普通商戶參數,支付成功後金額會直接到具體的普通商戶帳戶上。服務器
申請時直接申請普通商戶就能夠了。微信
微信支付發起依賴於公衆號、小程序等應用與商戶號的綁定關係。所以在進行開發前,須要將商戶與具體應用進行綁定。
若是商戶和須要綁定的AppID是同一主體,只須要如下步驟便可完成綁定。
若是商戶和須要綁定的AppID是不一樣主體,步驟和上述同樣,除了輸入AppId以外,還須要填入AppId的認證信息。
1. 付款碼支付
用戶打開微信錢包-付款碼的界面,商戶掃碼後提交完成支付。
2. JSAPI支付
用戶經過微信掃碼,關注公衆號等方式進入商家H5頁面,並在微信內調用JSSDK完成支付。
3. Native支付
用戶打開微信掃一掃,掃描商戶的二維碼後完成支付。
4. APP支付
商戶APP中集成微信SDK,用戶點擊後跳轉到微信內完成支付。
5. H5支付
用戶在微信之外的手機瀏覽器請求微信支付的場景喚起微信支付。
6. 小程序支付
用戶在微信小程序中使用微信支付的場景。
7. 刷臉支付
無需掏出手機,刷臉完成支付,適合線下各類場景。
在商戶平臺-產品中心-個人產品中申請開通支付產品。
在商戶平臺-產品中心-開發配置中進行支付受權目錄的配置(即你開發的下單接口地址),須要注意的是受權目錄最多能夠配置五個,在開發過程當中請合理定義支付接口。
在商戶平臺-帳戶中心-API安全中設置API密鑰。
第一次設置時,須要安裝操做證書,傻瓜式安裝,按照提示一步一步操做就能夠。
API密鑰須要時一個32位的隨機字符串,記得不要隨意更改API密鑰。
在微信API v3版本中,除了要配置API密鑰外,還須要配置APIv3密鑰和申請CA頒發的API證書。
若是使用開源的微信開發包,請了解是否支持v3版本。
在公衆號後臺-開發-基本配置-服務器配置中啓用並填寫服務器信息。
在公衆號後臺-開發-基本配置-公衆號開發信息中配置開發者密鑰,同時填寫IP白名單。
在公衆號後臺-公衆號設置-功能設置中設置JS接口安全域名。
上面的配置是基於公衆號支付配置的,小程序支付沒有這麼麻煩,小程序支付不用配置支付受權目錄和受權域名。
JSAPI | 小程序 | |
---|---|---|
支付協議 | HTTP/HTTPS | HTTPS |
支付目錄 | 有 | 無 |
受權域名 | 有 | 無 |
因爲微信升級了API接口,在API v3接口中,須要加載申請的API證書,微信已經封裝了相關jar包,而且提供了加載示例,具體可參考「https://pay.weixin.qq.com/wik... v2爲例詳細學習一下微信接入的主要流程(由於API v3的一些接口還在持續升級,v2接口相對完整)。
上面的這張圖片來自微信開發文檔,咱們詳細分析一下支付流程。
用戶經過微信客戶端發起支付,在商戶後臺生成訂單,而後調用微信下單接口,生成預支付訂單,返回訂單號!
下單接口涉及到的主要參數,只列舉重要的幾個參數:
請求參數 | 是否必傳 | 類型 | 描述 |
---|---|---|---|
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
拉起微信支付,輸入密碼,完成支付。這一步須要在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,但並不保證它絕對可靠。
爲何這麼說呢,我舉個例子應該就明白了。假如你去超市買東西,是否是你說支付成功了你就能夠把東西帶走呢?確定不是,是當商家收到錢後纔算你支付成功,你才能夠把東西帶走。也就是說,這裏提示的成功並不能說必定支付成功了,具體是否成功,微信平臺會以異步的方式給你進行通知。
異步通知是比較重要的一步,在這裏你能夠根據通知結果處理你的業務邏輯。可是,可能會因爲網絡波動等緣由通知不到,或者說微信接收到的響應不符合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 | 返回信息 |
若是微信一直通知不成功怎麼?仍是剛纔那個例子,你明明支付成功了,可是商家卻一直說她沒收到錢,這時候你怎麼辦?確定是去看一下她的手機是否真的沒有收到錢!這裏也同樣。
微信支付查單接口
,同步訂單狀態。本文主要以公衆號支付爲例,總結了接入微信支付須要的相關配置和支付流程。其餘支付像APP支付也是開發中比較常見的應用場景,APP支付須要在 微信開放平臺
去建立應用來接入微信支付。除此以外,微信支付API在向v3平滑升級,有些接口也尚未升級完成,升級完的接口相較於v2發生了一些數據格式方面的變化。若是引用第三方開發包進行開發,須要注意接口對應的版本。
微信支付開發文檔
若是以爲文章不錯,歡迎關注、點贊、收藏,大家的支持是我創做的動力,感謝你們。
若是文章寫的有問題,請不要吝惜文筆,歡迎留言指出,我會及時覈查修改。
若是你還想看到更多別的東西,能夠微信搜索「Java旅途」進行關注。回覆「手冊」領取Java面試手冊!