微信公众号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中遍历文件的3个方法
Sep 02 Python
python pandas库中DataFrame对行和列的操作实例讲解
Jun 09 Python
python统计中文字符数量的两种方法
Jan 31 Python
Python把对应格式的csv文件转换成字典类型存储脚本的方法
Feb 12 Python
用Python从0开始实现一个中文拼音输入法的思路详解
Jul 20 Python
Python 通过微信控制实现app定位发送到个人服务器再转发微信服务器接收位置信息
Aug 05 Python
python实现最大优先队列
Aug 29 Python
Python使用matplotlib 画矩形的三种方式分析
Oct 31 Python
python快速排序的实现及运行时间比较
Nov 22 Python
利用python生成照片墙的示例代码
Apr 09 Python
jupyter notebook 增加kernel教程
Apr 10 Python
Windows下Anaconda安装、换源与更新的方法
Apr 17 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在项目中寻找代码的坏味道(综艺命名)
2012/07/19 PHP
PHP判断一个gif图片是否为动态图片的方法
2014/11/19 PHP
jQuery获取json后使用zy_tmpl生成下拉菜单
2015/03/27 PHP
php源码分析之DZX1.5加密解密函数authcode用法
2015/06/17 PHP
遍历echsop的region表形成缓存的程序实例代码
2016/11/01 PHP
php file_get_contents取文件中数组元素的方法
2017/04/01 PHP
php redis setnx分布式锁简单原理解析
2020/10/23 PHP
一个不错的用JavaScript实现的UBB编码函数
2007/03/09 Javascript
js 走马灯简单实例
2013/11/21 Javascript
javascript实现瀑布流自适应遇到的问题及解决方案
2015/01/28 Javascript
jquery滚动特效集锦
2015/06/03 Javascript
简介JavaScript中Math.cos()余弦方法的使用
2015/06/15 Javascript
JS实现可自定义大小,可双击关闭的弹出层效果
2015/10/16 Javascript
javascript的正则匹配方法学习
2016/02/24 Javascript
浅谈jQuery中事情的动态绑定
2017/02/12 Javascript
jquery Easyui Datagrid实现批量操作(编辑,删除,添加)
2017/02/20 Javascript
javascript深拷贝、浅拷贝和循环引用深入理解
2018/05/27 Javascript
[02:52]2014DOTA2西雅图国际邀请赛 CIS战队巡礼
2014/07/07 DOTA
Python高级应用实例对比:高效计算大文件中的最长行的长度
2014/06/08 Python
python中元类用法实例
2014/10/10 Python
python下实现二叉堆以及堆排序的示例
2017/09/29 Python
django定期执行任务(实例讲解)
2017/11/03 Python
python+opencv实现的简单人脸识别代码示例
2017/11/14 Python
django 框架实现的用户注册、登录、退出功能示例
2019/11/28 Python
tensorflow之变量初始化(tf.Variable)使用详解
2020/02/06 Python
Python的Django框架实现数据库查询(不返回QuerySet的方法)
2020/05/19 Python
Python编写memcached启动脚本代码实例
2020/08/14 Python
法国女性内衣购物网站:Glamuse
2019/05/13 全球购物
清明节演讲稿
2014/05/27 职场文书
个人授权委托书范本格式
2014/10/12 职场文书
资产运营委托书范本
2014/10/16 职场文书
乡镇法制宣传日活动总结
2015/05/05 职场文书
2015年化妆品销售工作总结
2015/05/11 职场文书
素质教育培训心得体会
2016/01/19 职场文书
vue-cli4.5.x快速搭建项目
2021/05/30 Vue.js
MongoDB数据库常用的10条操作命令
2021/06/18 MongoDB