H5打开小程序,使用了wx-open-launch-weapp却不显示,大概问题出在了两个方面:
一,signature不正确
请使用mp.weixin.qq.com/debug/cgi-b… 验证你从服务器获取的signature是否正确,如果不正确可能是url参数的问题,比如url中不能包含“#”
二,微信weixinjs引入的版本问题
必须使用weixinjs1.6.0版本,这里是个巨坑,特别是vue,请在package.json检查你引入的版本。
相关代码示例
获取signature
服务端:
1,获取access_token
api.weixin.qq.com/cgi-bin/tok… 得到access_token,建议保存在redis中,因为这个有数量限制;
2,获取jsapiticket
api.weixin.qq.com/cgi-bin/tic… access_token从第一步获取,获取jsapiticket;保存在redis中。
3,获取signature
var config = {
appID: APPID,
access_token: '',
jsapi_ticket: '',
timestamp: '', // 必填,生成签名的时间戳
nonceStr: '', // 必填,生成签名的随机串
signature: '', // 必填,签名
};
const getwxsignature = async (hrefURL) => {
var wx_access_token = await getwx_access_token();
var jsapi_ticket = await getJsapiTicket();
config.access_token = wx_access_token;
config.jsapi_ticket = jsapi_ticket;
config.timestamp = createTimestamp(); // 时间戳
config.nonceStr = createNonceStr(); // 随机数
config.signature = sign(hrefURL); // 签名
var wxsignature = {
appId: config.appID,
timestamp: config.timestamp,
nonceStr: config.nonceStr,
signature: config.signature
}
return wxsignature;
}
const createNonceStr = () => {
return Math.random().toString(36).substr(2, 15);
};
const createTimestamp = () => {
return parseInt(new Date().getTime() / 1000).toString();
};
const rawString = (args) => {
var keys = Object.keys(args);
keys = keys.sort()
var newArgs = {};
keys.forEach(function (key) {
newArgs[key.toLowerCase()] = args[key];
});
var string = '';
for (var k in newArgs) {
string += '&' + k + '=' + newArgs[k];
}
string = string.substr(1);
return string;
};
const sign = (url) => {
var ret = {
jsapi_ticket: config.jsapi_ticket,
nonceStr: config.nonceStr,
timestamp: config.timestamp,
url: url
};
var string = rawString(ret);
var shaObjs = sha1(string);
return shaObjs;
};
getwx_access_token()与getJsapiTicket()就是步骤1与步骤2,getwxsignature方法的参数hrefURL就是你当前网页的url,确保这个url不包含#号 这样,就能获取到signature
vue中的相关代码
<template>
<div class="pagebg">
<div class="btnbox">
<wx-open-launch-weapp id="launch-btn"
:username="username"
:path="path">
<script type="text/wxtag-template">
<style>
.btn { height: 50px; width: 250px; text-align: center; line-height: 50px; border-radius: 8px; display: inline-block; font-size: 16px; color: #fff; background: #03C160; position: relative; }
.btn img { height: 18px; width: 18px; vertical-align: -3px; }
</style>
<div class="btn">
打开小程序
</div>
</script>
</wx-open-launch-weapp>
</div>
</div>
</template>
username就是你的小程序原始ID,path跳转的路径
import wx from 'weixin-js-sdk' //必须是1.6.0
var nowurl = window.location.href;
var href = nowurl.split('#')[0];
var data = {
hrefURL: href
}
base.publicRequest.getmysfwhwxsignature(data).then(res => {
var config = res;
config.debug = false;
config.jsApiList = [
'chooseImage',
'previewImage',
'openLocation',
'onMenuShareTimeline',
'onMenuShareAppMessage',
'updateAppMessageShareData', //1.4 分享到朋友
'updateTimelineShareData', //1.4分享到朋友圈
'onMenuShareQQ',
'onMenuShareWeibo',
'onMenuShareQZone'];
config.openTagList = ['wx-open-launch-weapp', 'wx-open-launch-app'];
wx.config(config)
wx.error(function (res) {
console.log(res);
});
})
var btn = document.getElementById('launch-btn');
btn.addEventListener('launch', function (e) {
console.log('success');
});
btn.addEventListener('error', function (e) {
console.log('fail', e.detail);
});
document.addEventListener('WeixinOpenTagsError', function (e) {
console.error(e.detail.errMsg); // 无法使用开放标签的错误原因,需回退兼容。仅无法使用开放标签,JS-SDK其他功能不受影响
});
必须使用weixinjs1.6.0版本,请在package.json检查你引入的版本。