微信公众号获取token失败是什么意思,微信公众号token已过期
我用的是python3,官网给出的例子是python2。问题是python版本不一样。
以下是截取官方示例的部分代码。
list=[令牌、时间戳、随机数]
list.sort()
sha1=hashlib.sha1()
地图(sha1.update,列表)
hashcode=sha1.hexdigest()
我直接告诉你,这一段错了。我也是对比了微信验证时发来的信息后得出的结论。以下是网上找到的加密原理。你可以选择性地看看。
当我们点击提交时,微信服务器将向我们填写的URL发起GET请求,参数如下:时间戳、nonce、echostr、签名。其中,timestamp是时间戳,nonce是随机数,echostr也是随机数。这些都很常见,关键点在于签名。它是通过将nonce、timestamp和token(也就是我们在网页中配置的TOKNE)按字典顺序排序,然后使用智能咖啡豆加密算法得到排序后的字符串数组而生成的。在收到这个GET请求后,我们的服务器提取相应的参数并生成前面提到的hashcode。如果这个值与参数中的签名相同,那么我们将echostr返回给微信服务器,否则返回空值。微信服务器收到这个echostr后,验证这个值是否与它发送的echostr值相同。如果相同,说明这个值确实是我们服务器返回的,从而完成验证,以后所有信息都可以发送到这个服务器地址。这涉及到一些关于安全认证的知识,有兴趣的朋友可以咨询更详细的信息。一般来说,就是让双方能够确认对方的真实身份。
令牌验证失败的原因是map函数。我觉得python的2和3是不一样的。map的第一个参数是函数,第二个参数是列表。函数是将第一个函数依次应用于列表中的每个元素。
我在这里了解了一些关于hashlib的事情。更新是为了防止数据过大,可以使用Update依次添加要加密的数据。
所以综上所述,微信加密就是现在对列表进行排序,然后通过更新将排序后的列表的每个元素合并到总数据中进行加密。贴一段代码帮助你理解
importhashlib
sha1=hashlib.sha1()
sha1.update(a )。编码( utf-8 ))
sha1.update(b 。编码( utf-8 ))
sha1.update(c )。编码( utf-8 ))
相当于:
sha1.update(abc )。编码( utf-8 ))
Hashcode=sha1.hexdigest() #获取加密字符串
因此,在python3下,加密算法应该更改如下
list=[令牌、时间戳、随机数]
list.sort()
sha1=hashlib.sha1()
sha1.update(列表[0])。编码( utf-8 ))
sha1.update(列表[1])。编码( utf-8 ))
sha1.update(列表[2])。编码( utf-8 ))
hashcode=sha1.hexdigest()
经过一番折腾,问题终于解决了。我忍不住吐槽。python3这么久了,为什么开发文档还没有更新?而且还有很多程序还在python2下。唉,对python的又一大批评。
别说,有了这些东西,我都快饿死了。我去吃饭了。
参考文章: