我的思路大概是这样的
1. 验证是否是在微信内置浏览器中调用支付宝
2.给支付页面的url加上调用接口所需的参数(因为在微信里是不能直接调用支付宝的需要调用外部浏览器)
3.在外部浏览器中完成支付跳转页面
第一步:
payment: 是选择支付页面,pay-mask是用于在微信内置浏览器中调用支付宝的中间页
payment主要代码:
let ua = window.navigator.userAgent.toLowerCase()
ua.match(/MicroMessenger/i) == "micromessenger"
这两句代码就是判断用户是否是用微信内置浏览器打开的页面
如果是的话我们就需要把调用支付接口所需要的接口参数传给另一个页面(你也可以就在当前页做处理,我这样做是因为我想加一个提示页)
pay-mask代码如下:
<template> <div class="mask"> <!-- 提示在浏览器打开弹框 --> <div class="pay-mask" v-show="isWeiXi"> </div> <div class="payform"></div> </div> </template>
<script type="text/ecmascript-6"> /* 解决在微信浏览器中无法调用支付宝支付: 1.拿到从支付页传递过来的参数重组成自己需要的数据 2.清除旧的缓存数据(防止出现意外bug) 3.验证是否是微信浏览器(不是就把拿到的key和token存进本地缓存中,用于其他接口调用) 4.请求数据接口拿到支付宝的支付表单装进页面中完成支付 */ export default { name: 'payMask', data () { return { isWeiXi: true, theRequest: {} } }, methods: { // 获取当前微信浏览器url地址参数 getUrlParams() { // 清除旧的缓存数据 // window.localStorage.clear() let theRequest = new Object(); let url = location.href; //获取url中""符后的字串 let strs = []; if (url.indexOf("") != -1) { var str = url.substr(parseInt(url.indexOf("")+1)); strs = str.split("&"); for (var i = 0; i < strs.length; i++) { theRequest[strs[i].split("=")[0]] = unescape(strs[i].split("=")[1]); } } this.theRequest = theRequest; }, // 监控微信浏览器 isWeiXin() { let ua = window.navigator.userAgent.toLowerCase(); if (ua.match(/MicroMessenger/i) != "micromessenger") { this.isWeiXi = false // 重新存储新的token(在外部浏览器打开支付完成后是没有token这些数据的所以需要在浏览器一打开的时候就去存一次数据) window.localStorage.setItem("channelId", this.theRequest.channelId); window.localStorage.setItem("userKey",JSON.stringify(this.theRequest.userKey)); window.localStorage.setItem("userToken",JSON.stringify(this.theRequest.userToken)); if(this.theRequest.memberTypeName){ // 调用支付宝支付 this.zfbPayBuy(this.theRequest) } else { this.zfbPayBuySocial(this.theRequest) } } else { this.isWeiXi = true } }, // 支付宝支付(会员) zfbPayBuy(data){ // 请求接口拿到接口返回的支付表单(接口直接返回的,我们直接装进页面就可以了) this.axios.payBuy(data).then(res => { if (res.status == 0) { let payHtml = document.querySelector(".payform"); payHtml.innerHTML = res.result; let paySub = payHtml.getElementsByTagName("input")[1]; paySub.click() } }) }, //支付宝支付(社保) zfbPayBuySocial(data) { this.axios.buySocial(data).then(res => { if (res.status == 0) { let payHtml = document.querySelector(".payform") payHtml.innerHTML = res.result let paySub = payHtml.getElementsByTagName("input")[1] paySub.click() } }) }, }, created() { // 拿去当前地址参数 this.getUrlParams() if(JSON.stringify(this.theRequest) != '{}'){ this.isWeiXin() } }, mounted(){ // 更新一下当前浏览器地址(防止在微信里调用外部浏览器的时候出现意外bug) window.location.href = window.location.href } } </script>
<style scoped lang="less"> .pay-mask { width: 100%; min-height: 100%; position:fixed; z-index: 99; background-color: rgba(0, 0, 0,.6); background-image: url('../../image/icon/confirm.png'); background-repeat: no-repeat; } </style>
补充知识:vue 移动端H5非内置浏览器发起微信、支付宝支付
该贴只说前端部分,后端人员绕路哈。
先调用统一下单接口后
1、微信部分,后端会返回一个url给你,
"mweb_url":https://wx.tenpay.com/cgi-bin/mmpayweb-bin/checkmweb"" src="/UploadFiles/2021-04-02/20201109103914.jpg">
所以嘛,需要创建个div然后innerHTML插入HTML代码
const div = document.createElement('div') // 创建div div.innerHTML = res.data.aliHtml // 将返回的form 放入div document.body.appendChild(div) // 将上面创建的元素加入到BODY的尾部 document.forms[0].submit() // 表示获取当前页面的第一个表单这样就OK了
如果想问支付成功后的跳转呢,你则需要给一个链接给到后端,后端传给阿里或者微信,成功后自己跳的。
以上这篇vue 解决在微信内置浏览器中调用支付宝支付的情况就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持。
免责声明:本站资源来自互联网收集,仅供用于学习和交流,请遵循相关法律法规,本站一切资源不代表本站立场,如有侵权、后门、不妥请联系本站删除!
《魔兽世界》大逃杀!60人新游玩模式《强袭风暴》3月21日上线
暴雪近日发布了《魔兽世界》10.2.6 更新内容,新游玩模式《强袭风暴》即将于3月21 日在亚服上线,届时玩家将前往阿拉希高地展开一场 60 人大逃杀对战。
艾泽拉斯的冒险者已经征服了艾泽拉斯的大地及遥远的彼岸。他们在对抗世界上最致命的敌人时展现出过人的手腕,并且成功阻止终结宇宙等级的威胁。当他们在为即将于《魔兽世界》资料片《地心之战》中来袭的萨拉塔斯势力做战斗准备时,他们还需要在熟悉的阿拉希高地面对一个全新的敌人──那就是彼此。在《巨龙崛起》10.2.6 更新的《强袭风暴》中,玩家将会进入一个全新的海盗主题大逃杀式限时活动,其中包含极高的风险和史诗级的奖励。
《强袭风暴》不是普通的战场,作为一个独立于主游戏之外的活动,玩家可以用大逃杀的风格来体验《魔兽世界》,不分职业、不分装备(除了你在赛局中捡到的),光是技巧和战略的强弱之分就能决定出谁才是能坚持到最后的赢家。本次活动将会开放单人和双人模式,玩家在加入海盗主题的预赛大厅区域前,可以从强袭风暴角色画面新增好友。游玩游戏将可以累计名望轨迹,《巨龙崛起》和《魔兽世界:巫妖王之怒 经典版》的玩家都可以获得奖励。