微信支付 - JSAPI總結
背景:最近做專案,甲方提出一個需要要求在手機端直接微信註冊成功後,直接登入併發起微信支付。再三思考後,才決定使用jsapi微信支付。
微信支付官方文件:https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=7_1
首先微信普通商戶版有NATIVE支付、JSAPI支付、APP支付、H5支付、付款碼支付、小程式支付;其中我認為作為web開發的最常用的是native、jsapi、h5支付了。但是jsapi支付在官方微信支付文件中,留下了很多坑,導致在使用過程中無比麻煩,下面具體來說說,希望能對各位看客有點幫助。
1.微信支付最麻煩的便是公眾平臺和商戶平臺的配置,將公眾號APPID、APPSECRET,商戶號appid、祕鑰key配置好。
商戶平臺:(https://pay.weixin.qq.com/)
1)微信商戶平臺->產品中心->我的產品,檢視你要的支付型別是否開通,未開通,則申請開通,按照開通流程走,主要是申請安裝證書即可。
2)微信商戶平臺->產品中心->開發配置,檢視支付配置是否已經配置成功。native支付則配置掃碼支付回撥地址,jsapi支付則配置公眾號支付授權目錄,該目錄最多可新增5個,如發起支付頁面為:http://baidu.com/index.html,則目錄配置為:http://baidu.com/;如發起支付頁面為:http://baidu.com/wxpay/index.html,則目錄配置為:http://baidu.com/wxpay/; (這一步很關鍵,不然會在發起支付時提示註冊url無效)
3)微信商戶平臺->賬戶中心->賬戶設定->API安全,檢視是否已經設定了商戶金鑰key,此金鑰在後面生成簽名sign中特別重要,必須設定,設定成功後記住金鑰;
以上是商戶平臺的配置;
微信公眾平臺:(https://mp.weixin.qq.com/)
1)微信公眾平臺->開發->基本配置,檢視開發者密碼AppSecret是否已經設定;
2)微信公眾平臺->設定->公眾號設定,檢視網頁回撥地址是否已經配置好,在這裡我將所有的域名配置都配置好了。需要將MP_verify_MHYOHtHKmJzSkCj0.txt檔案放置到專案的根目錄下,只要訪問域名後可以訪問到就可以,如配置域名:baidu.com,則訪問http://baidu.com/MP_verify_MHYOHtHKmJzSkCj0.txt時訪問得到就表示配置成功。
以上是公眾平臺需要的配置。
2.配置完後,檢視商戶平臺的jsapi微信支付開發文件:https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=7_1,在微信瀏覽器內發起支付之前,必須先獲得預支付訂單號prepay_id,也就是這個訂單號,需要大費周折的去拼接各種資料;
1)由於獲取prepay_id的必填引數中有openid,所以先獲取openid,通過公眾平臺網頁授權來獲取。
微信公眾平臺->開發->介面許可權->網頁服務->網頁授權(網頁授權獲取使用者基本資訊 https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140842)
第一步:使用者同意授權,獲取code:
https://open.weixin.qq.com/connect/oauth2/authorize?appid=APPID&redirect_uri=REDIRECT_URI&response_type=code&scope=SCOPE&state=STATE#wechat_redirect
引數說明:APPID:微信公眾平臺AppId;
REDIRECT_URI:回撥地址,在配置時需要配置域名,此處的回撥地址域名必須與配置的一致否則無效。
SCOPE:預設擁有scope引數中的snsapi_base和snsapi_userinfo,此處是jsapi支付,必須使用snsapi_userinfo,否則會出現“此公眾號並沒有這些scope的許可權,錯誤碼:10005”的提示;
STATE:隨機引數,可以用來區分或者攜帶其他引數到回撥地址中;
返回值:code作為換取access_token的臨時票據和state隨機引數。
第二步:通過code換取網頁授權access_token:
https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code
引數說明:APPID:微信公眾平臺AppId;
SECRET:微信公眾號金鑰,需要配置;
CODE:第一步獲得的code引數;
返回值:access_token和openid,此處只寫明這兩個較為重要的引數。
到目前為止便得到了openid。可以進行統一下單了。
2).檢視API列表->統一下單(呼叫該介面是為了在微信支付服務後臺生成預支付交易單)
介面連結:https://api.mch.weixin.qq.com/pay/unifiedorder
請求引數:https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=9_1檢視官方文件,此處重點點名:openid,此次為JSAPI,所以必填;sign簽名是整個請求引數中最難生成的。
當返回結果return_code 和result_code都為SUCCESS,可以獲得prepay_id.
3)得到預訂單號後,就可以在微信內建瀏覽器中發起支付。將統一下單介面返回的資料中拿到appid、nonce_str、prepay_id,並結合signType、timeStamp、key(商戶號)通過MD5加密返回paySign支付簽名,將這些資料一併返回前端頁面呼叫微信內建物件WeixinJSBridge,發起支付。(微信內h5調起支付連結:https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=7_7&index=6)
整個支付就到此結束了。
在這個過程中,我遇到的最慘痛的難點就是支付簽名paySign的生成,因為在微信統一下單介面返回的資料中還包含了sign簽名的返回,我一直以為可以使用這個作為支付簽名。然而在網上找了很多大佬的總結後,都說統一下單介面返回的sign的簽名加密方式不是MD5,然而支付簽名必須是MD5加密而造成的。但是我覺得不是,因為我已經明確在下單介面中的引數signType寫明就是MD5了,所以表示 下單介面返回的sign並不能作為微信發起支付的簽名paySign 。必須自己重新根據返回的prepay_id生成新的支付簽名。
以上便是我在做微信支付過程中的總結,若有描述不當的請評論提出哦!