uniapp前端實現(xiàn)微信支付功能全過程(小程序、公眾號H5、app)
前言
這段時間通過uniapp開發(fā)一個三端合一的項目,涉及到不同平臺的支付方式,這里為大家簡單介紹一下,希望能有所幫助;
閱讀: 微信支付文檔
一、微信小程序支付
- 通過wx.login()獲取code、調用后端接口獲取openid;
wx.login({ success (res) { if (res.code) { //發(fā)起網(wǎng)絡請求獲取openid,一般是訪問后端封裝好的接口,也可以通過訪問微信官方接口獲取 uni.request({ url: '后端接口地址,獲取openid', method: 'GET', success(res) { //獲取openid:用戶真實唯一id進行保存 console.log(res.data.openid) } }) } else { console.log('登錄失??!' + res.errMsg) } } })
- 調用后端接口創(chuàng)建訂單,獲取orderId;
uni.request({ url: '后端接口地址,獲取訂單id', method: 'POST', data: { 傳入接口需要的參數(shù),如商品金額,商品個數(shù)等 }, success(res) { console.log(res.data.orderId) } })
- 調用后端接口獲取支付核心參數(shù),預支付;
uni.request({ url: '后端接口地址,獲取支付核心數(shù)據(jù)', method: 'POST', data: { 傳入接口需要的參數(shù),如訂單ID,openId等 }, success(res) { console.log(res.data) //接口會返回以下核心參數(shù) //timeStamp 時間戳 //nonceStr 隨機字符串 //package 統(tǒng)一下單接口返回的 prepay_id 參數(shù)值 //signType 簽名算法 //paySign 簽名 } })
- 通過支付核心參數(shù)調用wx.requestPayment()發(fā)起支付;
//調用微信官方支付接口彈出付款界面,輸入密碼扣款 wx.requestPayment({ timeStamp, //時間戳 nonceStr, //隨機字符串 package, //prepay_id signType, //簽名算法MD5 paySign, //簽名 success (res) { if (res.errMsg == "requestPayment:ok"){ console.log('支付成功', res) }else{ console.log('支付失敗') } }, fail (res) { console.log('支付失敗', res) } })
二、公眾號H5支付
支付方式可以參考兩種方式:
- JSAPI 支付:通過JSAPI下單接口獲取到發(fā)起支付的必要參數(shù)prepay_id,然后使用微信支付提供的前端JS方法調起公眾號支付
- 在獲取訂單id、openid后,調用預支付,獲取JSAPI核心參數(shù);
uni.request({ url: '后端接口地址,獲取支付核心數(shù)據(jù)', method: 'POST', data: { 傳入接口需要的參數(shù),如訂單ID,openId等 }, success(res) { //調用下方支付方法 wxpay(res.data) console.log(res.data) //接口會返回以下核心參數(shù) //appId 公眾號ID //timeStamp 時間戳 //nonceStr 隨機字符串 //package 統(tǒng)一下單接口返回的 prepay_id 參數(shù)值 //signType 微信簽名方式RSA //paySign 微信簽名 } })
- 通過JSAPI核心參數(shù)發(fā)起支付;
// 檢測支付環(huán)境中的 WeixinJSBridge function wxpay(data) { if (typeof WeixinJSBridge == "undefined") { if (document.addEventListener) { document.addEventListener('WeixinJSBridgeReady', onBridgeReady(data), false); } else if (document.attachEvent) { document.attachEvent('WeixinJSBridgeReady', onBridgeReady(data)); document.attachEvent('onWeixinJSBridgeReady', onBridgeReady(data)); } } else { onBridgeReady(data); } } function onBridgeReady(data) { WeixinJSBridge.invoke( 'getBrandWCPayRequest', { // 傳入第一步后端接口返回的核心參數(shù) "appId": data.appId, //公眾號 "timeStamp": data.timeStamp, //時間戳 "nonceStr": data.nonceStr, //隨機串 "package": data.package, //prepay_id "signType": data.signType, //微信簽名方式RSA "paySign": data.paySign //微信簽名 }, function(res) { // 支付成功 if (res.err_msg == "get_brand_wcpay_request:ok") { // 使用以上方式判斷前端返回,微信團隊鄭重提示: //res.err_msg將在用戶支付成功后返回ok,但并不保證它絕對可靠。 } // 支付過程中用戶取消 if (res.err_msg == "get_brand_wcpay_request:cancel") { } // 支付失敗 if (res.err_msg == "get_brand_wcpay_request:fail") { } /** * 其它 * 1、請檢查預支付會話標識prepay_id是否已失效 * 2、請求的appid與下單接口的appid是否一致 * */ if (res.err_msg == "調用支付JSAPI缺少參數(shù):total_fee") { } }); }
- 微信公眾號的JSSDK中的wx.chooseWXPay: JS-SDK說明文檔;注意:目前官方文檔取消了chooseWXPay接口,而是推薦JSAPI支付;
- 在項目中需要引入jweixin文件:http://res.wx.qq.com/open/js/jweixin-1.6.0.js
或者通過npm i jweixin-module
使用jWeixin對象; - 通過config接口注入權限驗證配置;
//調用后端接口獲取配置參數(shù) uni.request({ url: '后端接口地址,獲取驗證配置', method: 'POST', data: { 傳入接口需要的參數(shù),如頁面路徑url }, success({data}) { //注入權限驗證配置 jWeixin.config({ debug: false, // 開啟調試模式,調用的所有api的返回值會在客戶端alert出來,若要查看傳入的參數(shù),可以在pc端打開,參數(shù)信息會通過log打出,僅在pc端時才會打印。(測試記得關掉) appId: data.appId, // 公眾號的唯一標識 timestamp: data.timestamp, // 生成簽名的時間戳 nonceStr: data.nonceStr, // 生成簽名的隨機串 signature: data.signature, // 簽名 jsApiList: ['chooseWXPay'], // JS接口列表 }) } })
- 通過ready接口處理成功驗證,調用支付;
jWeixin.ready(function () { // config信息驗證后會執(zhí)行ready方法,所有接口調用都必須在config接口獲得結果之后,config是一個客戶端的異步操作,所以如果需要在頁面加載時就調用相關接口,則須把相關接口放在ready函數(shù)中調用來確保正確執(zhí)行。對于用戶觸發(fā)時才調用的接口,則可以直接調用,不需要放在ready函數(shù)中。 jWeixin.chooseWXPay({ timestamp: data.timeStamp, package: data.package, nonceStr: data.nonceStr, signType: data.signType, paySign: data.paySign, success: function (res: any) { if (res.errMsg == "chooseWXPay:ok") { console.log('支付成功') } else { console.log('支付失敗') }, fail: function (res: any) { console.log('支付失敗') }, }); });
三、app小程序支付
App支付適用于在移動端App中集成微信支付功能的場景。商戶App調用微信提供的SDK調用微信支付模塊,商戶App會跳轉到微信中完成支付,支付完后跳回到商戶App內,最后展示支付結果。具體操作流程如下(流程與小程序類似):
- 登錄獲取openId后,創(chuàng)建訂單獲取訂單ID;(這里需要注意的是使用uni.login喚起微信登錄需要在manifest.json進行相關配置: 鏈接查看)
//登錄 uni.login({ "provider": "weixin", success: function(event){ // 登錄成功,獲取openid const {openid,access_token}= event.authResult //獲取用戶信息 uni.getUserInfo({ provider: 'weixin', success: function(info) { // 獲取用戶信息成功, 調用后端接口進行完成登錄 } }) }, fail: function (err) { // 登錄授權失敗 // err.code是錯誤碼 } }) //登錄成功后在下單時創(chuàng)建訂單 ```javascript uni.request({ url: '后端接口地址,獲取訂單id', method: 'POST', data: { 傳入接口需要的參數(shù),如商品金額,商品個數(shù)等 }, success(res) { console.log(res.data.orderId) } })
- 調用后端接口獲取支付核心參數(shù),預支付;
uni.request({ url: '后端接口地址,獲取支付核心數(shù)據(jù)', method: 'POST', data: { 傳入接口需要的參數(shù),如訂單ID等 }, success(res) { console.log(res.data) //接口會返回以下核心參數(shù) //timeStamp 時間戳 //nonceStr 隨機字符串 //package 統(tǒng)一下單接口返回的 prepay_id 參數(shù)值 //signType 簽名算法 //paySign 簽名 //通過下方api發(fā)起支付 } })
- 調用uni.requestPayment()發(fā)起支付:支付平臺功能申請 -> manifest.json 里配置支付參數(shù) -> uni-app 里調用 API 進行支付 官網(wǎng)流程閱讀
uni.requestPayment({ provider: 'wxpay', orderInfo: data.orderInfo, //微信、支付寶訂單數(shù)據(jù) 【注意微信的訂單信息,鍵值應該全部是小寫,不能采用駝峰命名】 nonceStr: data.noncestr, package: data.package, timeStamp: data.timestamp, signType: data.signType, paySign: data.paySign, success: function (res) { if (e.errMsg == "requestPayment:ok") { console.log('支付成功') }else{ console.log('支付失敗') } }, fail: function (err) { console.log('支付失敗:' + JSON.stringify(err)); } });
總結
- 登錄:調用uni.login/wx.login調用微信接口,獲取code,調用后端后臺獲取openid;
- 訂單:調用后端接口獲取訂單ID,再調用后端接口傳入openid、商品id、商品單價、商品數(shù)量等參數(shù)獲取預支付的重要參數(shù)(時間戳timeStamp,隨機字符串nonceStr,預支付id package,簽名算法signType,簽名paySign)
- 支付:調用uni/wx.requestPayment微信支付方法,傳遞5個重要參數(shù),獲取支付結果(成功或失?。?/li>
- H5支付因為無法直接調用微信api,需要通過JSSDK配置后調用對應的接口;
在開發(fā)中如果涉及到多端支付,需要通過條件編譯處理多端差異,可以參考 官網(wǎng)文檔,在實際開發(fā)中可以多參考各位大佬的文檔找到適合自己項目開發(fā)的方法,也歡迎各位大佬討論、提供建議補充…
到此這篇關于uniapp前端實現(xiàn)微信支付功能的文章就介紹到這了,更多相關uniapp前端微信支付內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
vue3 provide和inject底層組件的值不是響應式的處理詳解
這篇文章主要為大家介紹了vue3 provide和inject底層組件的值不是響應式的處理詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-08-08