背景:最近做項目,甲方提出一個需要要求在手機端直接微信注冊成功后,直接登錄並發起微信支付。再三思考后,才決定使用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生成新的支付簽名。
以上便是我在做微信支付過程中的總結,若有描述不當的請評論提出哦!
