微信公众号token验证失败

我用的是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

参考文章:

手把手教你入门微信公众号开发

hashlib

python map()函数

python中sha1 md5等用法

相关文章
相关标签/搜索