H5打开小程序:<wx-open-launch-weapp>按钮不显示的相关问题解决

1,410 阅读2分钟

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检查你引入的版本。