微信分享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 相关文章推荐
javascript之水平横向滚动歌词同步的应用
May 07 Javascript
js实现双向链表互联网机顶盒实战应用实现
Oct 28 Javascript
jQuery中filter()方法用法实例
Jan 06 Javascript
运行Node.js的IIS扩展iisnode安装配置笔记
Mar 02 Javascript
JavaScript判断表单中多选框checkbox选中个数的方法
Aug 17 Javascript
js弹出框、对话框、提示框、弹窗实现方法总结(推荐)
May 31 Javascript
JS函数多个参数默认值指定方法分析
Nov 28 Javascript
详解Angular的内置过滤器和自定义过滤器【推荐】
Dec 26 Javascript
JS实现touch 点击滑动轮播实例代码
Jan 19 Javascript
js实现3d悬浮效果
Feb 16 Javascript
js模拟支付宝密码输入框
Apr 11 Javascript
浅谈VUE单页应用首屏加载速度优化方案
Aug 28 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实现的杨辉三角求解算法分析
2019/03/11 PHP
laravel 中某一字段自增、自减的例子
2019/10/11 PHP
js实现的日期操作类DateTime函数代码
2010/03/16 Javascript
dojo随手记 gird组件引用
2011/02/24 Javascript
原生javascript兼容性测试实例
2013/07/01 Javascript
JavaScript常用验证函数实例汇总
2014/11/25 Javascript
jquery属性,遍历,HTML操作方法详解
2016/09/17 Javascript
bootstrap实现动态进度条效果
2017/03/08 Javascript
Angular4 中常用的指令入门总结
2017/06/12 Javascript
JS全角与半角转化实例(分享)
2017/07/04 Javascript
详解Angular.js中$http拦截器的介绍及使用
2017/07/04 Javascript
JavaScript实现滑动导航栏效果
2017/08/30 Javascript
ES6中javascript实现函数绑定及类的事件绑定功能详解
2017/11/08 Javascript
vue 文件目录结构详解
2017/11/24 Javascript
详解angular分页插件tm.pagination二次触发问题解决方案
2018/07/20 Javascript
vue 搭建后台系统模块化开发详解
2019/05/01 Javascript
javascript实现fetch请求返回的统一拦截
2019/12/22 Javascript
JQuery实现折叠式菜单的详细代码
2020/06/03 jQuery
Python和Ruby中each循环引用变量问题(一个隐秘BUG?)
2014/06/04 Python
Python库urllib与urllib2主要区别分析
2014/07/13 Python
Python使用scrapy采集时伪装成HTTP/1.1的方法
2015/04/08 Python
使用Python设置tmpfs来加速项目的教程
2015/04/17 Python
Python根据指定日期计算后n天,前n天是哪一天的方法
2018/05/29 Python
对python条件表达式的四种实现方法小结
2019/01/30 Python
python3下载抖音视频的完整代码
2019/06/05 Python
python tkinter基本属性详解
2019/09/16 Python
numpy np.newaxis 的实用分享
2019/11/30 Python
五分钟学会怎么用Pygame做一个简单的贪吃蛇
2021/01/06 Python
Nike德国官网:Nike.com (DE)
2018/11/13 全球购物
利达恒信公司.NET笔试题面试题
2016/03/05 面试题
法制宣传日活动总结
2014/04/29 职场文书
中秋节主题班会
2015/08/14 职场文书
nginx处理http请求实现过程解析
2021/03/31 Servers
SpringCloud Alibaba项目实战之nacos-server服务搭建过程
2021/06/21 Java/Android
jackson json序列化实现首字母大写,第二个字母需小写
2021/06/29 Java/Android
KVM基础命令详解
2022/04/30 Servers