微信公众号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系列之数据处理编程实例(一)
May 22 Python
Windows下安装Scrapy
Oct 17 Python
python hook监听事件详解
Oct 25 Python
django主动抛出403异常的方法详解
Jan 04 Python
Pycharm 实现下一个文件引用另外一个文件的方法
Jan 17 Python
Apache部署Django项目图文详解
Jul 30 Python
Python-接口开发入门解析
Aug 01 Python
Python人工智能之路 之PyAudio 实现录音 自动化交互实现问答
Aug 13 Python
如何基于python实现不邻接植花
May 01 Python
python开发入门——set的使用
Sep 03 Python
python实现简单猜单词游戏
Dec 24 Python
解决Pytorch中关于model.eval的问题
May 22 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 之入门篇
2006/12/04 PHP
详解PHP序列化反序列化的方法
2015/10/27 PHP
csdn 博客中实现运行代码功能实现
2009/08/29 Javascript
javascript写的简单的计算器,内容很多,方法实用,推荐
2011/12/29 Javascript
子页向父页传值示例
2013/11/27 Javascript
JavaScript控制table某列不显示的方法
2015/03/16 Javascript
jQuery图片轮播插件——前端开发必看
2016/05/31 Javascript
JS禁止查看网页源代码的实现方法
2016/10/12 Javascript
微信小程序 图片宽度自适应的实现
2017/04/06 Javascript
vue按需加载组件webpack require.ensure的方法
2017/12/13 Javascript
详解使用create-react-app快速构建React开发环境
2018/05/16 Javascript
JS数组去重的6种方法完整实例
2018/12/08 Javascript
vue iview的菜单组件Mune 点击不高亮的解决方案
2019/11/01 Javascript
JS实现轮播图效果
2020/01/11 Javascript
关于vue 结合原生js 解决echarts resize问题
2020/07/26 Javascript
Python实现根据IP地址和子网掩码算出网段的方法
2015/07/30 Python
Python中的TCP socket写法示例
2018/05/11 Python
浅谈python中拼接路径os.path.join斜杠的问题
2018/10/23 Python
TensorFlow2.0:张量的合并与分割实例
2020/01/19 Python
Win10环境中如何实现python2和python3并存
2020/07/20 Python
Python容器类型公共方法总结
2020/08/19 Python
Ubuntu16安装Python3.9的实现步骤
2020/12/15 Python
IE浏览器单独写CSS样式的几种方法
2014/10/14 HTML / CSS
StubHub澳大利亚:购买或出售您的门票
2019/08/01 全球购物
奥地利购买珠宝和手表网站:ELLA JUWELEN
2019/09/03 全球购物
员工培训心得体会
2013/12/30 职场文书
创业融资计划书
2014/04/25 职场文书
忠诚奉献演讲稿
2014/09/12 职场文书
计生办班子群众路线教育实践活动个人对照检查材料思想汇报
2014/10/04 职场文书
师范生见习报告范文
2014/11/03 职场文书
2014年安全管理工作总结
2014/12/01 职场文书
试用期解除劳动合同通知书
2015/04/16 职场文书
房地产项目合作意向书
2015/05/08 职场文书
2016银行招聘自荐信
2016/01/28 职场文书
php png失真的原因及解决办法
2021/11/17 PHP
nginx共享内存的机制详解
2022/03/21 Servers