日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

微信 JSAPI 支付流程

發(fā)布時(shí)間:2023/12/31 javascript 42 豆豆
生活随笔 收集整理的這篇文章主要介紹了 微信 JSAPI 支付流程 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

微信支付分為5種:
Jsapi支付,二維碼支付,H5支付,小程序支付,App支付

Jsapi支付流程:

(1) 通過oauth協(xié)議獲取open_id

a.第一步:用戶同意授權(quán),獲取code
在確保微信公眾賬號擁有授權(quán)作用域(scope參數(shù))的權(quán)限的前提下(服務(wù)號獲得高級接口后,默認(rèn)擁有scope參數(shù)中的snsapi_base和snsapi_userinfo),引導(dǎo)關(guān)注者打開如下頁面:
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換取網(wǎng)頁授權(quán)access_token
首先請注意,這里通過code換取的是一個(gè)特殊的網(wǎng)頁授權(quán)access_token,與基礎(chǔ)支持中的access_token(該access_token用于調(diào)用其他接口)不同。獲取code后,請求以下鏈接獲取access_token:
https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code

(2) 調(diào)用統(tǒng)一接口

(URL地址:https://api.mch.weixin.qq.com/pay/unifiedorder)必填參數(shù):

trade_type:jsapi, open_id:用授權(quán)獲取的open_id Appid:企業(yè)號corpid即為此appId Mch_id:微信支付分配的商戶號 Notify_url:異步回調(diào)的url nonce_str:隨機(jī)字符串 Sign:簽名 Body:商品描述 out_trade_no:商戶訂單號自己生成的(當(dāng)前時(shí)間加時(shí)間戳) total_fee:金額(分)

(3) 這些參數(shù)使用xml格式發(fā)送給微信的統(tǒng)一下單接口,并返回兩個(gè)參數(shù)return_code為success時(shí),微信端再次返回result_code為success時(shí)返回兩個(gè)參數(shù)prepay_id,trade_type。
簡單來說:微信給我們返回兩個(gè)success時(shí)就會(huì)給我們返回prepay_id和trade_type。
(4) 返回的參數(shù)我們進(jìn)行處理,處理成我們所需要的參數(shù)有:

appId:商戶注冊具有支付權(quán)限的公眾號成功后即可獲得timeStamp:時(shí)間戳nonceStr:隨機(jī)字符串Package:統(tǒng)一下單接口返回的prepay_id參數(shù)值,提交格式如:prepay_id=*** signType:簽名類型(HMAC-SHA256)這里的簽名方式和統(tǒng)一下單方式一致Paysign:簽名

生成paysign流程:公眾賬號+設(shè)備號+商戶號+隨機(jī)數(shù)+key,按照ASCII編碼進(jìn)行排序,鍵值對形式(key1=value1&key2=value2&key3=value3…),將得到的結(jié)果用MD5加密且轉(zhuǎn)換為大寫

(5) 微信支付界面調(diào)起配置分為兩種:
a.一種是使用微信的內(nèi)置對象WeixinJSBridge,把我們提前處理微信的返回參數(shù)放入getBrandWCPayRequest中

b.另一種是調(diào)用jssdk包,但是前提需要配置jssdk包wx.config,再配置微信支付,把我們提前處理微信的返回參數(shù)放入wx.chooseWXPay,喚起微信支付頁面。
發(fā)起一個(gè)微信支付請求

wx.chooseWXPay({timestamp: 0, // 支付簽名時(shí)間戳,注意微信jssdk中的所有使用timestamp字段均為小寫。但最新版的支付后臺(tái)生成簽名使用的timeStamp字段名需大寫其中的S字符nonceStr: '', // 支付簽名隨機(jī)串,不長于 32 位package: '', // 統(tǒng)一支付接口返回的prepay_id參數(shù)值,提交格式如:prepay_id=\*\*\*)signType: '', // 簽名方式,默認(rèn)為'SHA1',使用新版支付需傳入'MD5'paySign: '', // 支付簽名success: function (res) {// 支付成功后的回調(diào)函數(shù)}});

備注:prepay_id 通過微信支付統(tǒng)一下單接口拿到,paySign 采用統(tǒng)一的微信支付 Sign 簽名生成方法,注意這里 appId 也要參與簽名,appId 與 config 中傳入的 appId 一致,即最后參與簽名的參數(shù)有appId, timeStamp, nonceStr, package, signType。

(6) 用戶支付成功微信端會(huì)向我們填寫的異步回調(diào)地址發(fā)起請求,給我們提示支付狀態(tài)。我們需要返回一個(gè)success,

<xml> <return_code><![CDATA[SUCCESS]]></return_code><return_msg><![CDATA[OK]]></return_msg></xml>

讓微信端知道我們知道的微信支付成功了。如果我們沒給微信端返回success或超時(shí),微信會(huì)判定本次通知失敗,重新發(fā)送通知,直到成功為止(在通知一直不成功的情況下,微信總共會(huì)發(fā)起10次通知,通知頻率為15s/15s/30s/3m/10m/20m/30m/30m/30m/60m/3h/3h/3h/6h/6h - 總計(jì) 24h4m),但微信不保證通知最終一定能成功。
(7) 當(dāng)然我不能相信微信給我們的支付狀態(tài),因?yàn)檫@個(gè)回調(diào)url,別人可以模擬出一個(gè)url,微信端就會(huì)向模擬出來的回調(diào)地址發(fā)送請求,會(huì)發(fā)生用戶付過錢了但是沒有訂單的情況,這是很不安全的。所以我們不能相信微信給我們返回的,我們需要異步向微信查詢訂單接口,查詢訂單的支付狀態(tài)
(8) 如果我們使用jssdk包,那么我們還需要通過配置wx.config。而wx.config的參數(shù)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秒,開發(fā)者必須在自己的服務(wù)全局緩存jsapi_ticket):
https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=ACCESS_TOKEN&type=jsapi
c. 第三步生成signature

簽名算法

簽名生成規(guī)則如下:參與簽名的字段包括noncestr(隨機(jī)字符串), 有效的jsapi_ticket, timestamp(時(shí)間戳), url(當(dāng)前網(wǎng)頁的URL,不包含#及其后面部分) 。對所有待簽名參數(shù)按照字段名的ASCII 碼從小到大排序(字典序)后,使用URL鍵值對的格式(即key1=value1&key2=value2…)拼接成字符串string1。這里需要注意的是所有參數(shù)名均為小寫字符。對string1作sha1加密,字段名和字段值都采用原始值,不進(jìn)行URL 轉(zhuǎn)義。即signature=sha1(string1)。

wx.config({debug: true, // 開啟調(diào)試模式,調(diào)用的所有api的返回值會(huì)在客戶端alert出來,若要查看傳入的參數(shù),可以在pc端打開,參數(shù)信息會(huì)通過log打出,僅在pc端時(shí)才會(huì)打印。appId: '', // 必填,公眾號的唯一標(biāo)識timestamp: , // 必填,生成簽名的時(shí)間戳nonceStr: '', // 必填,生成簽名的隨機(jī)串signature: '',// 必填,簽名jsApiList: [] // 必填,需要使用的JS接口列表 });

總結(jié)

以上是生活随笔為你收集整理的微信 JSAPI 支付流程的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。