眾所周知,微信提供了APP、公眾號害碾、小程序、H5及掃碼等支付方式赦拘,而本文需要實現(xiàn)微信"掃一掃"自定義二維碼支付功能慌随;
而掃碼支付中用到的二維碼是微信規(guī)范的二維碼(weixin://),H5需要在非微信瀏覽器才能打開躺同;因此只剩下了公眾號(或小程序)阁猜,本文基于公眾號支付為大家講解下整個流程
步驟1. 準(zhǔn)備appid、appsecret蹋艺、支付key
進入微信公眾平臺剃袍,可以查到appid、appsecret捎谨;進入微信支付平臺民效,可以找到支付key
步驟2. 獲取openid
微信下單需要用到openid憔维,因此需要先獲取openid,可參考【獲取openid 】:
(1)按微信要求實現(xiàn)服務(wù)回調(diào)接口
(2)用戶訪問如下地址畏邢,獲取code
https://open.weixin.qq.com/connect/oauth2/authorize?appid=APPID&redirect_uri=REDIRECT_URI&response_type=code&scope=SCOPE&state=STATE#wechat_redirect
PS: scope為snsapi_base可以實現(xiàn)用戶免授權(quán)业扒,如果是snsapi_userinfo需要用戶同意,本需求采用snsapi_base
REDIRECT_URI地址需要在微信公眾號配置棵红,可以配置根路徑
(3)微信校驗通過后凶赁,調(diào)用我們服務(wù)的redirect_uri/?code=CODE&state=STATE
(4)通過code換取openid
https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code
PS:通過上述接口咧栗,微信服務(wù)會返回openid
步驟3. 下單逆甜,獲取prepay_id
調(diào)用微信公眾號的統(tǒng)一下單接口
POST https://api.mch.weixin.qq.com/pay/unifiedorder
<xml>
<appid>wxbbe68ee8fadsf</appid>
<attach>test</attach>
<body>騰訊充值中心-QQ會員充值</body>
<mch_id>1435628102</mch_id>
<nonce_str>1add1a30ac87aa2db72f57a2375d8fec</nonce_str>
<notify_url>http://www.weixin.qq.com/wxpay/pay.php</notify_url>
<out_trade_no>1415659999</out_trade_no>
<spbill_create_ip>110.90.119.97</spbill_create_ip>
<scene_info>{"h5_info": {"type":"Wap","wap_url": "https://pay.qq.com","wap_name": "騰訊充值"}}</scene_info>
<total_fee>1</total_fee>
<openid>ouytHt3crrPI1s2LHAs</openid>
<trade_type>JSAPI</trade_type>
<sign>2B753269B6A69A46615D54AFD047AB2A</sign>
</xml>
PS: total_fee是按分計算,sign按微信定義計算致板,可以通過微信提供的 sign校驗工具 校驗
如果成功會返回prepay_id
步驟4. 支付
function onBridgeReady(){
WeixinJSBridge.invoke(
'getBrandWCPayRequest', {
"appId":"wxbbe68ee8fadsf", //公眾號名稱交煞,由商戶傳入
"timeStamp": '{{timeStamp}}', //時間戳,自1970年以來的秒數(shù)
"nonceStr":'{{nonceStr}}', //隨機串
"package": '{{prepayID}}',
"signType":"MD5", //微信簽名方式:
"paySign":'{{paySign}}' //微信簽名
},
function(res){
alert(res.err_msg);
if(res.err_msg == "get_brand_wcpay_request:ok" ) {} // 使用以上方式判斷前端返回,微信團隊鄭重提示:res.err_msg將在用戶支付成功后返回 ok斟或,但并不保證它絕對可靠素征。
}
);
}
PS: prepayID填入上一步的prepay_id,paySign也是利用微信sign算法
上述過程完成后萝挤,即可彈出支付界面御毅,用戶輸入支付密碼確認支付后,即可完成怜珍,我們服務(wù)端根據(jù)回調(diào)接口notify_url進行后續(xù)的業(yè)務(wù)
總結(jié)
通過以上過程端蛆,我們可以自定義鏈接(即二維碼),微信掃描我們二維碼酥泛,跳轉(zhuǎn)至我們自己的H5界面今豆,我們在H5展現(xiàn)商品信息,并包含"去支付"按鈕柔袁,用戶點擊支付后呆躲,我們重定向至獲取code接口;之后在我們自己服務(wù)端完成下單捶索、并返回帶支付信息的H5插掂,用戶點擊確認支付按鈕,JS調(diào)用微信公眾號的WeixinJSBridge.invoke接口腥例,彈出微信自身的支付界面辅甥,用戶輸入密碼并支付,我們根據(jù)支付回調(diào)院崇,調(diào)用后續(xù)業(yè)務(wù)肆氓。
以上過程,用戶不需要關(guān)注公眾號底瓣,非常便捷谢揪,適用于停車場支付等場景蕉陋。