微信公众号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中的socket模块使用代理实例
May 29 Python
速记Python布尔值
Nov 09 Python
python 多线程将大文件分开下载后在合并的实例
Nov 09 Python
Python制作动态字符图的实例
Jan 27 Python
基于sklearn实现Bagging算法(python)
Jul 11 Python
python+pygame实现坦克大战
Sep 10 Python
Python3.7安装keras和TensorFlow的教程图解
Jun 18 Python
Pycharm最新激活码2019(推荐)
Dec 31 Python
python print 格式化输出,动态指定长度的实现
Apr 12 Python
解决Jupyter NoteBook输出的图表太小看不清问题
Apr 16 Python
Python操控mysql批量插入数据的实现方法
Oct 27 Python
matplotlib绘制多子图共享鼠标光标的方法示例
Jan 08 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依赖倒置(Dependency Injection)代码实例
2014/10/11 PHP
PHP表单数据写入MySQL数据库的代码
2016/05/31 PHP
PHP单例模式详解及实例代码
2016/12/21 PHP
window.open被浏览器拦截后的自定义提示效果代码
2007/11/19 Javascript
jquery 回车事件实现代码
2011/08/23 Javascript
jquery ajax 同步异步的执行 return值不能取得的解决方案
2012/01/08 Javascript
深入理解JavaScript中的传值与传引用
2013/12/09 Javascript
Javascript动画效果(4)
2016/10/11 Javascript
任意Json转成无序列表的方法示例
2016/12/09 Javascript
JS实现新建文件夹功能
2017/06/17 Javascript
js事件委托和事件代理案例分享
2017/07/25 Javascript
基于ES6作用域和解构赋值详解
2017/11/03 Javascript
解决vue-cli创建项目的loader问题
2018/03/13 Javascript
在vue-cli项目中使用bootstrap的方法示例
2018/04/21 Javascript
JS实现iframe中子父页面跨域通讯的方法分析
2020/03/10 Javascript
HTML+JS实现“代码雨”效果源码(黑客帝国文字下落效果)
2020/03/17 Javascript
实用的 vue tags 创建缓存导航的过程实现
2020/12/03 Vue.js
python 域名分析工具实现代码
2009/07/15 Python
Python 字符串大小写转换的简单实例
2017/01/21 Python
Python可变参数用法实例分析
2017/04/02 Python
Python 自动化表单提交实例代码
2017/06/08 Python
vscode 远程调试python的方法
2017/12/01 Python
Python实现两款计算器功能示例
2017/12/19 Python
详解python中的装饰器
2018/07/10 Python
python 含子图的gif生成时内存溢出的方法
2019/07/07 Python
Python版中国省市经纬度
2020/02/11 Python
HTML5 Canvas中绘制矩形实例
2015/01/01 HTML / CSS
Expedia挪威官网:酒店、机票和租车
2018/03/03 全球购物
英语专业大学生求职简历的自我评价
2013/10/18 职场文书
保险专业大专生求职信
2013/10/26 职场文书
人事专员工作职责
2014/02/22 职场文书
2016年师德先进个人事迹材料
2016/02/29 职场文书
MySQL 数据类型选择原则
2021/05/27 MySQL
html form表单基础入门案例讲解
2021/07/21 HTML / CSS
OpenCV 图像梯度的实现方法
2021/07/25 Python
蓝牙耳机怎么连接电脑win11? Win11蓝牙耳机连接电脑的技巧
2023/01/09 数码科技