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

微信公众号token验证失败的更多相关文章

  1. 微信公众号token验证失败的一些总结

    这几天准备弄一个微信公众号,在进行服务器配置的时候出现总是出现token验证失败的报错. 实际上,这个问题很好解决.既然微信平台没有给我们很明确的报错提示,那么我们就可以通过跟踪获取到的请求参数进行分 ...

  2. php:微信公众号token验证失败原因、验证码显示不出来的问题

    ob_clean(); 问题描述: 用微信官方提供的demo验证token是成功的,但是放到自己网站的框架上进行token验证老是提示"token验证失败",经过检查(用生成日志的 ...

  3. Thinkphp5 微信公众号token验证不成功的原因

    最近要启动微信项目,上个月就开始了解微信的开发,这个月要启动项目,配置微信公众号信息一直失败.为此,我甚至手工写了微信提交过来的记录,如: &timestamp=1510210523& ...

  4. 微信公众平台Token验证失败的解决办法

    微信公众平台Token验证失败的解决办法 1.可查看url和token是否正确 2.查看服务器端口是否为80端口 3.你可以通过记录log日志来判断是否接受到微信提交过来的信息 1.$fp=fopen ...

  5. 服务器通过微信公众号Token验证测试的代码(Python版)

    我在阿里云租了一个云服务器,然后想把这个作为我的微信公众号的后台,启用微信公众号开发者需要正确的响应微信服务器的Token验证,为此把这个验证的Python代码贴出来,只要在服务器上运行这段代码,注意 ...

  6. asp.net mvc 微信公众号token验证

    本人的公众号要申请成为开发者,必须经过token认证.微信公众号的官方代码只列出了PHP代码的实例,明显是歧视.net用户.我用的asp.net mvc中的web api,结果调了好久都没有成功,最后 ...

  7. php开发公众号 token验证失败 其中一个原因

    断断续续,弄了好几天,索性一狠心花了三个小时,总算找出问题了. "token验证失败" 可能原因有很多种,其他网友已经几乎穷尽了,但是我所遇到的在网络上没有看到,所以这里记录下. ...

  8. 微信公众账号 token 验证失败 解决办法

    问题:微信公众账号 开发过程中配置  token 提示 验证失败 如下图: 点击修改配置: 填写相关url与token(自定义):点击提交,会出现 出现这种情况,主要是对相关参数不熟悉,要了解url与 ...

  9. 微信公众号token 验证

    1. 首先给出测试项目的整体目录: 2. CoreServlet类: 当get请求的时候会执行get方法,post请求的时候会执行post方法,分别来处理不同的请求 package com.zjn.s ...

随机推荐

  1. aiohttp_spider

    aiohttp_spider_def: import asyncio import re import aiohttp import aiomysql from pyquery import PyQu ...

  2. lua 2 变量

    变量在使用前,必须在代码中进行声明,即创建该变量. 编译程序执行代码之前编译器需要知道如何给语句变量开辟存储区,用于存储变量的值. Lua 变量有三种类型:全局变量.局部变量.表中的域. Lua 中的 ...

  3. Vue入门案例(二)

    创建一个 .html 文件,然后通过如下方式引入 Vue: <!-- 开发环境版本,包含了有帮助的命令行警告 --> <script src="https://cdn.js ...

  4. zz自动驾驶多传感器感知的探索

    案例教学,把“问题”讲清楚了,赞 Pony.ai 在多传感器感知上积累了很多的经验,尤其是今年年初在卡车上开始了新的尝试.我们有不同的传感器配置,以及不同的场景,对多传感器融合的一些新的挑战,有了更深 ...

  5. CF613B Skills

    CF613B Skills 洛谷评测传送门 题目描述 Lesha plays the recently published new version of the legendary game hack ...

  6. luoguP3306 [SDOI2013]随机数生成器

    题意 将\(x_1,x_2,x_3...x_n\)写出来可以发现通项为\(a^{i-1}*x_1+b*\sum\limits_{j=0}^{i-2}a^j=a^{i-1}*x_1+b*\frac{1- ...

  7. Python高级应用程序设计任务要求

    Python高级应用程序设计任务要求 用Python实现一个面向主题的网络爬虫程序,并完成以下内容:(注:每人一题,主题内容自选,所有设计内容与源代码需提交到博客园平台) 一.主题式网络爬虫设计方案( ...

  8. INVERSION包

    1.安装该包 if (!requireNamespace("BiocManager", quietly = TRUE))install.packages("BiocMan ...

  9. Note | MATLAB

    目录 1. 读写文件 简单读写 将rgb保存为yuv文件 从yuv文件中读取Y通道 将TIFF图片拼接为yuv文件 2. 字符串操作 3. 画图 4. 词频统计 1. 读写文件 简单读写 fp = f ...

  10. 'GL_EXT_shader_framebuffer_fetch' : extension is not supported

    在使用安卓模拟器加载Flutter应用时, 提示'GL_EXT_shader_framebuffer_fetch' : extension is not supported: D/skia (1404 ...