微信公眾號(hào)h5使用微信支付及支付寶支付的步驟(前端)
方案:
一、微信支付
考慮到授權(quán)的問(wèn)題,微信支付使用JS-SDK進(jìn)行支付
二、支付寶支付
問(wèn)題:h5微信授權(quán)后是無(wú)法再微信瀏覽器直接打開支付寶的付款鏈接
解決:使用一個(gè)中間頁(yè) 指向通過(guò)跳轉(zhuǎn)到瀏覽器進(jìn)行支付
實(shí)施:
一、微信支付:
第一步微信授權(quán),在main.js中添加路由攔截,獲取code,具體代碼如下 ↓
// main.js
router.beforeEach(async (to: RouteLocationNormalized,from: RouteLocationNormalized,next) => {
// 判斷有沒(méi)有openId 即授權(quán)了直接放行
if (store.state.openId) {
next()
} else {
// 沒(méi)有授權(quán)去授權(quán)獲取code 再放行
const code = await getCode()
await queryInfo(code)
next()
}
})
// 獲取code
function getCode() {
const code = getUrlCode()?.code
if (!code) {
// 沒(méi)有code 請(qǐng)求后端接口進(jìn)行鏈接跳轉(zhuǎn)獲取code(鏈接值微信的授權(quán)鏈接,成功授權(quán)后會(huì)跳回 回調(diào)地址,在回調(diào)地址上 會(huì)攜帶code參數(shù))
return getWxOauthUrl({
redirectUrl: window.location.href
}).then(async ({data}) => {
if (data.statusCode === 0) {
window.location.replace(data.msg)
}
})
} else {
return code
}
}
// 通過(guò)code 獲取用戶信息
function queryInfo(code: string) {
return getUserInfo([code]).then(({data}) => {
const result = data.data || {}
store.commit('getUserInfo', result)
store.commit('getUserOpenId', result.openId)
})
}
// 獲取url 參數(shù)的通用方法
function getUrlCode() {
// 截取url中的code方法
const url = location.search;
const theRequest = new Object();
if (url.indexOf("?") !== -1) {
const str = url.substr(1);
const strs = str.split("&");
for (let i = 0; i < strs.length; i++) {
theRequest[strs[i].split("=")[0]] = strs[i].split("=")[1];
}
}
return theRequest;
}授權(quán)成功后即可以進(jìn)行支付環(huán)節(jié)
核心代碼
// 首先在index.html 中引入微信JS-SDK
<script src="https://res.wx.qq.com/open/js/jweixin-1.6.0.js"></script>
// 然后在支付邏輯中添加以下代碼即可~
if (typeof WeixinJSBridge == "undefined") {
if (document.addEventListener) {
document.addEventListener('WeixinJSBridgeReady', onBridgeReady, false);
} else if (document.attachEvent) {
document.attachEvent('WeixinJSBridgeReady', onBridgeReady);
document.attachEvent('onWeixinJSBridgeReady', onBridgeReady);
}
} else {
onBridgeReady();
}
function onBridgeReady(result) {
WeixinJSBridge.invoke('getBrandWCPayRequest', {
"appId": , //公眾號(hào)ID,由商戶傳入
"timeStamp": , //時(shí)間戳,自1970年以來(lái)的秒數(shù)
"nonceStr": , //隨機(jī)串
"package": ,
"signType": , //微信簽名方式:
"paySign":
},
function (res) {
if ((res.errMsg || res.err_msg) === "get_brand_wcpay_request:ok") {
// 使用以上方式判斷前端返回,微信團(tuán)隊(duì)鄭重提示:
//res.err_msg將在用戶支付成功后返回ok,但并不保證它絕對(duì)可靠。
}
});
}這樣 微信支付就已經(jīng)結(jié)束了
二、支付寶支付:
因?yàn)槭窃谖⑿攀跈?quán)后的h5頁(yè)面,所以不能直接在微信頁(yè)面直接進(jìn)行支付
所以第一步就是在點(diǎn)擊支付的時(shí)候,進(jìn)行跳轉(zhuǎn)到中間頁(yè),
先定義一個(gè)中間頁(yè): pay.html
注意:要把這個(gè)頁(yè)面放到publish目錄下
// 跳轉(zhuǎn)中間頁(yè),把請(qǐng)求支付的參數(shù)一并帶過(guò)去
window.open(`${location.origin}/pay.htm?params=${encodeURIComponent(JSON.stringify(params))}`)pay.html核心內(nèi)容如下
let getQueryString = function (url, name) {
let reg = new RegExp("(^|\\?|&)" + name + "=([^&]*)(\\s|&|$)", "i");
if (reg.test(url)) return RegExp.$2.replace(/\+/g, " ");
};
// 獲取接口返回的表單 進(jìn)行支付
function handlePayForm(data) {
const div = document.createElement("div");
div.setAttribute("id", "payContainer");
div.innerHTML = data
document.body.appendChild(div);
const payContainer = document.querySelector("#payContainer");
const submit = payContainer.querySelector(
'form[name="punchout_form"] input[type="submit"]'
);
submit.click();
setTimeout(function () {
div.remove();
}, 500);
};
if (location.hash.indexOf('error') !== -1) {
alert('參數(shù)錯(cuò)誤,請(qǐng)檢查');
} else {
// 判斷當(dāng)前的瀏覽器環(huán)境是不是微信瀏覽器
let ua = navigator.userAgent.toLowerCase();
let tip = document.querySelector(".weixin-tip");
let tipImg = document.querySelector(".J-weixin-tip-img");
const query = JSON.parse(decodeURIComponent(getQueryString(location.href, 'params')))
if (ua.indexOf('micromessenger') !== -1) {
// 如果是微信里的頁(yè)面,做個(gè)指引(請(qǐng)通過(guò)瀏覽器進(jìn)行支付)
// 這個(gè)頁(yè)面自己定義即可
} else {
// 好的,這是外部瀏覽器,請(qǐng)求接口獲取支付的from表單
axios({
url: '',
data: query,
method: 'POST',
headers: {
'Content-Type': 'application/x-www-form-urlencoded'
}
}).then(({data}) => {
if (data.statusCode === 0) {
// 后端返回的form表單進(jìn)行支付
if (data.data && data.data.returnCode === "SUCCESS") {
// data.data.result ==> 是一個(gè)支付的from表單
handlePayForm(data.data.result)
}
}
})
}
}這樣即可 跳轉(zhuǎn)到微信外部瀏覽器進(jìn)行正常的支付功能
總結(jié)
到此這篇關(guān)于微信公眾號(hào)h5使用微信支付及支付寶支付的文章就介紹到這了,更多相關(guān)公眾號(hào)h5使用微信及支付寶支付內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
JavaScript防抖與節(jié)流的實(shí)現(xiàn)與注意事項(xiàng)
防抖和節(jié)流嚴(yán)格算起來(lái)應(yīng)該屬于性能優(yōu)化的知識(shí),但實(shí)際上遇到的頻率相當(dāng)高,處理不當(dāng)或者放任不管就容易引起瀏覽器卡死,下面這篇文章主要給大家介紹了關(guān)于JavaScript防抖與節(jié)流的實(shí)現(xiàn)與注意事項(xiàng),需要的朋友可以參考下2022-03-03
js判斷復(fù)選框是否選中及選中個(gè)數(shù)的實(shí)現(xiàn)代碼
下面小編就為大家?guī)?lái)一篇js判斷復(fù)選框是否選中及選中個(gè)數(shù)的實(shí)現(xiàn)代碼。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2016-05-05
比較精簡(jiǎn)的Javascript拖動(dòng)效果函數(shù)代碼
比較精簡(jiǎn)的Javascript拖動(dòng)效果函數(shù)代碼...2007-07-07
詳解通用webpack多頁(yè)面自動(dòng)導(dǎo)入方案
本文主要介紹了通用webpack多頁(yè)面自動(dòng)導(dǎo)入方案,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-01-01
web開發(fā)js字符串拼接占位符及conlose對(duì)象Api詳解
本篇文章主要為大家介紹了web開發(fā)中字符串的拼接,占位符的使用以及conlose對(duì)象Api的使用,有需要的朋友可以借鑒參考下,希望可以有所幫助2021-09-09
整理Javascript基礎(chǔ)語(yǔ)法學(xué)習(xí)筆記
整理Javascript基礎(chǔ)語(yǔ)法學(xué)習(xí)筆記,之前一系列的文章是跟我學(xué)習(xí)Javascript,本文就是進(jìn)一步學(xué)習(xí)javascript基礎(chǔ)語(yǔ)法,希望大家繼續(xù)關(guān)注2015-11-11
JavaScript中使用Async實(shí)現(xiàn)異步控制
async提供了很多函數(shù)用于異步流程控制,下面是async核心的幾個(gè)函數(shù),大家通過(guò)本文學(xué)習(xí)下,對(duì)使用async 實(shí)現(xiàn)異步控制相關(guān)知識(shí),感興趣的朋友一起看看吧2017-08-08
JavaScript異步編程:異步數(shù)據(jù)收集的具體方法
我們先嘗試在不借助任何工具函數(shù)的情況下來(lái)解決這個(gè)問(wèn)題。筆者能想到的最簡(jiǎn)單的方法是:因前一個(gè)readFile的回調(diào)運(yùn)行下一個(gè)readFile,同時(shí)跟蹤記錄迄今已觸發(fā)的回調(diào)次數(shù),并最終顯示輸出。下面是筆者的實(shí)現(xiàn)結(jié)果。2013-08-08

