微信 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 相关文章推荐
在textarea中显示html页面的javascript代码
Apr 20 Javascript
JS替换文本域内的回车示例
Feb 18 Javascript
Node.js中创建和管理外部进程详解
Aug 16 Javascript
JS逆序遍历实现代码
Dec 02 Javascript
三分钟带你玩转jQuery.noConflict()
Feb 15 Javascript
详解前端自动化工具gulp自动添加版本号
Dec 20 Javascript
javascript定时器取消定时器及优化方法
Jul 08 Javascript
微信小程序使用modal组件弹出对话框功能示例
Nov 29 Javascript
微信小程序模版渲染详解
Jan 26 Javascript
解决微信小程序云开发中获取数据库的内容为空的方法
May 15 Javascript
js如何获取访问IP、地区、当前操作浏览器
Jul 23 Javascript
vue的$http的get请求要加上params操作
Nov 12 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生成局部唯一识别码LUID的代码
2012/10/06 PHP
改写函数实现PHP二维/三维数组转字符串
2013/09/13 PHP
PHP实现通用alert函数的方法
2015/03/11 PHP
php实现购物车功能(下)
2016/01/05 PHP
php简单实现多维数组排序的方法
2016/09/30 PHP
PHP简单留言本功能实现代码
2017/06/09 PHP
php ajax confirm 删除实例详解
2019/03/06 PHP
jquery 列表双向选择器之改进版
2013/08/09 Javascript
js 上下左右键控制焦点(示例代码)
2013/12/14 Javascript
jQuery.holdReady()使用方法
2014/05/20 Javascript
JS动态改变表格边框宽度的方法
2015/03/31 Javascript
javascript实现rgb颜色转换成16进制格式
2015/07/10 Javascript
jQuery toggle 代替方法
2016/03/22 Javascript
JavaScript语言精粹经典实例(整理篇)
2016/06/07 Javascript
好好了解一下Cookie(强烈推荐)
2016/06/14 Javascript
ES6实现的遍历目录函数示例
2017/04/07 Javascript
vue中阻止click事件冒泡,防止触发另一个事件的方法
2018/02/08 Javascript
JavaScript实现省市联动效果
2019/11/22 Javascript
js判断一个对象是数组(函数)的方法实例
2019/12/19 Javascript
Element Alert警告的具体使用方法
2020/07/27 Javascript
jquery+ajax实现异步上传文件显示进度条
2020/08/17 jQuery
布同自制Python函数帮助查询小工具
2011/03/13 Python
实例讲解Python中函数的调用与定义
2016/03/14 Python
Python常用的爬虫技巧总结
2016/03/28 Python
python中nan与inf转为特定数字方法示例
2017/05/11 Python
pandas中apply和transform方法的性能比较及区别介绍
2018/10/30 Python
python实现关闭第三方窗口的方法
2019/06/28 Python
Html5与App的通讯方式详解
2019/10/24 HTML / CSS
国贸专业自荐信范文
2014/03/02 职场文书
让生命充满爱演讲稿
2014/05/10 职场文书
工业设计专业自荐书
2014/06/05 职场文书
道路运输企业安全生产责任书
2014/07/28 职场文书
领导班子四风问题对照检查材料
2014/09/27 职场文书
四风问题个人剖析材料
2014/10/07 职场文书
本溪水洞导游词
2015/02/11 职场文书
2015年班组工作总结
2015/04/20 职场文书