一.项目需求
因为公司人员缺少,没有专门开发安卓和ios的人员,为了项目尽早上线采用了混合APP开发的方式,我选择了MUI混合开发框架,项目中需要在用户购买VIP会员的时候进行支付,所以需要在项目中解决这个问题,由于开发平台的支付没有申请下来,所以暂时先使用微信公众号H5支付.
二.在购买vip页面请求服务端接口获取H5支付的微信链接地址mweb_url
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1,minimum-scale=1,maximum-scale=1,user-scalable=no" />
<title>喜登对</title>
<script src="js/mui.min.js"></script>
<script type="text/javascript" src="js/rem.js"></script>
<link href="css/common.css" rel="stylesheet" />
<link href="css/xxx.css" rel="stylesheet" />
</head>
<body>
<div class="warp">
<div class="header">
<span class="goBack"></span>
<p class="title">开通VIP</p>
</div>
<div class="payB">
<div class="list">
<ul id="vipList"></ul>
</div>
<div class="txt">
<p class="p1"><span class="fl"></span>升级为VIP,快速找到另一半<span class="fr"></span></p>
<div class="p2">
<p><i class="iconA"></i>交友成功率</p>
<p><i class="iconB"></i>收信次数</p>
</div>
<p class="p4"><span class="fl"></span>年费会员独享<span class="fr"></span></p>
<div class="p3">
<p><i class="icon01"></i>置顶推荐一天</p>
<p><i class="icon02"></i>高级搜索</p>
<p><i class="icon03"></i>无限畅聊</p>
<p><i class="icon04"></i>优先推荐</p>
<p><i class="icon05"></i>优先审核</p>
<p><i class="icon06"></i>隐身访问</p>
<p><i class="icon07"></i>查看全部</p>
<p><i class="icon08"></i>在线状态</p>
</div>
</div>
<div class="h"></div>
<button id="buy">开通VIP</button>
</div>
</div>
</body>
<script src="js/me/base.js" type="text/javascript" charset="utf-8"></script>
<script>
mui.init();
//点击开通vip
mui('body').on('tap','#buy',function(){
//从服务端获取微信公众号H5支付参数 package_id:礼包id(此处省略了部分业务代码)
postVipApi(package_id)
});
//下订单
function postVipApi(package_id)
{
mui.ajax(API_URL + 'vip/order',{
data:{
'package_id':package_id,
'trade_type':'MWEB',
'wap_url':'https://xidengdui.com'
},
type:'POST',
dataType:'json',
headers:{Authorization:"Bearer " + getAppToken()},
timeout:20000,
success:function(data){
//获取支付参数成功
var payUrl = data.data.mweb_url;//这个是接口返回来的微信H5支付的连接地址
//处理跳转支付问题(重点)
},
error:function(xhr){
mui.toast('网络异常')
}
});
}
</script>
</html>
三.处理微信H5支付连接mweb_url的跳转问题(重点)
这里一般会遇到这些问题:
问题1.跳转mweb_url链接后出现商家参数有误的问题(解决办法:没有设置好头信息里面的referer参数,或者referer参数填写的连接不是微信商户平台注册的安全域名)
问题2:能跳转到微信的支付页面,但是返回后出现页面空白,或者支付成功后点击完成出现页面空白的问题,解决的方案是:
把当前页面当做mweb_url支付页面的父级页面,不要用open的方式打开支付连接,而是以子页面的形式添加本页面中,且设置好子页面的显示样式就可以完美解决这个问题,完整的解决代码如下:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1,minimum-scale=1,maximum-scale=1,user-scalable=no" />
<title>喜登对</title>
<script src="js/mui.min.js"></script>
<script type="text/javascript" src="js/rem.js"></script>
<link href="css/common.css" rel="stylesheet" />
<link href="css/xxx.css" rel="stylesheet" />
</head>
<body>
<div class="warp">
<div class="header">
<span class="goBack"></span>
<p class="title">开通VIP</p>
</div>
<div class="payB">
<div class="list">
<ul id="vipList"></ul>
</div>
<div class="txt">
<p class="p1"><span class="fl"></span>升级为VIP,快速找到另一半<span class="fr"></span></p>
<div class="p2">
<p><i class="iconA"></i>交友成功率</p>
<p><i class="iconB"></i>收信次数</p>
</div>
<p class="p4"><span class="fl"></span>年费会员独享<span class="fr"></span></p>
<div class="p3">
<p><i class="icon01"></i>置顶推荐一天</p>
<p><i class="icon02"></i>高级搜索</p>
<p><i class="icon03"></i>无限畅聊</p>
<p><i class="icon04"></i>优先推荐</p>
<p><i class="icon05"></i>优先审核</p>
<p><i class="icon06"></i>隐身访问</p>
<p><i class="icon07"></i>查看全部</p>
<p><i class="icon08"></i>在线状态</p>
</div>
</div>
<div class="h"></div>
<button id="buy">开通VIP</button>
</div>
</div>
</body>
<script src="js/me/base.js" type="text/javascript" charset="utf-8"></script>
<script>
mui.init();
mui.plusReady(function(){
var self = plus.webview.currentWebview();
//选择开通的vip
mui('#vipList').on('tap','li',function(){
var vip_id = this.getAttribute('vip-id');
var cls = this.getAttribute('class');
package_id = vip_id;
if(cls.lastIndexOf('on')>0)return;
mui('#vipList .on')[0].classList.remove('on');
this.classList.add('on');
})
//点击开通vip
mui('body').on('tap','#buy',function(){
postVipApi(package_id)
});
//下订单
function postVipApi(package_id)
{
mui.ajax(API_URL + 'vip/order',{
data:{
'package_id':package_id,
'trade_type':'MWEB',
'wap_url':'https://xidengdui.com'
},
type:'POST',
dataType:'json',
headers:{Authorization:"Bearer " + getAppToken()},
timeout:20000,
success:function(data){
var payUrl = data.data.mweb_url;
//处理跳转支付问题,此处巧妙在第三个参数,通过设置这个内嵌页面的样式来解决白屏问题,因为微信支付页面点击返回或者支付结束点击完成后都是默认返回唤起支付链接的页面,也就是payView这个创建出来的内嵌页面所以微信支付完成返回的页面payView视图上就会看不到了,达到了解决白屏的问题,其中additionalHttpHeaders:{referer:'http://xidengdui.com'}是解决出现商家参数有误的问题
var payView = plus.webview.create(payUrl, 'pay-url', {
top: '1000px',bottom: '1000px',
additionalHttpHeaders:{referer:'http://xidengdui.com'}
});
self.append(payView);
},
error:function(xhr){
mui.toast('网络异常')
}
});
}
});
</script>
</html>
来源:oschina
链接:https://my.oschina.net/u/3223370/blog/1858475