问题:h5项目在微信浏览器里,在ios系统下调用微信jssdk失效,报签名失败;在安卓系统里没有这种问题(打开jsdk debug: true,可快速定位问题)

原因:基于vue spa,在history模式下,ios缓存的是首次进入页面的url,当调用微信jsdk进行注册的时候,location.href虽然获取的是当前页面的url,但获取签名的时候其实还是缓存首次进入页面的url,所以会报错。

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

解决方法:

  • 一、首次进入页面的时候将当前url赋值给变量(推荐)
// 记录ios初始化url(可放在main.js入口文件获取,否则可能会有不可预测的问题)
if (
  isIOS() &&
  (typeof window.entryUrl === 'undefined' || window.entryUrl === '')
) {
  window.entryUrl = location.href.split('#')[0];
}
// 安卓路由更新的时候 都会更新,所以安卓就在路由里每次都赋值
router.afterEach(() => {
  // 记录安卓url 用于注册微信jsdk
  if (!isIOS()) window.entryUrl = location.href.split('#')[0];
});
  • 二、调用jsdk的页面进行刷新操作(页面刷新用户体验不好,不推荐)
  • 三、ios首次进入页面的时候就注册微信jsdk方法,后面在使用的时候区分ios还是安卓,是ios的情况下直接调用微信方法,不过安卓还是需要每次获取签名注册
  • 四、还有一种是通过判断url是否一致更新文档location.assign()方法(有可能回不到上个页面,没试过)
Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