微信公众号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接收Gmail新邮件并发送到gtalk的方法
Mar 10 Python
python单元测试unittest实例详解
May 11 Python
Django 根据数据模型models创建数据表的实例
May 27 Python
将python图片转为二进制文本的实例
Jan 24 Python
python调用c++传递数组的实例
Feb 13 Python
使用python将mysql数据库的数据转换为json数据的方法
Jul 01 Python
Flask-WTF表单的使用方法
Jul 12 Python
django 中的聚合函数,分组函数,F 查询,Q查询
Jul 25 Python
对Django 转发和重定向的实例详解
Aug 06 Python
python中matplotlib条件背景颜色的实现
Sep 02 Python
python plt可视化——打印特殊符号和制作图例代码
Apr 17 Python
Python实现捕获异常发生的文件和具体行数
Apr 25 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编写注册后Email激活验证的实例代码
2013/03/11 PHP
php读取mysql中文数据出现乱码的解决方法
2013/08/16 PHP
WordPres对前端页面调试时的两个PHP函数使用小技巧
2015/12/22 PHP
IE不出现Flash激活框的小发现的js实现方法
2007/09/07 Javascript
HTML node相关的一些资料整理
2010/01/01 Javascript
用javascript实现自动输出网页文本
2015/07/30 Javascript
Bootstrap每天必学之表单
2015/11/23 Javascript
浏览器检测JS代码(兼容目前各大主流浏览器)
2016/02/21 Javascript
Js获取图片原始宽高的实现代码
2016/05/17 Javascript
js实现div模拟模态对话框展现URL内容
2016/05/27 Javascript
webpack+vue.js快速入门教程
2016/10/12 Javascript
jquery编写日期选择器
2017/03/16 Javascript
webpack 模块热替换原理
2018/04/09 Javascript
Vue登录拦截 登录后继续跳转指定页面的操作
2020/08/04 Javascript
[47:04]EG vs RNG 2019国际邀请赛小组赛 BO2 第二场 8.16
2019/08/18 DOTA
Python中的zip函数使用示例
2015/01/29 Python
python交互式图形编程实例(三)
2017/11/17 Python
利用Python求阴影部分的面积实例代码
2018/12/05 Python
pyqt5 实现工具栏文字图片同时显示
2019/06/13 Python
pycharm new project变成灰色的解决方法
2019/06/27 Python
python函数map()和partial()的知识点总结
2020/05/26 Python
python处理写入数据代码讲解
2020/10/22 Python
python如何调用php文件中的函数详解
2020/12/29 Python
HTML5 Notification(桌面提醒)功能使用实例
2014/03/17 HTML / CSS
家得宝加拿大家装网上商店:The Home Depot加拿大
2016/08/27 全球购物
YSL圣罗兰美妆美国官网:Yves Saint Lauret US
2016/11/21 全球购物
印度尼西亚最大和最全面的网络商城:Blibli.com
2017/10/04 全球购物
拉丁舞学习者的自我评价
2013/10/27 职场文书
中国央视网签名寄语
2014/01/18 职场文书
公司寄语大全
2014/04/10 职场文书
学校教师安全责任书
2014/07/23 职场文书
2016年大学校运会广播稿件
2015/12/21 职场文书
vue-cropper插件实现图片截取上传组件封装
2021/05/27 Vue.js
Pyqt5将多个类组合在一个界面显示的完整示例
2021/09/04 Python
JavaScript 定时器详情
2021/11/11 Javascript
Nginx 安装SSL证书完成HTTPS部署
2022/04/28 Servers