小程序内嵌H5遇到的坑

项目场景:

        甲方项目主程序是uniapp开发的,兼容ios、安卓、微信小程序三个端的一套代码,我司做了项目中的一个服务,但因为嵌入问题和代码权限问题,最终选择使用H5嵌入uniapp中。做这个H5遇到了不少的问题,大部分的精力都是在验证H5有没有实现某种功能的权限。

一、H5 分享小程序

需求: A小程序的H5中有一个分享产品的这么一个动作,点击分享产品,可以分享到微信群里,供用户购买;但是货主是甲方uniapp开发的项目,用户点击微信群里分享出来的链接,直接跳转到用户的B小程序里接订单;大致流程:A小程序里的H5页面,分享出去一个链接,用户点击这个链接需要跳转到B小程序,并做之后一些列的接单操作;所以分享出去的这个链接应该是去往B小程序的一个链接;
        微信其实是不允许这么做的,因为可能存在恶意引流问题;况且小程序内嵌的H5,不支持分享本页面以及分享小程序卡片功能,更不要说来实现分享一个别的小程序了;
所以有两种方法来解决这个问题:

1.1、不借助原生小程序,可满足小程序ios和安卓

        如果不借助原生小程序的话,仅仅依靠H5做分享,只能通过分享文字,以及短连接来生成分享码,类似于一条短信,复制好短信,短信里包含一个地址,这个地址就是B小程序的短连接即可。但是短链接只允许某一个用户使用,一个地址只允许1个用户被访问,所以这个分享出来的卡片无法被多个人点击。
在这里插入图片描述

copyContent(params, type = 'input') {
	const { param1 } = params
    value = `您有一笔新的订单,` + `点击查看详情👉${location.origin}/sms?type=wxUrl&p1=${params1}`;
    const input = document.createElement(type);
    input.setAttribute('readonly', 'readonly'); // 设置为只读, 防止在 ios 下拉起键盘
    // input.setAttribute('value', value); // textarea 不能用此方式赋值, 否则无法复制内容
    input.value = value;
    document.body.appendChild(input);
    input.setSelectionRange(0, 9999); // 防止 ios 下没有全选内容而无法复制
    input.select();
    document.execCommand('copy');
    document.body.removeChild(input);
    this.$toast.success("复制成功,快去转发吧!");
}

代码说明:
        1、通过点击按钮触发 copyContent 函数,给用户在剪贴板中自动放入一段文字:您有一笔新的订单,点击查看详情👉https://xxx.xxx.com/sms?type=wxUrl&p1=123456。用户点击链接,跳转到项目的一个中转页面,这个页面的逻辑就是获取到路径上的参数,通过参数使用上方图片中的方法生成微信小程序的URL Link并做自动跳转即可。
        2、这样,地址https://xxx.xxx.com/sms?type=wxUrl&p1=123456 就可以被多个人点击,每次生成不同的URL Link,从而实现了一个地址可供多人使用。
        3、每天生成 URL Scheme 和 URL Link 总数量上限为50万。所以如果用户量大的话,最好在https://xxx.xxx.com/sms页面使用本地存储localStorage存储已经生成过的地址,来防止同一个用户多次点击同一个地址而浪费地址生成次数。
        4、可以兼容小程序,安卓,ios;注意H5无法自动调用微信好友列表。

1.2、借助原生小程序:不考虑安卓和ios

        跳转到原生小程序页面后,使用wx.navigateToMiniProgram直接跳转到B小程序即可,然后将B小程序的当前页面分享出去,就可以让用户点击分享的卡片链接进行接下来的动作啦。
方案说明:
1、需要借助原生小程序做小程序跳转;
2、分享出去的内容就是卡片形式的,用户体验感比较好;
3、分享出去的卡片也没有次数限制。

H5 支付
        微信小程序中的H5不支持直接调用微信支付,所以需要小程序去帮助做微信支付。将所有参数处理好,通过 uni.redirectTo 跳转到小程序支付逻辑页面,切记处理参数的时候,一定要通过encodeURIComponent来进行编译,因为微信支付中的参数有特殊字符,如果不编译,则可能出现字符串丢失,导致无法唤起微信支付;
代码如下:

