zoukankan      html  css  js  c++  java
  • 微信公众号token验证失败

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

    不说了,折腾了一个这东西,饿死了。吃饭去了。

    参考文章:

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

    hashlib

    python map()函数

    python中sha1 md5等用法

  • 相关阅读:
    xxx
    04消息队列zmq的发布者-订阅者的计算π的简单程序。
    03网络编程从之异步服务器
    03Python网络编程之多线程服务端。
    03Python网络编程之单线程服务端
    03Python网络编程之客户端。
    03Python网络编程系列之服务端
    02select监听客户端
    02select监听服务端
    07爬虫之-urllib总结
  • 原文地址:https://www.cnblogs.com/roadwide/p/10566946.html
Copyright © 2011-2022 走看看