微信 jssdk 签名错误invalid signature的解决方法


Posted in Javascript onJanuary 14, 2019

几乎每一个开发用于微信公众号页面的工程师都遇到过微信jssdk报的各种错误,通常是permission denied,类似这样:

微信 jssdk 签名错误invalid signature的解决方法

通常他们会建议你把debug选项开开,比如这样:

wechat.config({
   debug: true,
   appId: appId,
   timestamp: timestamp,
   nonceStr: nonceStr,
   signature: signature,
   jsApiList: ['scanQRCode'],
  });

结果你又遇到了invalid signature。类似这样:

微信 jssdk 签名错误invalid signature的解决方法

签名不对,这是什么意思?可是这签名是后端给过来的,我怎么知道它为什么不对?后端用的是标准算法,不可能不对啊。

查网上各种教程,或者微信官网,他们总是不厌其烦地告诉你,让你去检查签名算法,然而根本没有用!

90%的这种情况下,其实只是一个原因:你用于计算签名的URL地址不对,跟算法没有任何关系,完全不必浪费时间去看什么签名算法。

微信要求:如果我们需要在页面中调用微信的某个方法,则必须用这个页面的URL地址获取签名。听上去似乎很好理解,但是实际上URL地址包含的部分很多,有问号,有#号,你所要做的是取出#前面的部分。比如说你的URL地址是这样:https://www.abc.com/abc.html?abc=def#xyz,那么你用于计算签名的URL地址不可以是https://www.abc.com/abc.html,也不能是https://www.abc.com/abc.html?abc=def#xyz,而必须只能是https://www.abc.com/abc.html?abc=def

如何获取当前页面的URL地址呢?这个很简单:

let wechaturl = window.location.href.split('#')[0];

然而你以为事情就这样结束了?太天真。你的页面还是无法正常使用微信函数的。

因为:微信内嵌浏览器在iOS和安卓下的表现不一样。

在安卓下,你确实用上面的方法是可以调用了。但是在iOS下,签名依然失败!因为在iOS下,微信需要你传递的是入口URL,而不是当前页面的URL

比如说,你在微信公众号的某个菜单链接进入了A页面,然后从A页面的某个链接跳转到B页面,然后你在B页面获取签名,如果是在安卓下,你应该用B页面的URL地址来获取,但是在iOS下,你还必须用A页面的URL地址来获取,否则就还是签名失败!

知道了原因,就有很多种解决办法。

首先,我们可以在入口的A页面里增加这样的判断:

if (navigator.userAgent.indexOf('iPhone') !== -1) {
  window.wechaturl = window.location + '';
}

然后,在B页面需要调用签名的地方,再增加这样的判断:

let wechaturl = window.location.href.split('#')[0];
if (window.wechaturl !== undefined) {
 wechaturl = window.wechaturl;
}

这样我们就有效地区分开了iOS和安卓。但问题是在iOS下,如果我的另外一个菜单入口是B页面,我从B页面跳转到A页面,这时候我的入口链接被强制变成了A页面,依然会产生签名失败的错误。

所以我们还需要在微信公众号的每一个入口菜单链接里加一个特殊的参数,例如wechat=1,变成这样:https://www.abc.com/abc.html?abc=def&wechat=1

然后我们再增加一层判断,变成这样:

if (navigator.userAgent.indexOf('iPhone') !== -1) {
 if (this.$route.query.wechat !== undefined && this.$route.query.wechat === '1') {
  window.wechaturl = window.location + '';
 }
}

这里我用了vue的写法,但原理是一样的。只有我检测到了wechat这个参数,我才认为当前页面是入口页面,如果没有检测到,则不必强行设置为入口页面。

这样似乎就解决了微信签名失败的问题。

但是,我们又遇到了另外一种情况:在微信小程序里用web-view内嵌的网页,在安卓下也报permission deniedinvalid signature错误。不过有了上面的经验,我们诊断错误根源还是URL入口地址的问题。果然,在安卓下用入口地址获取签名成功,而用当前地址获取签名失败,为此,我们在入口页面里再加一个判断:

if (navigator.userAgent.indexOf('miniProgram') !== -1) {
 window.wechaturl = window.location + '';
}

