微信公众号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中使用Beautiful Soup库的超详细教程
Apr 30 Python
Python字符串格式化输出方法分析
Apr 13 Python
Python中的pygal安装和绘制直方图代码分享
Dec 08 Python
Python代码块批量添加Tab缩进的方法
Jun 25 Python
Python3.7实现中控考勤机自动连接
Aug 28 Python
Python类的继承用法示例
Jan 31 Python
Python学习笔记之For循环用法详解
Aug 14 Python
tensorflow实现读取模型中保存的值 tf.train.NewCheckpointReader
Feb 10 Python
python opencv进行图像拼接
Mar 27 Python
python爬虫实例之获取动漫截图
May 31 Python
pytorch中的numel函数用法说明
May 13 Python
Python可视化神器pyecharts之绘制地理图表练习
Jul 07 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设置静态内容缓存时间的方法
2014/12/01 PHP
PHP创建PowerPoint2007文档的方法
2015/12/10 PHP
php实现等比例压缩图片
2018/07/26 PHP
Ext JS 4实现带week(星期)的日期选择控件(实战二)
2013/08/21 Javascript
PHPMyAdmin导入时提示文件大小超出PHP限制的解决方法
2015/03/30 Javascript
jquery实现简单实用的打分程序实例
2015/07/23 Javascript
Bootstrap3学习笔记(三)之表格
2016/05/20 Javascript
详解Angular.js的$q.defer()服务异步处理
2016/11/06 Javascript
jQuery EasyUI 组件加上“清除”功能实例详解
2017/04/11 jQuery
AngularJS路由Ui-router模块用法示例
2017/05/29 Javascript
ExtJs异步无法向外传值和赋值的完美解决办法
2017/06/14 Javascript
详解A标签中href=""的几种用法
2017/08/20 Javascript
Bootstrap popover 实现鼠标移入移除显示隐藏功能方法
2018/01/24 Javascript
关于Mac下安装nodejs、npm和cnpm的教程
2018/04/11 NodeJs
JavaScript执行环境及作用域链实例分析
2018/08/01 Javascript
微信小程序封装的HTTP请求示例【附升级版】
2019/05/11 Javascript
JQuery常见节点操作实例分析
2019/05/15 jQuery
vue项目中实现缓存的最佳方案详解
2019/07/11 Javascript
Python实现的ini文件操作类分享
2014/11/20 Python
Python实现的下载8000首儿歌的代码分享
2014/11/21 Python
python生成式的send()方法(详解)
2017/05/08 Python
使用Django和Python创建Json response的方法
2018/03/26 Python
python 信息同时输出到控制台与文件的实例讲解
2018/05/11 Python
Django实现登录随机验证码的示例代码
2018/06/20 Python
Python识别html主要文本框过程解析
2020/02/18 Python
解决pytorch下出现multi-target not supported at的一种可能原因
2021/02/06 Python
CSS3图片旋转特效(360/60/-360度)
2013/10/10 HTML / CSS
Algenist奥杰尼官网:微藻抗衰老护肤品牌
2017/07/15 全球购物
美国购买舞会礼服网站:Couture Candy
2019/12/29 全球购物
物业管理员岗位职责范文
2013/11/25 职场文书
马云的职业生涯规划之路
2014/01/01 职场文书
你的创业计划书怎样才能打动风投
2014/02/06 职场文书
幼儿生日活动方案
2014/08/27 职场文书
2016新年晚会开场白
2015/12/03 职场文书
Python爬虫基础之爬虫的分类知识总结
2021/05/13 Python
.Net Core导入千万级数据至Mysql的步骤
2021/05/24 MySQL