我用的是python3+,而官网给的例子是python2的写法。问题就在python版本不一样。html
下面是截取官方的实例代码的一部分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一大诟病。加密
不说了,折腾了一个这东西,饿死了。吃饭去了。spa
参考文章: