微信 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 相关文章推荐
JavaScript静态的动态
Sep 18 Javascript
js escape,unescape解决中文乱码问题的方法
May 26 Javascript
Textbox控件注册回车事件及触发按钮提交事件具体实现
Mar 04 Javascript
javascript的propertyIsEnumerable()方法使用介绍
Apr 09 Javascript
JavaScript_ECMA5数组新特性详解
Jun 12 Javascript
jQuery事件对象总结
Oct 17 Javascript
ajax 提交数据到后台jsp页面及页面跳转问题
Jan 19 Javascript
详解Vue 非父子组件通信方法(非Vuex)
May 24 Javascript
Angular 4环境准备与Angular cli创建项目详解
May 27 Javascript
vue定义全局变量和全局方法的方法示例
Aug 01 Javascript
在weex中愉快的使用scss的方法步骤
Jan 02 Javascript
交互式可视化js库gojs使用介绍及技巧
Feb 18 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项目中百度 UEditor 简单安装调试和调用
2015/07/15 PHP
在Mac OS上搭建Nginx+PHP+MySQL开发环境的教程
2015/12/21 PHP
php常用数组函数实例小结
2016/12/29 PHP
Avengerls vs KG BO3 第二场2.18
2021/03/10 DOTA
封装好的省市地区联动控件附下载
2007/08/13 Javascript
xheditor与validate插件冲突的解决方案
2010/04/15 Javascript
Jquery数独游戏解析(一)-页面布局
2010/11/05 Javascript
20款非常优秀的 jQuery 工具提示插件 推荐
2012/07/15 Javascript
使用insertAfter()方法在现有元素后添加一个新元素
2014/05/28 Javascript
JavaScript制作淘宝星级评分效果的思路
2020/06/23 Javascript
jquery 无限极下拉菜单的简单实例(精简浓缩版)
2016/05/31 Javascript
jquery常用的12个小功能
2016/07/22 Javascript
Bootstrap弹出框modal上层的输入框不能获得焦点问题的解决方法
2016/12/13 Javascript
vue 指令之气泡提示效果的实现代码
2018/10/18 Javascript
微信小程序基础教程之worker线程的使用方法
2019/07/15 Javascript
对layui中table组件工具栏的使用详解
2019/09/19 Javascript
使用React-Router实现前端路由鉴权的示例代码
2020/07/26 Javascript
基于python 处理中文路径的终极解决方法
2018/04/12 Python
Python实现九宫格式的朋友圈功能内附“马云”朋友圈
2019/05/07 Python
python gensim使用word2vec词向量处理中文语料的方法
2019/07/05 Python
Python3 venv搭建轻量级虚拟环境的步骤(图文)
2019/08/09 Python
Flask框架实现的前端RSA加密与后端Python解密功能详解
2019/08/13 Python
Python基于read(size)方法读取超大文件
2020/03/12 Python
Python中openpyxl实现vlookup函数的实例
2020/10/28 Python
Stefania Mode英国:奢华设计师和时尚服装
2017/10/23 全球购物
真正的英国宝藏:Mappin & Webb
2019/05/05 全球购物
小学运动会广播稿200字(十二篇)
2014/01/14 职场文书
公司合作意向书
2014/04/01 职场文书
大学生评语大全
2014/04/18 职场文书
如何写求职信
2014/05/24 职场文书
售房协议书范本2014
2014/10/23 职场文书
八一建军节慰问信
2015/02/14 职场文书
初一数学教学反思
2016/02/17 职场文书
Python爬虫之自动爬取某车之家各车销售数据
2021/06/02 Python
Feign调用全局异常处理解决方案
2021/06/24 Java/Android
电脑关机速度很慢怎么办 提升电脑关机速度设置教程
2022/04/08 数码科技