赞
踩
前几天公司头目给了我个任务 ,用小程序的web view组件来嵌入h5页面 还要实现小程序右上角的分享功能 ,最重要的是调用微信支付(小程序中不能使用之前在浏览器中配置的支付功能,只能调用小程序专属的api进行支付。) 接到到这个任务,内心还是很开心的,因为…我爱学习啊啊啊。话不多说,进入正题。
web-view:承载网页的容器。会自动铺满整个小程序页面,个人类型的小程序暂不支持使用 它有三个比较重要的属性 src bindmessage bindload 。
web view详情链接
先说说整体思路吧 小程序只要有三个页面就够了
1.小程序启动时默认打开的页面
2.小程序点击右上角分享 的页面
3.webview嵌入的h5页面 当发起支付时会跳转到wxpay页面 ,调用微信支付
乍一看挺简单的 实际也不是太难,只是当时爬的坑比较多 结尾的时候会总结坑点。
对了,开始之前先说下 ,我用的是uniapp 来写的 实现原理 一模一样 有差别的地方我都注释出来了
//index.vue页面
// 注意: @message 事件是uniapp中的web-viwe 小程序用的是 bindmessage
<web-view src="https://www.baidu.com/" @message="handlePostMessage"></web-view>
要实现分享功能需先了解 以下内容
在index.vue里面加如下代码
// 用户点击右上角分享 res.webViewUrl是跳转时携带的参数
onShareAppMessage: function(res) {
//console.log(res)里面会有个 res.webViewUrl 指的是当前所在页面的网址
return {
// path --必打开分享时跳转到的页面 默认是当前页面,必须是以‘/’开头的完整路径
// title -- 设置转发时的标题 默认是小程序的名称
// imageUrl -- 设置转发时的图片 不传入 imageUrl 则使用默认截图。
path: '/pages/share/share?url=' + encodeURIComponent(res.webViewUrl)
};
},
在share.vue中添加如下代码
<web-view :src="h5url" @message="handlePostMessage"></web-view>
script添加以下代码
//接收参数 onShareAppMessage 中path 传过来的参数
onLoad: function(e) {
this.h5url = decodeURIComponent(e.url)
}
以上步骤解释:
说白了就是小程序需要从index页面 跳到了share页面 , index用到了 onShareAppMessage 来进行页面的跳转 , share用onLond 接收参数并赋值给自己页面的web-view
以上步骤未用到H5 给小程序传参 如需使用H5传递参数实现分享还需在H5添加以下代码
//data就是要传递的数据 //思路:先判断环境 再执行 wx.miniProgram.postMessage(); var ua = navigator.userAgent.toLowerCase(); if(ua.match(/MicroMessenger/i)=="micromessenger") { //ios的ua中无miniProgram,但都有MicroMessenger(表示是微信浏览器) uni.miniProgram.getEnv((res)=>{ if (res.miniprogram) { uni.miniProgram.postMessage({ data: data }); }else{ alert('在微信内,但是不在小程序内') return false; } }) }else{ console.log('在微信外') }
h5页面通过 调用miniProgram.postMessage() 传参 。小程序的web-view组件bindmessage 属性 会在特定时机(后退、组件销毁、分享)触发并收到消息。 此步骤就算收工了。
调用微信支付原因上面已经做过解释 想要实现功能之前的先搞懂小程序支付流程 小程序支付流程
H5调起微信支付时 用miniProgram.navigateTo 设置跳到 wxpay页面
wxpay.vue页面
<template> //h5调起微信支付时会跳到 wxpay页面 </template> <script> export default { data() { return {}; }, created() {}, methods: { // 生命周期函数--监听页面卸载 onUnload :function() {} //支付完成后 手机左滑时会出现很尴尬的事 相信你会用到这个生命周期 原理不解释了 写了几个小时没精力了 //生命周期函数--监听页面加载 onLoad: function(option) { if (option) { //option 有H5页面传递过来的数据 this.setLoading(option); } else { uni.navigateBack(); } // console.log(option); }, setLoading: function(option) { var that = this; // 调用登录接口获取openid uni.login({ success: function(res) { // 成功会返回: {errMsg: "login:ok", code: " 获取用户OpenID的ticket"} that.getOpenId(res.code, option); // console.log(res); } }); }, getOpenId: function(jsCode, option) { var that = this; var params = {}; //这里就是调接口拼凑要给后端提供的参数 params.key = option.key, params.pay_sn = option.pay_sn, params.password = option.password, params.rcd_pay = option.rcb_pay, params.pd_pay = option.pd_pay, params.integral = option.integral, params.payment_code = option.payment_code, params.payment_jscode = jsCode, //把获取到的code传给后端 (必须)到时候退款也会涉及到 uni.request({ url: 'https://www.xxx.com/mobile' + '/index.php?act=member_payment&op=wxa_pay', //引入的https地址 method: 'post', header: { 'content-type': 'application/x-www-form-urlencoded' // 默认值 }, data: params, //传递的参数 后端会返回一部分 你这里只需要吧 获取用户OpenID的ticket" success: function(res) { that.getPrePayId(res.data.datas); }, fail: function(res) { console.log(res); uni.showModal({ title: '网络超时', content: '刷新重试', showCancel: !1 }); } }); }, getPrePayId: function(res) { var that = this; uni.requestPayment({ //成功之后,调用小程序微信支付 timeStamp: res.timeStamp, nonceStr: res.nonceStr, package: res.package, signType: res.signType, paySign: res.paySign, success: function(res) { uni.showToast({ title: '支付成功', icon: 'success', duration: 1650 }), console.log('支付成功'); }, fail: function() { uni.showToast({ title: '支付失败', icon: 'clear', duration: 1650 }), console.log('支付失败'); } }); } } }; </script>
H5代码
// 小程序支付函数 mini_program_pay = function (queryParam ) { var ua = navigator.userAgent.toLowerCase(); if(ua.match(/MicroMessenger/i)=="micromessenger") { //ios的ua中无miniProgram,但都有MicroMessenger(表示是微信浏览器) uni.miniProgram.getEnv((res)=>{ if (res.miniprogram) { console.log('在小程序内') uni.miniProgram.navigateTo({ url: "/pages/wxpay/wxpay?"+queryParam //小程序的支付地址,queryParam是需要传递的商品id等数据 }); return false; }else{ console.log('在微信内,但是不在小程序内') return false; } }) }else{ console.log('在微信外') return false; } };
写的时间太长了 有些晕 简短的说下重点步骤吧 ! 注释其实说的挺多的,比较详细
H5要在使用wx.miniProgram.navigateTo 携带参数 跳转到小程序的wxpay页面 跳转需要引入js-sdk才可以跳转 去官网查下最新版本 不然可能会不成功
其实支付这块稍微复杂一些 但前端做的事情比较少 , 后端复杂一些.。前端只需要去H5搜集参数传给小程序,小程序在wx.login()获取到code 然后再调接口拼接数据,最后wx.requestPayment 直接拉起微信支付就好了
写到这微信支付也就告一段落了 ~~~
在总结一下 遇到的各种问题吧 !
就这三个功能折磨我的时间挺长的 ! 爬了无数的坑 终于实现了 (我引入的H5页面还是用JQuery+template模板写的 因为刚到公司还有很多地方不熟 得亏有个靓仔祥祥给了我很大的支持~在此重重感谢 )
如果后期有精力后期再补充一些爬过的坑。我也是站在了巨人的肩膀上 还要感谢一下 大佬的文章
以上有很多地方都是借鉴 这位大佬的 再次感谢 ~~
初识前端 ,希望能与各位同仁多多交流讨论。
https://www.cnblogs.com/wangvv/p/13646057.html
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。