H5网页跳转微信小程序踩坑
公众号H5页面跳转小程序(微信开放标签wx-open-launch-weapp)
问题:苹果手机可以显示图片跳转按钮,但是安卓手机无法显示出来。、问题:苹果手机可以显示图片跳转按钮,但是安卓手机无法显示出来。、
原因:
看看图片链接是 //
还是 http
开头,如果是 //test.com/upload/60/2b605429ddcc756370be777761c98d.png
这种形式的图片链接,会导致安卓手机在 <script type="text/wxtag-template">
标签里的图片无法显示出来。
解决:
图片链接加上前缀 http:
或者 https:
,变成 https://test.com/upload/60/2b605429ddcc756370be777761c98d.png
。
问题:无法显示跳转小程序按钮
wx.config
参数是否正确,比如appId
和signature
。容易遇到问题是signature
签名的算法的计算。
根据官方文档:
签名生成规则如下:参与签名的字段包括noncestr(随机字符串), 有效的jsapi_ticket, timestamp(时间戳), url(当前网页的URL,不包含#及其后面部分) 。
生成签名用到的 url 参数 必须是 当前网页的 URL,不包含 # 及其后面部分。如果当前打开的 H5 页面包含有 # 字符,请按要求进行舍弃然后计算签名。PHP 代码示例:
// $_REQUEST['url'] 就是页面 JS 获取到的 location.href
$url_raw = $_REQUEST['url'];
$url_arr = explode('#', $url_raw);
$url = reset($url_arr);
- 务必仔细检查
<wx-open-launch-weapp>
里填写的username
或者path
属性是否按照官方文档填写正确。
结合 uniapp 使用
<script type="text/wxtag-template">
标签里使用变量 不能 使用 vue 的写法,如:
<image :src="isVip ? ad_mini : ad" class="btnMore22" width="90%"></image>
而是要用小程序原生的写法,使用 {{ }}
将变量包围起来:
<image src="{{ isVip ? ad_mini : ad }}" class="btnMore22" width="90%"></image>
- Vue 增加忽略自定义元素:
Vue.config.ignoredElements = ['wx-open-launch-weapp'];
其它要注意的问题
引用官方文档:
- 开放对象:已认证的服务号,服务号绑定“JS接口安全域名”下的网页可使用此标签跳转任意合法合规的小程序。
- 页面中与布局和定位相关的样式,如position: fixed; top -100;等,尽量不要写在插槽模版的节点中,请声明在标签或其父节点上;
- 对于有CSP要求的页面,需要添加白名单frame-src https://*.qq.com webcompt:,才能在页面中正常使用开放标签。
来自第三方参考链接:https://developers.weixin.qq.com/community/develop/article/doc/000c00b4490678f528baf2cf756413
https://www.shuzhiduo.com/A/A7zgQvkP54/
https://juejin.cn/post/6844904193635909645
- 如果你跳转之后显示页面不存在,请检查下
path
的路径结尾是否写上了.html
; wx.config
在初始化授权写上开放标签openTagList: ['wx-open-launch-weapp']
;wx.config
中jsApiList
里的属性不能为空,否则会提示config:param is empty
,
wx.config({
// ...
jsApiList: ['onMenuShareAppMessage'], // 因为不能为空,所以我随便写了一个微信的方法
openTagList: ['wx-open-launch-weapp'],
});
- 如果要测试
wx.config
参数是否配置成功,将debug: true
属性加上,如果用微信开发者工具或者微信客户端访问网页弹出对话框提示{errMsg: "config:ok”}
,说明已经接入成功; - 如果你觉得里面写样式不好写,可以在里面样式style写opacity:0;,这样的话开放标签只是用来填充,大小自己控制就行;
- 经过测试发现标签内定义的样式真的很尴尬,且不受控制,所以我们直接将标签用 CSS 绝对定位并设透明度为
opacity: 0
, 盖在了我们原本的设计图上; - 透明度为
opacity: 0
的标签<script type="text/wxtag-template">
不能为空,否则宽高会被解析为 0,也就是按钮根本点击不到; - 在 VUE 的 mounted 生命周期回调函数内侦听开放标签的回调事件:
mounted(){
var btn = document.getElementById(this.id)
btn.addEventListener('launch', e => {
// 在此处可设置粘贴板内数据,数据是传递给 app 的参数进,
console.log('success');
});
btn.addEventListener('error', e => {
// 在此处可设置粘贴板内数据,数据是传递给 app 的参数进,
console.log('fail', e.detail);
// 唤醒失败的情况下,可用于降级处理比如在此处跳转到应用宝
});
}
- 如果微信版本低于7.0.12 开放标签是无法使用的,所以最好在开放标签外套一层 DIV 用于点击事件,在事件中断段微信版本号如果低于,则降级到应用宝之类的方案(参考例子:https://www.shuzhiduo.com/A/A7zgQvkP54/)