微信公众号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实现ftp客户端示例分享
Feb 17 Python
python正则表达式re之compile函数解析
Oct 25 Python
tensorflow TFRecords文件的生成和读取的方法
Feb 06 Python
python使用matplotlib模块绘制多条折线图、散点图
Apr 26 Python
详解如何减少python内存的消耗
Aug 09 Python
pymysql模块的使用(增删改查)详解
Sep 09 Python
利用setuptools打包python程序的方法步骤
Jan 18 Python
使用Pyhton 分析酒店针孔摄像头
Mar 04 Python
利用Python自动化操作AutoCAD的实现
Apr 01 Python
在Windows上安装和配置 Jupyter Lab 作为桌面级应用程序教程
Apr 22 Python
python dict乱码如何解决
Jun 07 Python
python调用百度AI接口实现人流量统计
Feb 03 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版)
2006/10/09 PHP
php自定义函数之递归删除文件及目录
2010/08/08 PHP
php5.4以上版本GBK编码下htmlspecialchars输出为空问题解决方法汇总
2015/04/03 PHP
PHP判断是否是微信打开还是浏览器打开的方法
2019/02/27 PHP
IE与FireFox的兼容性问题分析
2007/04/22 Javascript
JQuery Easyui Tree的oncheck事件实现代码
2010/05/28 Javascript
理解Javascript_15_作用域分配与变量访问规则,再送个闭包
2010/10/20 Javascript
纯JavaScript实现的兼容各浏览器的添加和移除事件封装
2015/03/28 Javascript
跟我学习javascript的浮点数精度
2015/11/16 Javascript
Bootstrap下拉菜单效果实例代码分享
2016/06/30 Javascript
String字符串截取的四种方式总结
2016/11/28 Javascript
jquery实现页面加载效果
2017/02/21 Javascript
javascript内存分配原理实例分析
2017/04/10 Javascript
JS中将多个逗号替换为一个逗号的实现代码
2017/06/23 Javascript
Vue 多层组件嵌套二种实现方式(测试实例)
2017/09/08 Javascript
关于vue项目中搜索节流的实现代码
2019/09/17 Javascript
JavaScript 变量,数据类型基础实例详解【变量、字符串、数组、对象等】
2020/01/04 Javascript
解决VUE项目使用Element-ui 下拉组件的验证失效问题
2020/11/07 Javascript
python实现用户登陆邮件通知的方法
2015/07/09 Python
python实现判断数组是否包含指定元素的方法
2015/07/15 Python
python实现网站的模拟登录
2016/01/04 Python
基于python的ini配置文件操作工具类
2019/04/24 Python
ipython和python区别详解
2019/06/26 Python
keras多显卡训练方式
2020/06/10 Python
英国最大的老式糖果店:A Quarter Of
2017/04/08 全球购物
Bibloo罗马尼亚网站:女装、男装、童装及鞋子和配饰
2019/07/20 全球购物
异步传递消息系统的作用
2016/05/01 面试题
电大本科自我鉴定
2014/02/05 职场文书
药店采购员岗位职责
2014/09/30 职场文书
群众路线自我剖析范文
2014/11/04 职场文书
特岗教师个人总结
2015/02/10 职场文书
2016大学生就业指导课心得体会
2016/01/15 职场文书
Python竟然能剪辑视频
2021/05/25 Python
MySQL 数据类型选择原则
2021/05/27 MySQL
SQLServer中JSON文档型数据的查询问题解决
2021/06/27 SQL Server
python3 字符串str和bytes相互转换
2022/03/23 Python