vue 解决在微信内置浏览器中调用支付宝支付的情况


Posted in Javascript onNovember 09, 2020

我的思路大概是这样的

1. 验证是否是在微信内置浏览器中调用支付宝

2.给支付页面的url加上调用接口所需的参数(因为在微信里是不能直接调用支付宝的需要调用外部浏览器)

3.在外部浏览器中完成支付跳转页面

第一步:

payment: 是选择支付页面,pay-mask是用于在微信内置浏览器中调用支付宝的中间页

vue 解决在微信内置浏览器中调用支付宝支付的情况

payment主要代码:

vue 解决在微信内置浏览器中调用支付宝支付的情况

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?prepay_id=wx********************&package=162****

直接跳转就行了。(最后提醒句:提示服务商参数缺失的话就让服务商开通H5支付)

window.location.href = res.data.mweb_url

2、支付宝方面就有点麻烦,因为它返回的是一个form

vue 解决在微信内置浏览器中调用支付宝支付的情况

所以嘛,需要创建个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 解决在微信内置浏览器中调用支付宝支付的情况就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
jquery实现简单的拖拽效果实例兼容所有主流浏览器(优化篇)
Jun 28 Javascript
js onclick事件传参讲解
Nov 06 Javascript
javascript模拟实现C# String.format函数功能代码
Nov 25 Javascript
JS实现简单的键盘打字的效果
Apr 24 Javascript
js实现文本框宽度自适应文本宽度的方法
Aug 13 Javascript
js事件处理程序跨浏览器解决方案
Mar 27 Javascript
js获取客户端操作系统类型的方法【测试可用】
May 27 Javascript
基于jQuery制作小图标上下滑动特效
Jan 18 Javascript
js求数组中全部数字可拼接出的最大整数示例代码
Aug 25 Javascript
浅谈Vue的加载顺序探讨
Oct 25 Javascript
Vue3.x源码调试的实现方法
Oct 13 Javascript
解决vuex改变了state的值,但是页面没有更新的问题
Nov 12 Javascript
详解Vue中的watch和computed
Nov 09 #Javascript
vue-axios同时请求多个接口 等所有接口全部加载完成再处理操作
Nov 09 #Javascript
解决vue 使用axios.all()方法发起多个请求控制台报错的问题
Nov 09 #Javascript
Echarts在Taro微信小程序开发中的踩坑记录
Nov 09 #Javascript
Vue路由权限控制解析
Nov 09 #Javascript
在vue项目中promise解决回调地狱和并发请求的问题
Nov 09 #Javascript
vue 中的动态传参和query传参操作
Nov 09 #Javascript
You might like
用DBSQL类加快开发MySQL数据库程序的速度
2006/10/09 PHP
简单谈谈PHP中strlen 函数
2016/02/27 PHP
php resizeimage 部分jpg文件 生成缩略图失败的原因分析及解决办法
2016/03/23 PHP
实例分析PHP中PHPMailer发邮件
2017/12/13 PHP
css值转换成数值请抛弃parseInt
2011/10/24 Javascript
JavaScript中的细节分析
2012/06/30 Javascript
用jquery实现的一个超级简单的下拉菜单
2014/05/18 Javascript
JQuery中的html()、text()、val()区别示例介绍
2014/09/01 Javascript
jQuery实现流动虚线框的方法
2015/01/29 Javascript
javascript如何实现暂停功能
2015/11/06 Javascript
12 款 JS 代码测试必备工具(翻译)
2016/12/13 Javascript
bootstrap制作jsp页面(根据值让table显示选中)
2017/01/05 Javascript
纯js仿淘宝京东商品放大镜功能
2017/03/02 Javascript
浅谈angular4 ng-content 中隐藏的内容
2017/08/18 Javascript
JavaScript从原型到原型链深入理解
2019/06/03 Javascript
vue打包静态资源后显示空白及static文件路径报错的解决
2020/09/02 Javascript
vue+vant 上传图片需要注意的地方
2021/01/03 Vue.js
[03:18]DOTA2亚洲邀请赛小组赛第一日 RECAP赛事回顾
2015/01/30 DOTA
Python中获取网页状态码的两个方法
2014/11/03 Python
Django 前后台的数据传递的方法
2017/08/08 Python
Python中字典的浅拷贝与深拷贝用法实例分析
2018/01/02 Python
Django处理文件上传File Uploads的实例
2018/05/28 Python
解决Python pandas df 写入excel 出现的问题
2018/07/04 Python
Python面向对象实现一个对象调用另一个对象操作示例
2019/04/08 Python
如何使用selenium和requests组合实现登录页面
2020/02/03 Python
python实现ftp文件传输系统(案例分析)
2020/03/20 Python
Python 为什么推荐蛇形命名法原因浅析
2020/06/18 Python
英国No.1体育用品零售商:SportsDirect.com
2019/10/16 全球购物
六个一活动实施方案
2014/03/21 职场文书
先进事迹报告会主持词
2014/04/02 职场文书
项目合作协议书
2014/04/16 职场文书
经贸日语专业个人求职信范文
2014/04/29 职场文书
爱国主义演讲稿
2014/05/07 职场文书
工会优秀工作者事迹
2014/08/17 职场文书
房产转让协议书(2014版)
2014/09/30 职场文书
Golang 链表的学习和使用
2022/04/19 Golang