微信公众号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处理json数据中的中文
Mar 06 Python
Python中struct模块对字节流/二进制流的操作教程
Jan 21 Python
Python编程生成随机用户名及密码的方法示例
May 05 Python
简单谈谈Python中的json与pickle
Jul 19 Python
Python算法之图的遍历
Nov 16 Python
详解TensorFlow在windows上安装与简单示例
Mar 05 Python
对Python中range()函数和list的比较
Apr 19 Python
对TensorFlow的assign赋值用法详解
Jul 30 Python
Python爬虫实战之12306抢票开源
Jan 24 Python
python图形开发GUI库wxpython使用方法详解
Feb 14 Python
2020年10款优秀的Python第三方库,看看有你中意的吗?
Jan 12 Python
jupyter 添加不同内核的操作
Feb 06 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中防止伪造跨站请求的小招式
2011/09/02 PHP
php判断是否为json格式的方法
2014/03/04 PHP
微信支付开发订单查询实例
2016/07/12 PHP
Yii框架弹出框功能示例
2017/01/07 PHP
基于Laravel实现的用户动态模块开发
2017/09/21 PHP
ThinkPHP框架实现导出excel数据的方法示例【基于PHPExcel】
2018/05/12 PHP
用dom+xhtml+css制作的一个相册效果代码打包下载
2008/01/24 Javascript
Node.js中的流(Stream)介绍
2015/03/30 Javascript
3种js实现string的substring方法
2015/11/09 Javascript
javascript设计简单的秒表计时器
2020/09/05 Javascript
学习JavaScript鼠标响应事件
2015/12/25 Javascript
JavaScript基础知识及常用方法总结
2016/01/10 Javascript
Vue结合原生js实现自定义组件自动生成示例
2017/01/21 Javascript
JavaScript无阻塞加载和defer、async详解
2017/02/26 Javascript
原生JavaScript实现Tooltip浮动提示框特效
2017/03/07 Javascript
js实现扫雷小程序的示例代码
2017/09/27 Javascript
web前端开发中常见的多列布局解决方案整理(一定要看)
2017/10/15 Javascript
vue组件实现弹出框点击显示隐藏效果
2020/10/26 Javascript
Vue2.x中利用@font-size引入字体图标报错的解决方法
2018/09/28 Javascript
跨域请求两种方法 jsonp和cors的实现
2018/11/11 Javascript
vue实现拖拽效果
2019/12/23 Javascript
解决ant Design中this.props.form.validateFields未执行的问题
2020/10/27 Javascript
[06:53]DOTA2每周TOP10 精彩击杀集锦vol.3
2014/06/25 DOTA
Python实现KNN邻近算法
2021/01/28 Python
Python中生成器和迭代器的区别详解
2018/02/10 Python
Sanic框架路由用法实例分析
2018/07/16 Python
Python小游戏之300行代码实现俄罗斯方块
2019/01/04 Python
PyQt编程之如何在屏幕中央显示窗体的实例
2019/06/18 Python
Python 获取ftp服务器文件时间的方法
2019/07/02 Python
烹调加工管理制度
2014/02/04 职场文书
辞职信如何写
2015/02/27 职场文书
投诉书格式范本
2015/07/02 职场文书
汽车修理厂管理制度
2015/08/05 职场文书
护理自荐信
2019/05/14 职场文书
李白经典诗之一:全文无一“月”字,却句句有月
2019/07/12 职场文书
Python 恐龙跑跑小游戏实现流程
2022/02/15 Python