我用的是python3,官网上的例子是python2的写法。 问题是python的版本不同。
以下是官方实例代码的一部分剪切
list=[token,timestamp,nonce]
list.sort () )。
sha1=hashlib.sha1 (
映射(sha1.update,list )。
hashcode=sha1.hexdigest (
我直接告诉你这一段是错的。 这也是从我与微信进行比较验证时发送的信息得出的结论。 以下是在网上找到的加密原理,可以有选择地看。
单击“发送”,微服务将GET请求发送到您填写的URL,并携带timestamp、nonce、echostr和signature参数。
其中timestamp是时间戳,nonce是随机数,echostr也是随机数。 这些都很普通。 重要的是signature,它按字典顺序对三个字符串进行排序: nonce、timestamp和token (即,放在网页上的TOKNE )
我们的服务器收到此GET请求后,提取相应的参数,如上所述生成hashcode。 如果该值与参数的signature相同,则将echostr返回给微服务,否则返回null。
微服务接收到此echostr后,会验证此值是否与发送的echostr的值相同,如果相同,则表明此值确实是从我们的服务返回的,验证完成,今后将所有信息发送到此服务地址
这包括一些安全认证知识,感兴趣的朋友可以查阅更详细的资料。 总的来说,就是让通信双方都能确认对方的真实身份。
token验证失败的原因在于map函数。 python的2和3不同吧。 map函数的第一个参数是函数,第二个参数是列表。 作用是使第一个函数按顺序作用于列表中的每个元素。
我在这里又学到了hashlib。 为了防止update的数据过大,可以依次添加要在update中加密的数据。
综上所述,微信的加密是指将list重新排序,并将重新排序后的列表的各要素汇总到用update汇总加密的数据中。 贴上代码帮助理解
import hashlib
sha1=hashlib.sha1 (
sha1 .更新(a ) .编码() utf-8 ) )
sha1.update(b ).encode ) (utf-8 ) )
sha1 .更新(c ) .编码(utf-8 ) )
等于:
sha1 .更新(ABC ) .编码() 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的大毒辣。
希望以上是正文的全部内容,对大家的学习有帮助。 另外,请大家支持。