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的仿flash的广告轮播
Nov 05 Javascript
ASP.NET jQuery 实例16 通过控件CustomValidator验证RadioButtonList
Feb 03 Javascript
jquery 事件冒泡的介绍以及如何阻止事件冒泡
Dec 25 Javascript
js获取某月的最后一天日期的简单实例
Jun 22 Javascript
JS判断是否360安全浏览器极速内核的方法
Jan 29 Javascript
JS+CSS实现可拖拽的漂亮圆角特效弹出层完整实例
Feb 13 Javascript
JS+CSS实现仿新浪微博搜索框的方法
Feb 24 Javascript
jQuery实现复选框的全选和反选
Feb 02 Javascript
jQuery插件HighCharts绘制2D饼图效果示例【附demo源码下载】
Mar 21 jQuery
js学习总结_选项卡封装(实例讲解)
Jul 13 Javascript
vue2手机APP项目添加开屏广告或者闪屏广告
Nov 28 Javascript
深入理解Node module模块
Mar 26 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
ThinkPHP CURD方法之where方法详解
2014/06/18 PHP
基于PHP实现通过照片获取ip地址
2016/04/26 PHP
Yii2单元测试用法示例
2016/11/12 PHP
自制PHP框架之模型与数据库
2017/05/07 PHP
javascript 原型继承介绍
2011/08/30 Javascript
在iframe里的页面编写js,实现在父窗口上创建动画效果展开和收缩的div(不变动iframe父窗口代码)
2011/12/20 Javascript
Jquery右下角抖动、浮动 实例代码(兼容ie6、FF)
2013/08/15 Javascript
鼠标拖动实现DIV排序示例代码
2013/10/14 Javascript
DOM节点的替换或修改函数replaceChild()用法实例
2015/01/12 Javascript
jQuery简单实现input文本框内灰色提示文本效果的方法
2015/12/02 Javascript
jQuery插件 Jqplot图表实例
2016/06/18 Javascript
nodejs中向HTTP响应传送进程的输出
2017/03/19 NodeJs
详解AngularJS ng-class样式切换
2017/06/27 Javascript
JavaScript的数据类型转换原则(干货)
2018/03/15 Javascript
解决vue页面DOM操作不生效的问题
2018/03/17 Javascript
vue.js将时间戳转化为日期格式的实现代码
2018/06/05 Javascript
vue增加强缓存和版本号的实现方法
2019/05/01 Javascript
layui实现form表单同时提交数据和文件的代码
2019/10/25 Javascript
JS函数进阶之prototy用法实例分析
2020/01/15 Javascript
jQuery Datatables 动态列+跨列合并实现代码
2020/01/30 jQuery
Angular利用HTTP POST下载流文件的步骤记录
2020/07/26 Javascript
微信小程序wx.getUserInfo授权获取用户信息(头像、昵称)的实现
2020/08/19 Javascript
Javascript实现贪吃蛇小游戏(含详细注释)
2020/10/23 Javascript
[50:27]OG vs LGD 2018国际邀请赛淘汰赛BO3 第一场 8.26
2018/08/30 DOTA
Pyramid添加Middleware的方法实例
2013/11/27 Python
win7+Python3.5下scrapy的安装方法
2018/07/31 Python
python实现邮件发送功能
2019/08/10 Python
浅析两列自适应布局的3种思路
2016/05/03 HTML / CSS
买房委托公证书
2014/04/08 职场文书
校车安全责任书
2014/08/25 职场文书
研究生导师评语
2014/12/31 职场文书
行政撤诉申请书
2015/05/18 职场文书
服装店员工管理制度
2015/08/07 职场文书
导游词之山海关
2019/12/10 职场文书
Python并发编程实例教程之线程的玩法
2021/06/20 Python
idea下配置tomcat避坑详解
2022/04/12 Servers