微信分享invalid signature签名错误踩过的坑


Posted in Javascript onApril 11, 2020

前一段时间做了一个微信分享的东西,而且前端框架用的是VUE,被这个东西快折磨疯了,一个列表页,一个详情页,分享详情页的时候,会报错invalid signature签名错误。

当时就不淡定了,然后开始了排坑之路,根据官网的各种校验错误问题,没有发现有什么区别

建议按如下顺序检查:

1.确认签名算法正确,可用http://mp.weixin.qq.com/debug/cgi-bin/sandbox?t=jsapisign 页面工具进行校验。

2.确认config中nonceStr(js中驼峰标准大写S), timestamp与用以签名中的对应noncestr, timestamp一致。

3.确认url是页面完整的url(请在当前页面alert(location.href.split('#')[0])确认),包括'http(s)://'部分,以及'?'后面的GET参数部分,但不包括'#'hash后面的部分。

4.确认 config 中的 appid 与用来获取 jsapi_ticket 的 appid 一致。

5.确保一定缓存access_token和jsapi_ticket。

6.确保你获取用来签名的url是动态获取的,动态页面可参见实例代码中php的实现方式。如果是html的静态页面在前端通过ajax将url传到后台签名,前端需要用js获取当前页面除去'#'hash部分的链接(可用location.href.split('#')[0]获取,而且需要encodeURIComponent),因为页面一旦分享,微信客户端会在你的链接末尾加入其它参数,如果不是动态获取当前链接,将导致分享后的页面签名失败。

究竟什么导致呢,后来发现是history在微信中的问题,就是当从列表进入详情页的时候,往后台传入URL,跟你直接从详情页进入传的URL不一致。比如:A=>B,分享B

这时候你需要记录初始页的url,解决办法在你的main.js里,添加

router.beforeEach((to, from, next) => {
 if (!window.initUrl) {
 window.initUrl = location.href.split('#')[0]
 }
 next()
})

然后在你的详情页里B获取

url: '....?url=' + encodeURIComponent(that.isIosOrAndroid() === 'android' ? location.href.split('#')[0] : window.initUrl)

在这里要判断是android还是ios,因为再android里显示是正常的,所以就用

location.href.split('#')[0]

直接获取当前的url即可。

// 判断ios还是android
 Vue.prototype.isIosOrAndroid = function () {
 let u = navigator.userAgent;
 let isAndroid = u.indexOf('Android') > -1 || u.indexOf('Adr') > -1 // android终端
 let isiOS = !!u.match(/\(i[^;]+;( U;)? CPU.+Mac OS X/) // ios终端
 let isStr = ''
 if (isAndroid) {
 isStr = 'android'
 }
 if (isiOS) {
 isStr = 'ios'
 }
 return isStr
 }

总结

到此这篇关于微信分享invalid signature签名错误踩过的坑的文章就介绍到这了,更多相关微信分享invalid signature签名错误内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Javascript 相关文章推荐
JS下高效拼装字符串的几种方法比较与测试代码
Apr 15 Javascript
JS批量修改PS中图层名称的方法
Jan 26 Javascript
js或jquery实现页面打印可局部打印
Mar 27 Javascript
javascript中的try catch异常捕获机制用法分析
Dec 14 Javascript
jQuery电话号码验证实例
Jan 05 Javascript
js实现文字选中分享功能
Jan 25 Javascript
jquery dataTable 获取某行数据
May 05 jQuery
javascript定时器取消定时器及优化方法
Jul 08 Javascript
Vue计算属性的使用
Aug 04 Javascript
详解es6新增数组方法简便了哪些操作
May 09 Javascript
vue.js 打包时出现空白页和路径错误问题及解决方法
Jun 26 Javascript
vue+eslint+vscode配置教程
Aug 09 Javascript
vue.js中使用微信扫一扫解决invalid signature问题(完美解决)
Apr 11 #Javascript
vue使用微信扫一扫功能的实现代码
Apr 11 #Javascript
Vue 中 template 有且只能一个 root的原因解析(源码分析)
Apr 11 #Javascript
vue搜索页开发实例代码详解(热门搜索,历史搜索,淘宝接口演示)
Apr 11 #Javascript
JavaScript实现轮播图特效
Apr 10 #Javascript
JavaScript实现图片伪异步上传过程解析
Apr 10 #Javascript
Vue实现Layui的集成方法步骤
Apr 10 #Javascript
You might like
动态生成gif格式的图像要注意?
2006/10/09 PHP
php的大小写敏感问题整理
2011/12/29 PHP
PHP与javascript实现变量交互的示例代码
2013/07/23 PHP
php创建图像具体步骤
2017/03/13 PHP
PHP使用HTML5 FileApi实现Ajax上传文件功能示例
2019/07/01 PHP
javascript获取元素CSS样式代码示例
2013/11/28 Javascript
Node.js中child_process实现多进程
2015/02/03 Javascript
jQuery动态星级评分效果实现方法
2015/08/06 Javascript
JS原型链 详解及示例代码
2016/09/06 Javascript
使用vue.js实现checkbox的全选和多个的删除功能
2017/02/17 Javascript
jQuery实现的表格前端排序功能示例
2017/09/18 jQuery
Node.js dgram模块实现UDP通信示例代码
2017/09/26 Javascript
vue 实现axios拦截、页面跳转和token 验证
2018/07/17 Javascript
Node.js 使用axios读写influxDB的方法示例
2018/10/26 Javascript
jQuery选择器之层次选择器用法实例分析
2019/02/19 jQuery
如何为你的JS项目添加智能提示与类型检查详解
2019/03/12 Javascript
图解NodeJS实现登录注册功能
2019/09/16 NodeJs
vue-simple-uploader上传成功之后的response获取代码
2020/09/07 Javascript
vue集成一个支持图片缩放拖拽的富文本编辑器
2021/01/29 Vue.js
[04:52]DOTA2亚洲邀请赛附加赛 TOP10精彩集锦
2015/01/29 DOTA
python中查找excel某一列的重复数据 剔除之后打印
2013/02/10 Python
Python用GET方法上传文件
2015/03/10 Python
Python for Informatics 第11章之正则表达式(二)
2016/04/21 Python
Python编程实现二叉树及七种遍历方法详解
2017/06/02 Python
Python cookbook(字符串与文本)在字符串的开头或结尾处进行文本匹配操作
2018/04/20 Python
Selenium控制浏览器常见操作示例
2018/08/13 Python
Python字符串内置函数功能与用法总结
2019/04/16 Python
如何通过python画loss曲线的方法
2019/06/26 Python
python tqdm 实现滚动条不上下滚动代码(保持一行内滚动)
2020/02/19 Python
如何基于Python pygame实现动画跑马灯
2020/11/18 Python
澳大利亚鞋仓库:Shoe Warehouse
2019/07/25 全球购物
文员自我评价怎么写
2013/09/19 职场文书
讲解员培训方案
2014/05/04 职场文书
伦敦奥运会口号
2014/06/13 职场文书
中华魂放飞梦想演讲稿
2014/08/26 职场文书
党的群众路线教育实践活动方案
2014/10/31 职场文书