javascript
微信 JSAPI 支付流程
微信支付分為5種:
Jsapi支付,二維碼支付,H5支付,小程序支付,App支付
Jsapi支付流程:
(1) 通過oauth協議獲取open_id
a.第一步:用戶同意授權,獲取code
在確保微信公眾賬號擁有授權作用域(scope參數)的權限的前提下(服務號獲得高級接口后,默認擁有scope參數中的snsapi_base和snsapi_userinfo),引導關注者打開如下頁面:
https://open.weixin.qq.com/connect/oauth2/authorize?appid=APPID&redirect_uri=REDIRECT_URI&response_type=code&scope=SCOPE&state=STATE#wechat_redirect
b.第二步:通過code換取網頁授權access_token
首先請注意,這里通過code換取的是一個特殊的網頁授權access_token,與基礎支持中的access_token(該access_token用于調用其他接口)不同。獲取code后,請求以下鏈接獲取access_token:
https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code
(2) 調用統一接口
(URL地址:https://api.mch.weixin.qq.com/pay/unifiedorder)必填參數:
trade_type:jsapi, open_id:用授權獲取的open_id Appid:企業號corpid即為此appId Mch_id:微信支付分配的商戶號 Notify_url:異步回調的url nonce_str:隨機字符串 Sign:簽名 Body:商品描述 out_trade_no:商戶訂單號自己生成的(當前時間加時間戳) total_fee:金額(分)(3) 這些參數使用xml格式發送給微信的統一下單接口,并返回兩個參數return_code為success時,微信端再次返回result_code為success時返回兩個參數prepay_id,trade_type。
簡單來說:微信給我們返回兩個success時就會給我們返回prepay_id和trade_type。
(4) 返回的參數我們進行處理,處理成我們所需要的參數有:
生成paysign流程:公眾賬號+設備號+商戶號+隨機數+key,按照ASCII編碼進行排序,鍵值對形式(key1=value1&key2=value2&key3=value3…),將得到的結果用MD5加密且轉換為大寫
(5) 微信支付界面調起配置分為兩種:
a.一種是使用微信的內置對象WeixinJSBridge,把我們提前處理微信的返回參數放入getBrandWCPayRequest中
b.另一種是調用jssdk包,但是前提需要配置jssdk包wx.config,再配置微信支付,把我們提前處理微信的返回參數放入wx.chooseWXPay,喚起微信支付頁面。
發起一個微信支付請求
備注:prepay_id 通過微信支付統一下單接口拿到,paySign 采用統一的微信支付 Sign 簽名生成方法,注意這里 appId 也要參與簽名,appId 與 config 中傳入的 appId 一致,即最后參與簽名的參數有appId, timeStamp, nonceStr, package, signType。
(6) 用戶支付成功微信端會向我們填寫的異步回調地址發起請求,給我們提示支付狀態。我們需要返回一個success,
<xml> <return_code><![CDATA[SUCCESS]]></return_code><return_msg><![CDATA[OK]]></return_msg></xml>讓微信端知道我們知道的微信支付成功了。如果我們沒給微信端返回success或超時,微信會判定本次通知失敗,重新發送通知,直到成功為止(在通知一直不成功的情況下,微信總共會發起10次通知,通知頻率為15s/15s/30s/3m/10m/20m/30m/30m/30m/60m/3h/3h/3h/6h/6h - 總計 24h4m),但微信不保證通知最終一定能成功。
(7) 當然我不能相信微信給我們的支付狀態,因為這個回調url,別人可以模擬出一個url,微信端就會向模擬出來的回調地址發送請求,會發生用戶付過錢了但是沒有訂單的情況,這是很不安全的。所以我們不能相信微信給我們返回的,我們需要異步向微信查詢訂單接口,查詢訂單的支付狀態
(8) 如果我們使用jssdk包,那么我們還需要通過配置wx.config。而wx.config的參數signature是通過。參考:
https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421141115
a. 第一步獲取access_token
https請求方式: GET
https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET
b. 第二步獲取jsapi_ticket
用第一步拿到的access_token 采用http GET方式請求獲得jsapi_ticket(有效期7200秒,開發者必須在自己的服務全局緩存jsapi_ticket):
https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=ACCESS_TOKEN&type=jsapi
c. 第三步生成signature
簽名算法
簽名生成規則如下:參與簽名的字段包括noncestr(隨機字符串), 有效的jsapi_ticket, timestamp(時間戳), url(當前網頁的URL,不包含#及其后面部分) 。對所有待簽名參數按照字段名的ASCII 碼從小到大排序(字典序)后,使用URL鍵值對的格式(即key1=value1&key2=value2…)拼接成字符串string1。這里需要注意的是所有參數名均為小寫字符。對string1作sha1加密,字段名和字段值都采用原始值,不進行URL 轉義。即signature=sha1(string1)。
wx.config({debug: true, // 開啟調試模式,調用的所有api的返回值會在客戶端alert出來,若要查看傳入的參數,可以在pc端打開,參數信息會通過log打出,僅在pc端時才會打印。appId: '', // 必填,公眾號的唯一標識timestamp: , // 必填,生成簽名的時間戳nonceStr: '', // 必填,生成簽名的隨機串signature: '',// 必填,簽名jsApiList: [] // 必填,需要使用的JS接口列表 });總結
以上是生活随笔為你收集整理的微信 JSAPI 支付流程的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 找实习经历分享(三)
- 下一篇: 怎么高效的通过爬虫获取数据?