微信公众号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 相关文章推荐
Django小白教程之Django用户注册与登录
Apr 22 Python
Python采用Django开发自己的博客系统
Sep 29 Python
Python实现自定义函数的5种常见形式分析
Jun 16 Python
Django分页查询并返回jsons数据(中文乱码解决方法)
Aug 02 Python
Python访问MongoDB,并且转换成Dataframe的方法
Oct 15 Python
在Python中调用Ping命令,批量IP的方法
Jan 26 Python
对Django url的几种使用方式详解
Aug 06 Python
Pycharm+django2.2+python3.6+MySQL实现简单的考试报名系统
Sep 05 Python
flask利用flask-wtf验证上传的文件的方法
Jan 17 Python
Python接口测试结果集实现封装比较
May 01 Python
python 实现压缩和解压缩的示例
Sep 22 Python
python利用opencv实现颜色检测
Feb 23 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 REMOTE_ADDR之获取访客IP的代码
2008/04/22 PHP
php中用于检测一个地理IP地址是否可用的代码
2012/02/19 PHP
php查找任何页面上的所有链接的方法
2013/12/03 PHP
destoon实现商铺管理主页设置增加新菜单的方法
2014/06/26 PHP
PHP 生成微信红包代码简单
2016/03/25 PHP
浅析php中array_map和array_walk的使用对比
2016/11/20 PHP
详解php与ethereum客户端交互
2018/04/28 PHP
自动设置iframe大小的jQuery代码
2013/09/11 Javascript
JQuery实现点击div以外的位置隐藏该div窗口
2013/09/13 Javascript
jQuery实现仿淘宝带有指示条的图片转动切换效果完整实例
2015/03/04 Javascript
Jquery结合HTML5实现文件上传
2015/06/25 Javascript
理解javascript定时器中的setTimeout与setInterval
2016/02/23 Javascript
简单谈谈Vue 模板各类数据绑定
2016/09/25 Javascript
JavaScript登录验证码的实现
2016/10/27 Javascript
详解Sea.js中Module.exports和exports的区别
2017/02/12 Javascript
javascript图片预览和上传(兼容IE)
2017/03/15 Javascript
浅谈vue实现数据监听的函数 Object.defineProperty
2017/06/08 Javascript
Angular2 组件间通过@Input @Output通讯示例
2017/08/24 Javascript
原生JS实现多个小球碰撞反弹效果示例
2018/01/31 Javascript
Vue2.0用户权限控制解决方案的示例
2018/02/10 Javascript
JS中使用cavas截图网页并解决跨域及模糊问题
2018/11/13 Javascript
Vue 中的受控与非受控组件的实现
2018/12/17 Javascript
Vue中computed、methods与watch的区别总结
2019/04/10 Javascript
了解JavaScript表单操作和表单域
2019/05/27 Javascript
通过图带你深入了解vue的响应式原理
2019/06/21 Javascript
vue.js 实现a标签href里添加参数
2019/11/12 Javascript
用Python进行一些简单的自然语言处理的教程
2015/03/31 Python
python 遍历字符串(含汉字)实例详解
2017/04/04 Python
python机器学习之决策树分类详解
2017/12/20 Python
决策树剪枝算法的python实现方法详解
2019/09/18 Python
深度学习入门之Pytorch 数据增强的实现
2020/02/26 Python
Selenium常见异常解析及解决方案示范
2020/04/10 Python
Django REST Framework 分页(Pagination)详解
2020/11/30 Python
刑事申诉状范文
2015/05/20 职场文书
高中数学课堂教学反思
2016/02/18 职场文书
python实现socket简单通信的示例代码
2021/04/13 Python