微信分享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 相关文章推荐
让焦点自动跳转
Jul 01 Javascript
一个js实现的所谓的滑动门
May 23 Javascript
JQuery的ajax获取数据后的处理总结(html,xml,json)
Jul 14 Javascript
JQuery循环滚动图片代码
Dec 08 Javascript
jQuery操作checkbox选择(list/table)
Apr 07 Javascript
jQuery使用fadeout实现元素渐隐效果的方法
Mar 27 Javascript
jQuery form插件之ajaxForm()和ajaxSubmit()的可选参数项对象
Jan 23 Javascript
JavaScript html5 canvas绘制时钟效果(二)
Mar 27 Javascript
React实现点击删除列表中对应项
Jan 10 Javascript
浅谈Angular路由守卫
Aug 26 Javascript
vantUI 获得piker选中值的自定义ID操作
Nov 04 Javascript
关于JavaScript轮播图的实现
Nov 20 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
php 删除记录实现代码
2009/03/12 PHP
关于JSON以及JSON在PHP中的应用技巧
2013/11/27 PHP
CI框架给视图添加动态数据
2014/12/01 PHP
使用新的消息弹出框blackbirdjs
2008/10/16 Javascript
仿校内登陆框,精美,给那些很厉害但是没有设计天才的程序员
2008/11/24 Javascript
使用javascript获取flash加载的百分比的实现代码
2011/05/25 Javascript
yui3的AOP(面向切面编程)和OOP(面向对象编程)
2015/05/01 Javascript
javascript十六进制及二进制转化的方法
2015/05/06 Javascript
jQuery实现自动调整字体大小的方法
2015/06/15 Javascript
jquery结合html实现中英文页面切换
2016/11/29 Javascript
微信小程序开发之大转盘 仿天猫超市抽奖实例
2016/12/08 Javascript
javascript 开发之网页兼容各种浏览器
2017/09/28 Javascript
详解React 的几种条件渲染以及选择
2018/10/23 Javascript
微信小程序自定义组件传值 页面和组件相互传数据操作示例
2019/05/05 Javascript
js利用递归与promise 按顺序请求数据的方法
2019/08/30 Javascript
JQuery常用选择器功能与用法实例分析
2019/12/23 jQuery
[03:23:49]2016.12.17日完美“圣”典全回顾
2016/12/19 DOTA
解决windows下Sublime Text 2 运行 PyQt 不显示的方法分享
2014/06/18 Python
Pandas探索之高性能函数eval和query解析
2017/10/28 Python
python+pygame简单画板实现代码实例
2017/12/13 Python
Python设计模式之代理模式简单示例
2018/01/09 Python
利用Python进行图像的加法,图像混合(附代码)
2019/07/14 Python
python 控制Asterisk AMI接口外呼电话的例子
2019/08/08 Python
基于YUV 数据格式详解及python实现方式
2019/12/09 Python
pytorch数据预处理错误的解决
2020/02/20 Python
python GUI库图形界面开发之PyQt5表单布局控件QFormLayout详细使用方法与实例
2020/03/06 Python
Pycharm 2020.1 版配置优化的详细教程
2020/08/07 Python
python 通过 pybind11 使用Eigen加速代码的步骤
2020/12/07 Python
matplotlib之多边形选区(PolygonSelector)的使用
2021/02/24 Python
英国最大的百货公司:Harrods
2016/08/18 全球购物
电子商务专业学生职业生涯规划
2014/03/07 职场文书
入党思想汇报怎么写
2014/04/03 职场文书
JavaScript原型链详解
2021/11/07 Javascript
vue+elementUI实现表格列的显示与隐藏
2022/04/13 Vue.js
vue组件vue-esign实现电子签名
2022/04/21 Vue.js
OpenFeign实现远程调用
2022/08/14 Java/Android