一.项目需求javascript
由于公司人员缺乏,没有专门开发安卓和ios的人员,为了项目尽早上线采用了混合APP开发的方式,我选择了MUI混合开发框架,项目中须要在用户购买VIP会员的时候进行支付,因此须要在项目中解决这个问题,因为开发平台的支付没有申请下来,因此暂时先使用微信公众号H5支付.css
二.在购买vip页面请求服务端接口获取H5支付的微信连接地址mweb_urlhtml
<!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的跳转问题(重点)java
这里通常会遇到这些问题:ios
问题1.跳转mweb_url连接后出现商家参数有误的问题(解决办法:没有设置好头信息里面的referer参数,或者referer参数填写的链接不是微信商户平台注册的安全域名)web
问题2:能跳转到微信的支付页面,可是返回后出现页面空白,或者支付成功后点击完成出现页面空白的问题,解决的方案是:ajax
把当前页面当作mweb_url支付页面的父级页面,不要用open的方式打开支付链接,而是以子页面的形式添加本页面中,且设置好子页面的显示样式就能够完美解决这个问题,完整的解决代码以下:json
<!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>