// H5 代码逻辑
let obj = {
    appId: encodeURIComponent(params.appId),
    timeStamp: encodeURIComponent(params.timeStamp),
    nonceStr: encodeURIComponent(params.nonceStr),
    package: encodeURIComponent(params.package),
    signType: encodeURIComponent(params.signType),
    paySign: encodeURIComponent(params.paySign)
};
let callbackPage = this.$route.fullPath;// 该参数是当用户支付完成后。继续跳转到之前的H5页面
let params = `appId=${obj.appId}&timeStamp=${obj.timeStamp}&nonceStr=${obj.nonceStr}&package=${obj.package}&signType=${obj.signType}&paySign=${obj.paySign}&cbpage=${encodeURIComponent(callbackPage)}`;
uni.redirectTo({
    url: `/wxpaying?${params}`
});
// 微信小程序原生代码
async onLoad(opt) {
	let _this = this;
    try {
        // 微信小程序
        wx.requestPayment({
            timeStamp: decodeURIComponent(opt.timeStamp),
            nonceStr: decodeURIComponent(opt.nonceStr),
            package: decodeURIComponent(opt.package),
            signType: decodeURIComponent(opt.signType),
            paySign: decodeURIComponent(opt.paySign),
            success: function (res) {
                // console.log('success:' + JSON.stringify(res));
                _this.callbackPage(opt.cbpage + encodeURIComponent('&payStatus=success')); //  这里是H5传过来的回调页面,支付完成跳转回去
            },
            fail: function (err) {
                // console.log('fail:' + JSON.stringify(err));
                _this.callbackPage(opt.cbpage + encodeURIComponent('&payStatus=error')); //  这里是H5传过来的回调页面,支付完成跳转回去
            }
        });
    } catch (e) {
        // 支付失败,提示并跳转回撮合页面
        uni.showToast({
            title: '微信调用支付失败,请联系管理员!',
            duration: 2000
        });
        setTimeout(() => {
            uni.redirectTo({ url: '/index' });
        }, 2000);
    }
}

二、H5与原声交互

        H5中的bindMessage函数并不是实时交互的,是在特定的时机触发,所以原生与H5交互无法做到立马触发。参考地址
在这里插入图片描述

三、微信小程序短连接在不同环境点击打开的小程序版本不同

        生成URL Link 方法中,如果想测试对应的版本,切记不要再微信中去点击生成的链接,因为从微信打开的小程序,永远是线上正式版小程序,不会跳转到开发版和体验版的,需要将链接复制到其他app中或者直接在手机浏览器中打开即可跳转对应版本的小程序。
在这里插入图片描述

总结

        小程序的 webView 权限少的可怜,如果官网中没有提及某一些权限和方法,则H5一定无法实现该方法,请换一种思路去开发。大家开发的时候慎用H5,不要把太重的功能放在H5上去实现!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
小程序内嵌H5实现地图选址的方法有多种,我来介绍一种常用的方式。 首先,我们需要在小程序中创建一个button按钮,用户点击该按钮后会跳转到H5页面。可以通过小程序的wx.navigateTo函数实现页面跳转,并传递参数给H5页面。 在H5页面中,我们可以引入地图相关的JavaScript库,例如百度地图API或者高德地图API。通过调用API提供的函数和方法,可以实现在H5页面上显示地图,并提供选址的功能。 在地图上选址的过程中,可以使用地图API提供的搜索功能,让用户输入关键字,然后根据关键字在地图上搜索相关位置,并在地图上标注出搜索结果。用户可以在搜索结果中选择一个位置作为选址。 当用户在H5页面上选中了一个位置后,可以通过调用JavaScript代码的方式将选中的位置信息传递给小程序。在H5页面中,可以使用window.location.href实现页面跳转,并将选中的位置信息作为url参数传递给小程序。 在小程序中,可以通过wx.navigateBack函数回到上一个页面,并通过上一个页面的参数接收选中的位置信息。然后,可以使用这些位置信息在小程序中进行相应的处理,例如显示选址结果、保存选址信息等。 综上所述,通过小程序内嵌H5实现地图选址的步骤为:小程序中创建按钮 → 跳转到H5页面并传递参数 → H5页面显示地图并实现选址功能 → 用户选中位置并将选中位置信息传递给小程序小程序接收选中位置信息并进行相应处理。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值