微信公众号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中zip()函数用法实例教程
Jul 31 Python
Python首次安装后运行报错(0xc000007b)的解决方法
Oct 18 Python
Python实现学生成绩管理系统
Apr 05 Python
ubuntu16.04制作vim和python3的开发环境
Sep 23 Python
pycharm 配置远程解释器的方法
Oct 28 Python
Python后台开发Django会话控制的实现
Apr 15 Python
Python生成一个迭代器的实操方法
Jun 18 Python
使用Python爬虫库requests发送请求、传递URL参数、定制headers
Jan 25 Python
Pycharm 使用 Pipenv 新建的虚拟环境(图文详解)
Apr 16 Python
python3检查字典传入函数键是否齐全的实例
Jun 05 Python
python 制作python包,封装成可用模块教程
Jul 13 Python
详解python命令提示符窗口下如何运行python脚本
Sep 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
一个取得文件扩展名的函数
2006/10/09 PHP
PHP 之Section与Cookie使用总结
2012/09/14 PHP
php实现的简单美国商品税计算函数
2015/07/13 PHP
10个对初学者非常有用的PHP技巧
2016/04/06 PHP
laravel框架select2多选插件初始化默认选中项操作示例
2020/02/18 PHP
学习YUI.Ext 第四天--对话框Dialog的使用
2007/03/10 Javascript
jQuery 验证插件 Web前端设计模式(asp.net)
2010/10/17 Javascript
js setTimeout 参数传递使用介绍
2013/08/13 Javascript
Javascript基础知识(二)事件
2014/09/29 Javascript
jQuery使用slideUp方法实现控制元素缓慢收起
2015/03/27 Javascript
jquery.mousewheel实现整屏翻屏效果
2015/08/30 Javascript
jQuery给div,Span, a ,button, radio 赋值与取值
2016/06/24 Javascript
javascript简单实现跟随滚动条漂浮的返回顶部按钮效果
2016/08/19 Javascript
angular-ui-sortable实现可拖拽排序列表
2016/12/28 Javascript
js 获取今天以及过去日期
2017/04/11 Javascript
vuejs如何配置less
2017/04/25 Javascript
vue移动端裁剪图片结合插件Cropper的使用实例代码
2017/07/10 Javascript
angular2系列之路由转场动画的示例代码
2017/11/09 Javascript
vue组件实现弹出框点击显示隐藏效果
2020/10/26 Javascript
JS引用传递与值传递的区别与用法分析
2018/06/01 Javascript
javascript实现对话框功能警告(alert 消息对话框)确认(confirm 消息对话框)
2019/05/07 Javascript
JavaScript/TypeScript 实现并发请求控制的示例代码
2021/01/18 Javascript
简单了解什么是神经网络
2017/12/23 Python
Python Pywavelet 小波阈值实例
2019/01/09 Python
Python selenium抓取虎牙短视频代码实例
2020/03/02 Python
python deque模块简单使用代码实例
2020/03/12 Python
PyCharm+PyQt5+QtDesigner配置详解
2020/08/12 Python
html5 拖拽上传图片实例演示
2013/04/01 HTML / CSS
Yahoo-PHP面试题1
2016/07/20 面试题
工商技校毕业生自荐信
2013/11/15 职场文书
前台接待岗位职责
2013/12/03 职场文书
企业法人代表证明书
2014/09/27 职场文书
初中历史教学反思
2016/02/19 职场文书
看古人们是如何赞美老师的?
2019/07/08 职场文书
《风不能把阳光打败》读后感3篇
2020/01/06 职场文书
go语言中json数据的读取和写出操作
2021/04/28 Golang