至此,各种签名错误的问题才算是全部解决。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
HTML代码中标签的全部属性 中文注释说明
Mar 26 Javascript
javascript 解析url的search方法
Feb 09 Javascript
网站404页面3秒后跳到首页的实例代码
Aug 16 Javascript
jquery实现table鼠标经过变色代码
Sep 25 Javascript
js实现点击图片将图片地址复制到粘贴板的方法
Feb 16 Javascript
微信小程序 闭包写法详细介绍
Dec 14 Javascript
jQuery中的on与bind绑定事件区别实例详解
Feb 28 Javascript
详解Angular Forms中自定义ngModel绑定值的方式
Dec 10 Javascript
VUE实现Studio管理后台之鼠标拖放改变窗口大小
Mar 04 Javascript
jQuery实现倒计时功能完整示例
Jun 01 jQuery
微信小程序学习总结(二)样式、属性、模板操作分析
Jun 04 Javascript
js对象属性名驼峰式转下划线的实例代码
Sep 17 Javascript
详解从react转职到vue开发的项目准备
Jan 14 #Javascript
node全局变量__dirname与__filename的区别
Jan 14 #Javascript
微信小程序时间轴实现方法示例
Jan 14 #Javascript
浅谈webpack devtool里的7种SourceMap模式
Jan 14 #Javascript
关于vue的npm run dev和npm run build的区别介绍
Jan 14 #Javascript
用npm-run实现自动化任务的方法示例
Jan 14 #Javascript
详解vue-cli 2.0配置文件(小结)
Jan 14 #Javascript
You might like
PHP实现时间轴函数代码
2011/10/08 PHP
wordpress安装过程中遇到中文乱码的处理方法
2015/04/21 PHP
Laravel相关的一些故障解决
2020/08/19 PHP
greybox——不开新窗口看新的网页
2007/02/20 Javascript
JavaScript继承方式实例
2010/10/29 Javascript
JavaScript控制两个列表框listbox左右交换数据的方法
2015/03/18 Javascript
js判断复选框是否选中及选中个数的实现代码
2016/05/30 Javascript
Laravel中常见的错误与解决方法小结
2016/08/30 Javascript
利用jquery实现瀑布流3种案例
2016/09/18 Javascript
jQuery如何跳转到另一个网页 就这么简单
2016/12/28 Javascript
jQuery EasyUI Panel面板组件使用详解
2017/02/28 Javascript
Vue.js组件间的循环引用方法示例
2017/12/27 Javascript
JavaScript DOM元素常见操作详解【添加、删除、修改等】
2018/05/09 Javascript
Babel 入门教程学习笔记
2018/06/13 Javascript
详解Vue.js v-for不支持IE9的解决方法
2018/12/29 Javascript
jQuery实现简单的Ajax调用功能示例
2019/02/15 jQuery
vue 实现小程序或商品秒杀倒计时
2019/04/14 Javascript
前端插件之Bootstrap Dual Listbox使用教程
2019/07/23 Javascript
Vue 实现一个命令式弹窗组件功能
2019/09/25 Javascript
让python的Cookie.py模块支持冒号做key的方法
2010/12/28 Python
详解Python中的静态方法与类成员方法
2017/02/28 Python
Python2.7读取PDF文件的方法示例
2017/07/13 Python
Python编程之黑板上排列组合,你舍得解开吗
2017/10/30 Python
快速实现一个简单的canvas迷宫游戏的示例
2018/07/04 HTML / CSS
经济学博士求职自荐信范文
2013/11/23 职场文书
好人好事事迹材料
2014/02/12 职场文书
《小小竹排画中游》教学反思
2014/02/26 职场文书
我们的节日元宵活动方案
2014/08/23 职场文书
招标授权委托书样本
2014/09/23 职场文书
个人四风问题整改措施思想汇报
2014/10/04 职场文书
2014年财务工作总结与计划
2014/12/08 职场文书
安全承诺书
2015/01/19 职场文书
质检员岗位职责
2015/02/03 职场文书
横店影视城导游词
2015/02/06 职场文书
学习师德师风的心得体会(2篇)
2019/10/08 职场文书
苹果发布了MagSafe固件更新,可以不外接电源实现最高7.5W充电
2022/04/21 数码科技