微信支付 - JSAPI總結

背景:最近作項目,甲方提出一個須要要求在手機端直接微信註冊成功後,直接登陸併發起微信支付。再三思考後,才決定使用jsapi微信支付。php

微信支付官方文檔:https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=7_1html

首先微信普通商戶版有NATIVE支付、JSAPI支付、APP支付、H5支付、付款碼支付、小程序支付;其中我認爲做爲web開發的最經常使用的是native、jsapi、h5支付了。可是jsapi支付在官方微信支付文檔中,留下了不少坑,致使在使用過程當中無比麻煩,下面具體來講說,但願能對各位看客有點幫助。前端

1.微信支付最麻煩的即是公衆平臺和商戶平臺的配置,將公衆號APPID、APPSECRET,商戶號appid、祕鑰key配置好。web

商戶平臺:(https://pay.weixin.qq.com/)小程序

1)微信商戶平臺->產品中心->個人產品,查看你要的支付類型是否開通,未開通,則申請開通,按照開通流程走,主要是申請安裝證書便可。api

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生成新的支付簽名。

以上即是我在作微信支付過程當中的總結,如有描述不當的請評論提出哦!

相關文章
相關標籤/搜索