微信公众号token验证失败解决方案

作者:roadwide 时间:2022-01-22 14:33:45 

我用的是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一大诟病。

来源:https://www.cnblogs.com/roadwide/p/10566946.html

标签:微信,公众号,token,验证,失败
0
投稿

猜你喜欢

  • Python获取android设备cpu和内存占用情况

    2023-02-25 20:46:47
  • 中秋快到了利用python画个月亮和月饼

    2021-09-16 13:55:51
  • Python递归函数特点及原理解析

    2023-12-02 19:40:40
  • PyQt5 matplotlib画图不刷新的解决方案

    2021-06-14 14:43:39
  • Python 实现多表和工作簿合并及一表按列拆分

    2022-06-27 05:58:42
  • dataframe设置两个条件取值的实例

    2021-09-15 05:56:50
  • Python常用内置函数的使用教程详解

    2021-11-11 21:23:50
  • 对pytorch中x = x.view(x.size(0), -1) 的理解说明

    2022-04-14 00:02:53
  • [译]2009年海外Web设计风潮(下)

    2009-01-23 09:34:00
  • django settings.py 配置文件及介绍

    2022-01-17 12:52:44
  • XML轻松学习手册(3)XML的术语

    2008-09-05 17:17:00
  • Python 文档解析lxml库的使用详解

    2022-01-24 10:42:38
  • asp如何防止计数器刷新计数?

    2009-11-22 19:19:00
  • Python迭代用法实例教程

    2021-07-18 13:00:45
  • PHP getDocNamespaces()函数讲解

    2023-06-13 22:19:06
  • Python利用正则表达式匹配并截取指定子串及去重的方法

    2021-05-07 00:37:20
  • Python入门教程4. 元组基本操作 <font color=red>原创</font>

    2021-01-12 09:53:21
  • Python之根据输入参数计算结果案例讲解

    2022-08-27 07:44:50
  • 完美解决jupyter由于无法import新包的问题

    2021-09-19 01:21:11
  • MySQL Proxy应用入门(1)--安装MySQL Proxy

    2011-03-08 09:50:00
  • asp之家 网络编程 m.aspxhome.com