微信公众号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编辑器WingIDE的使用经验总结
Aug 31 Python
Python实现Windows和Linux之间互相传输文件(文件夹)的方法
May 08 Python
python 读写中文json的实例详解
Oct 29 Python
pyhanlp安装介绍和简单应用
Feb 22 Python
python脚本之一键移动自定格式文件方法实例
Sep 02 Python
详解Django将秒转换为xx天xx时xx分
Sep 27 Python
python科学计算之narray对象用法
Nov 25 Python
基于python实现语音录入识别代码实例
Jan 17 Python
使用 Python 读取电子表格中的数据实例详解
Apr 17 Python
pycharm永久激活超详细教程
Oct 29 Python
python 邮件检测工具mmpi的使用
Jan 04 Python
python实现对doc、txt、xls等文档的读写操作
Apr 02 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
珊瑚虫IP库浅析
2007/02/15 PHP
frename PHP 灵活文件命名函数 frename
2009/09/09 PHP
PHP zlib扩展实现页面GZIP压缩输出
2010/06/17 PHP
php源码分析之DZX1.5字符串截断函数cutstr用法
2015/06/17 PHP
JS中批量给元素绑定事件过程中的相关问题使用闭包解决
2013/04/15 Javascript
Egret引擎开发指南之编译项目
2014/09/03 Javascript
原生js和jQuery随意改变div属性style的名称和值
2014/10/22 Javascript
js实现点击图片将图片地址复制到粘贴板的方法
2015/02/16 Javascript
js实现滚动条滚动到页面底部继续加载
2015/12/19 Javascript
jQuery购物网页经典制作案例
2016/08/19 Javascript
bootstrap按钮插件(Button)使用方法解析
2017/01/13 Javascript
React.js中常用的ES6写法总结(推荐)
2017/05/09 Javascript
React服务端渲染(总结)
2017/07/01 Javascript
浅谈Vuejs中nextTick()异步更新队列源码解析
2017/12/31 Javascript
Vue 应用中结合vux使用微信 jssdk的方法
2018/08/28 Javascript
webpack4 处理SCSS的方法示例
2018/09/03 Javascript
vue 项目打包时样式及背景图片路径找不到的解决方式
2019/11/12 Javascript
详解JS深拷贝与浅拷贝
2020/08/04 Javascript
[01:00:14]DOTA2-DPC中国联赛 正赛 Ehome vs Elephant BO3 第二场 2月28日
2021/03/11 DOTA
python生成日历实例解析
2014/08/21 Python
Python的Django框架使用入门指引
2015/04/15 Python
举例讲解Python的Tornado框架实现数据可视化的教程
2015/05/02 Python
Python使用turtule画五角星的方法
2015/07/09 Python
解决pyttsx3无法封装的问题
2018/12/24 Python
Python 实现自动导入缺失的库
2019/10/29 Python
Python基于DB-API操作MySQL数据库过程解析
2020/04/23 Python
CSS3教程:边框属性border的极致应用
2009/04/02 HTML / CSS
浅谈Html5中视频 音频标签 进度条的问题
2016/07/26 HTML / CSS
澳大利亚宠物商店:Petbarn
2017/11/18 全球购物
采购部主管岗位职责
2014/01/01 职场文书
幼儿教师考核制度
2014/01/25 职场文书
学校安全生产承诺书
2014/05/23 职场文书
经济贸易系毕业生求职信
2014/05/31 职场文书
聋哑人盗窃罪辩护词
2015/05/21 职场文书
团支部组织委员竞选稿
2015/11/21 职场文书
Pytorch中TensorBoard及torchsummary的使用详解
2021/05/12 Python