VUE-H5 微信网页分享配置

3,258 阅读4分钟

一、微信公众平台配置

按照官网教程在微信公众平台配置安全域名

二、引入JS文件

在项目中引入 JS文件:res.wx.qq.com/open/js/jwe…

三、通过config接口注入权限验证配置

wx.config({
  debug: false, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。
  appId: '', // 必填,公众号的唯一标识
  timestamp: , // 必填,生成签名的时间戳
  nonceStr: '', // 必填,生成签名的随机串
  signature: '',// 必填,签名
  jsApiList: [] // 必填,需要使用的JS接口列表
});

官方提示:所有需要使用JS-SDK的页面必须先注入配置信息,否则将无法调用(同一个url仅需调用一次,对于变化url的SPA的web app可在每次url变化时进行调用,目前Android微信客户端不支持pushState的H5新特性,所以使用pushState来实现web app的页面会导致签名失败,此问题会在Android6.2中修复)。

问题

在路由使用history情况下,iOS切换路由重新请求接口进行wx.config配置会报invalid signature错误。这个问题只发生在iOS设备上,然而在跳转后的页面进行刷新操作后,wx.config就能调用成功。

解析

在微信开放社区找到官方技术人员回复如下图:

image.png

结合在AndroidiOS设备的不同表现情况分析得出:

Android:每次切换路由,SPAurl是会变的,发起签名请求的url参数必须是当前页面的url

iOS:每次切换路由,SPAurl是不会变的,发起签名请求的url参数必须是最初进入页面时的url

解决办法

  1. 针对iOS设备在main.js中将用户首次进入页面的url地址使用Vuex记录保存。
router.beforeEach((_to, _from, next) => {
  const u = navigator.userAgent;
  const isiOS = !!u.match(/\(i[^;]+;( U;)? CPU.+Mac OS X/); //ios终端
  if (isiOS && store.getters.getIosFirstPath === '') {
    store.commit('ChangeIosFirstPath', window.location.href.split('#')[0]);
  }
  next();
});
  1. 在请求接口时iOS传递的url参数为保存在Vuex中用户首次访问的url地址,Android端则使用window.location.href.split('#')[0]获取当前访问地址传递给后台接口获取配置参数。

四、自定义分享配置

官方文档中提示原有的 wx.onMenuShareTimelinewx.onMenuShareAppMessagewx.onMenuShareQQwx.onMenuShareQZone 接口,即将废弃。需要尽快迁移使用客户端6.7.2及JSSDK 1.4.0以上版本支持的 wx.updateAppMessageShareDatawx.updateTimelineShareData接口。

自定义“分享给朋友”及“分享到QQ”按钮的分享内容(1.4.0)

wx.ready(function () {   //需在用户可能点击分享按钮前就先调用
  wx.updateAppMessageShareData({ 
    title: '', // 分享标题
    desc: '', // 分享描述
    link: '', // 分享链接,该链接域名或路径必须与当前页面对应的公众号JS安全域名一致
    imgUrl: '', // 分享图标
    success: function () {
      // 设置成功
    }
  })
}); 

自定义“分享到朋友圈”及“分享到QQ空间”按钮的分享内容(1.4.0)

wx.ready(function () {      //需在用户可能点击分享按钮前就先调用
  wx.updateTimelineShareData({ 
    title: '', // 分享标题
    link: '', // 分享链接,该链接域名或路径必须与当前页面对应的公众号JS安全域名一致
    imgUrl: '', // 分享图标
    success: function () {
      // 设置成功
    }
  })
}); 

问题

因为项目要求在任意页面内分享出去的链接打开都要访问到首页,故在配置分享内容时将link全部固定为首页的访问地址。

Android端所有页面进行分享操作发送出去的链接打开都显示的首页

iOS端所有页面进行分享操作发送出去的链接打开都是发起分享操作的页面,而非首页

解析

经过测试得出iOS设备配置相同的分享链接时,首次设置会生效

当再次配置link参数相同的分享设置时,系统会默认获取当前页面的地址替换预设的首页地址,导致分享链接打开的页面不是我们所需的首页

解决办法

在分享链接后添加时间戳,解决iOS分享链接相同配置不生效问题

link: `https://www.xxx.com?timestamp=${new Date().getTime()}`

五、参考资料

微信JS-SDK说明文档

微信开放社区 - iOS invalid signature 错误解答