问题分析

  1. 路由模式为History:当Vue使用History模式时,微信分享可能会遇到签名错误。
  2. iOS设备:在iOS设备上,微信分享时签名失效的情况更为常见。

原因分析

  1. iOS缓存问题:iOS设备在处理微信分享时,可能会缓存页面信息,导致签名验证失败。
  2. 单页面应用(SPA)的特性:Vue作为SPA应用,页面不会刷新,而是通过JavaScript进行路由切换,这可能导致签名失效。
  3. URL参数处理:当URL中包含特殊字符或空格时,微信签名可能会失败。

解决方案

步骤1:配置JS接口安全域名

步骤2:引入微信JS-SDK

import wx from 'weixin-js-sdk';

步骤3:配置签名

function configWxSignature() {
  // 获取签名配置信息
  axios.get('/wechat/config').then((response) => {
    const config = response.data;
    wx.config({
      debug: false,
      appId: config.appId,
      timestamp: config.timestamp,
      nonceStr: config.nonceStr,
      signature: config.signature,
      jsApiList: ['onMenuShareTimeline', 'onMenuShareAppMessage']
    });
  });
}

步骤4:处理URL参数

确保URL参数正确处理,避免包含特殊字符或空格。以下是一个处理URL参数的示例:

function handleUrlParams() {
  const params = new URLSearchParams(window.location.search);
  // 处理URL参数
  // ...
}

步骤5:区分Android和iOS

根据不同的设备,进行不同的处理。以下是一个区分Android和iOS的示例:

let u = navigator.userAgent;
let isAndroid = u.indexOf('Android') > -1 || u.indexOf('Adr') > -1; // android终端或uc浏览器
let isiOS = !!u.match(/\(i[^;]+;(U;)? CPU.+Mac OS X/); // ios终端

if (isAndroid) {
  // 处理Android设备
} else if (isiOS) {
  // 处理iOS设备
}

步骤6:监听签名错误

wx.error(function(err) {
  console.log('微信签名错误:', err);
  // 处理签名错误
});

总结