微信公众号token验证失败解决方案


Posted in Python onJuly 22, 2019

我用的是python3+,而官网给的例子是python2的写法。问题就在python版本不同。

下面是截取官方的实例代码的一部分

list = [token, timestamp, nonce]
list.sort()
sha1 = hashlib.sha1()
map(sha1.update, list)
hashcode = sha1.hexdigest()

我就直接告诉你这一段错了。也是在我对比微信验证时发送的信息后才得出的结论。以下是在网上找到的加密原理,可以选择性看看。

当我们点击了提交后,微信服务器会向我们所填写的那个URL发起一个GET请求,并携带以下几个参数:timestamp, nonce, echostr, signature。

其中timestamp是一个时间戳,nonce是一个随机数,echostr也是随机数,这几个都很普通,重点在于signature,它的生成方式是将nonce、timestamp和token(也就是我们在网页中配置的TOKNE)三个字符串按照字典序排序后,对排序后得到的字符串数组使用哈希加密算法得到。

我们的服务器在收到这个GET请求后,提取对应的参数,并按照前面说的方式生成hashcode,如果这个值与参数中的signature相同,那么我们就将echostr返回给微信服务器,否则返回空值。

微信服务器收到这个echostr之后,验证这个值与它发送的echostr值是否相同,如果相同,说明这个值的确是由我们的服务器返回的,从而完成验证,今后所有的信息就都可以发送到这个服务器地址上。

这里面涉及到了一些安全认证的相关知识,有兴趣的朋友可以去查阅更详细的资料。总的来说,就是让通信的双方都能够确认对方的真实身份。

token验证失败的原因在于map函数。应该是python的2和3不一样吧。map函数第一个参数是一个函数,第二个参数是一个列表。作用是把第一个函数依次作用于列表中的每个元素。

这里我又学到了hashlib的一些东西。update是防止数据过大,所以可以用update依次添加要加密的数据。

所以综上可以看出,微信的加密就是现将list排序,然后依次将排序后的列表的每个元素用update合并成总的要加密的数据。贴一段代码帮助理解

import hashlib
sha1 = hashlib.sha1()
  sha1.update('a'.encode('utf-8'))
  sha1.update('b'.encode('utf-8'))
  sha1.update('c'.encode('utf-8'))
  等同于:
  sha1.update('abc'.encode('utf-8'))
hashcode = sha1.hexdigest() #获取加密串

所以在python3下,加密的算法要改成如下

list = [token, timestamp, nonce]
list.sort()
sha1 = hashlib.sha1()
sha1.update(list[0].encode('utf-8'))
sha1.update(list[1].encode('utf-8'))
sha1.update(list[2].encode('utf-8'))
hashcode = sha1.hexdigest()

经过一通折腾,终于解决问题了。忍不住吐槽,python3都这么长时间了,为什么开发文档还不更新。而且还有好多程序都还是在python2下。唉,又是python一大诟病。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python reduce()函数的用法小结
Nov 15 Python
python with提前退出遇到的坑与解决方案
Jan 05 Python
Python简单实现控制电脑的方法
Jan 22 Python
python奇偶行分开存储实现代码
Mar 19 Python
Python基于opencv的图像压缩算法实例分析
May 03 Python
解决安装tensorflow遇到无法卸载numpy 1.8.0rc1的问题
Jun 13 Python
python中的字符串内部换行方法
Jul 19 Python
Python 共享变量加锁、释放详解
Aug 28 Python
python飞机大战pygame游戏之敌机出场实现方法详解
Dec 17 Python
Python3运算符常见用法分析
Feb 14 Python
使用python matploblib库绘制准确率,损失率折线图
Jun 16 Python
Python Pandas解析读写 CSV 文件
Apr 11 Python
django 消息框架 message使用详解
Jul 22 #Python
django 邮件发送模块smtp使用详解
Jul 22 #Python
Pandas 重塑(stack)和轴向旋转(pivot)的实现
Jul 22 #Python
Pandas透视表(pivot_table)详解
Jul 22 #Python
django认证系统 Authentication使用详解
Jul 22 #Python
django Admin文档生成器使用详解
Jul 22 #Python
django表单的Widgets使用详解
Jul 22 #Python
You might like
php中创建和调用webservice接口示例
2014/07/25 PHP
php UNIX时间戳用法详解
2017/02/16 PHP
php中bind_param()函数用法分析
2017/03/28 PHP
Ajax中的JSON格式与php传输过程全面解析
2017/11/14 PHP
javascript 二分法(数组array)
2010/04/24 Javascript
Prototype源码浅析 Number部分
2012/01/16 Javascript
跟我学习javascript的隐式强制转换
2015/11/16 Javascript
js 上传文件预览的简单实例
2016/08/16 Javascript
jquery 判断div show的状态实例
2016/12/03 Javascript
jquery使用EasyUI Tree异步加载JSON数据(生成树)
2017/02/11 Javascript
vue2.0实现倒计时的插件(时间戳 刷新 跳转 都不影响)
2017/03/30 Javascript
JavaScript 中调用 Kotlin 方法实例详解
2017/06/09 Javascript
jQuery修改DOM结构_动力节点Java学院整理
2017/07/05 jQuery
bootstrap表格内容过长时用省略号表示的解决方法
2017/11/21 Javascript
解决vue页面刷新或者后退参数丢失的问题
2018/03/13 Javascript
JS简单实现查看文档创建日期、修改日期和文档大小的方法示例
2018/04/08 Javascript
vue.js添加一些触摸事件以及安装fastclick的实例
2018/08/28 Javascript
详解如何在vscode里面调试js和node.js的方法步骤
2018/12/24 Javascript
详解钉钉小程序组件之自定义模态框(弹窗封装实现)
2020/03/07 Javascript
Python模拟百度登录实例详解
2016/01/20 Python
python socket网络编程之粘包问题详解
2018/04/28 Python
对pandas replace函数的使用方法小结
2018/05/18 Python
Python tkinter 下拉日历控件代码
2020/03/04 Python
python实现音乐播放和下载小程序功能
2020/04/26 Python
CSS3 mask 遮罩的具体使用方法
2017/11/03 HTML / CSS
100%羊绒:NakedCashmere
2020/08/26 全球购物
给导游的表扬信
2014/01/10 职场文书
大学生两会精神学习心得体会
2014/03/10 职场文书
法人代表身份证明书及授权委托书
2014/09/16 职场文书
领导班子整改方案
2014/10/25 职场文书
农村党建工作汇报材料
2014/10/27 职场文书
蓬莱阁导游词
2015/02/04 职场文书
关于运动会的宣传稿
2015/07/23 职场文书
优秀家长事迹材料(2016推荐版)
2016/02/29 职场文书
MongoDB修改oplog大小的四种方法
2022/04/11 MongoDB
Vite + React从零开始搭建一个开源组件库
2022/06/25 Javascript