微信公众号token验证失败

# -*- coding: utf-8 -*-
# filename: handle.py

import hashlib
import web

class Handle(object):
    # get方法,验证token
    def GET(self):
        try:
            data = web.input()
            if len(data) == 0:
                return "hello, this is handle view"
            signature = data.signature
            timestamp = data.timestamp
            nonce = data.nonce
            echostr = data.echostr
            token = "weixin" #请按照公众平台官网\基本配置中信息填写

            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()
            print ("handle/GET func: hashcode, signature: ", hashcode, signature)
            if hashcode == signature:
                return echostr
            else:
                return ""
        except Exception as Argument:
            return Argument


if __name__=='__main__':
    pass
# -*- coding: utf-8 -*-
# filename: main.py
import web
from handle import Handle

urls = (
        '/wx', 'Handle',
        )

class Handle(object):
    def GET(self):
        return "hello, this is handle view"

if __name__ == '__main__':
    app = web.application(urls, globals())
    app.run()
~                                                                                                                       
~           

以上是验证微信公众号token的代码

img

直接访问 ip:80 显示 not found
基本配置验证token 也是失败

2023.4.11更
ip:80 有返回信息
hello, this is handle view
但是微信公众号一提交基本配置,就是验证token失败
前两条信息是直接访问ip:80,后面404的是提交基本配置、提示验证失败

img

这段代码中没有明显的语法错误,但是在直接访问IP:80时会显示not found,这可能是因为你没有在路由中指定根目录的访问路径。

你可以尝试将路由中的'/wx'改为'/',并将Handle类的GET方法改为返回echostr参数的值,然后重新访问IP:80。例如:

# main.py
import web
from handle import Handle

urls = (
    '/', 'Handle',  # 将访问路径改为根目录
)

class Handle(object):
    def GET(self):
        data = web.input()
        echostr = data.echostr
        return echostr  # 返回echostr参数的值

if __name__ == '__main__':
    app = web.application(urls, globals())
    app.run()

这样,当你访问IP:80时,应该可以看到一个类似于以下内容的页面:

1234567890

其中1234567890是你在微信公众号后台设置的Token值,表示验证通过。如果你看到了这个页面,说明你的代码没有问题,并且已经成功验证了Token。
其次这个问题可能还有其它原因,以下是一些可能的解决方法:

  1. 确认端口是否开放:如果你使用的是80端口,那么需要确认该端口是否被防火墙或其他安全软件阻止。可以尝试使用telnet或其他工具测试该端口是否开放。

  2. 确认路由是否正确:如果你使用的是路由,需要确认路由是否正确配置。可以尝试使用curl或其他工具测试路由是否正确。

  3. 确认文件名是否正确:如果你使用的是Python Web框架,需要确认文件名是否正确。通常情况下,Web框架会将文件名命名为app.py或者main.py。同时需要确认文件名是否正确配置在路由中。

  4. 确认代码是否正确:如果以上方法都无法解决问题,需要确认代码是否正确。可以尝试使用其他示例代码测试,或者检查代码中是否有语法错误或逻辑错误。

  5. 确认服务器是否配置正确:如果以上方法都无法解决问题,需要确认服务器是否正确配置。确保服务器上安装了必要的软件和库,并且配置文件正确。

试下我这个代码,我之前就是用的这个验证的,你看看行不行

# coding:utf-8
from flask import Flask, request, abort, render_template
import hashlib
import xmltodict
import time
# 用它可以访问http请求地址
import urllib.request as urllib2
import urllib
import json

# 微信的token令牌
WECHAT_TOKEN = '123456'
app = Flask(__name__)

@app.route("/wx/access_auth", methods=["GET", "POST"])
def wechat():
    """验证服务器地址的有效性"""
    # 接收微信服务器发送参数
    signature = request.args.get("signature")
    timestamp = request.args.get("timestamp")
    nonce = request.args.get("nonce")

    # 校验参数
    # 开发者获得加密后的字符串可与signature对比,标识该请求来源于微信
    if not all([signature, timestamp, nonce]):
        # 抛出400错误
        abort(400)

    # 按照微信的流程计算签名
    li = [WECHAT_TOKEN, timestamp, nonce]
    # 排序
    li.sort()
    # 拼接字符串
    tmp_str = "".join(li)
    tmp_str = tmp_str.encode('utf-8')

    # 进行sha1加密, 得到正确的签名值
    sign = hashlib.sha1(tmp_str).hexdigest()

    # 将自己计算的签名值, 与请求的签名参数进行对比, 如果相同, 则证明请求来自微信
    if signature != sign:
        # 代表请求不是来自微信
        # 弹出报错信息, 身份有问题
        abort(403)
    else:
        # 表示是微信发送的请求
        if request.method == "GET":
            # 表示第一次接入微信服务器的验证
            echostr = request.args.get("echostr")
            # 校验echostr
            if not echostr:
                abort(400)
            return echostr

        elif request.method == "POST":
            # 表示微信服务器转发消息过来
            # 拿去xml的请求数据
            xml_str = request.data

            # 当xml_str为空时
            if not xml_str:
                abort(400)

            # 对xml字符串进行解析成字典
            xml_dict = xmltodict.parse(xml_str)

            xml_dict = xml_dict.get("xml")

            # MsgType是消息类型 这里是提取消息类型
            msg_type = xml_dict.get("MsgType")

            if msg_type == "text":
                # 表示发送文本消息
                resp_dict = {
                    "xml":{
                        "ToUserName":xml_dict.get("FromUserName"),
                        "FromUserName":xml_dict.get("ToUserName"),
                        "CreateTime":int(time.time()),
                        "MsgType":"text",
                        "Content":xml_dict.get("Content")
                    }
                }
            else:
                resp_dict = {
                    "xml": {
                        "ToUserName": xml_dict.get("FromUserName"),
                        "FromUserName": xml_dict.get("ToUserName"),
                        "CreateTime": int(time.time()),
                        "MsgType": "text",
                        "Content": "对不起,不能识别您发的内容!"
                    }
                }
            # 将字典转换为xml字符串
            resp_xml_str = xmltodict.unparse(resp_dict)
            # 返回消息数据给微信服务器
            return resp_xml_str

if __name__ == '__main__':
    app.run(host='0.0.0.0', port=80, debug=True)

以下内容部分参考ChatGPT模型:


根据提供的代码,如果直接访问ip:80是not found,那么可能是web应用没有启动或者端口被占用。可以在main.py中添加以下代码来指定端口启动web应用:

if __name__ == '__main__':
    app = web.application(urls, globals())
    app.run(port=80)

另外,在公众号后台配置的url应该是ip/wx,而不是ip:80/wx。

如果基本配置验证token失败,可以检查以下几个方面:

  1. token是否填写正确,需要与公众号后台配置的一致。
  2. 公众号后台配置的url是否与代码中的一致。
  3. 程序是否正确运行,可以在代码中添加print语句来调试。

最后,公众号后台的服务器配置需要使用80或443端口,需要在阿里云的安全组中开放相应的端口。


如果我的建议对您有帮助、请点击采纳、祝您生活愉快

Token值填写错误:请确保您在公众号后台填写的Token值与您的服务器端代码中填写的Token值完全一致。

服务器响应格式不正确:请确保您的服务器端代码正确响应微信服务器发送的GET请求,并返回正确的格式。

服务器响应超时:请确保您的服务器端代码能够在微信服务器发送请求后及时响应,如果响应超时可能会导致Token验证失败。

公众号未通过审核:请确保您的公众号已经通过了微信的审核,如果未通过审核可能会导致Token验证失败。

以下是一个简单的Python实现微信公众号Token验证的例子代码:


import hashlib
from flask import Flask, request

app = Flask(__name__)

# 设置Token值
TOKEN = 'your_token'

@app.route('/', methods=['GET'])
def wechat_auth():
    # 获取微信服务器传来的参数
    signature = request.args.get('signature')
    timestamp = request.args.get('timestamp')
    nonce = request.args.get('nonce')
    echostr = request.args.get('echostr')
    # 将Token、timestamp、nonce三个参数进行字典序排序
    temp_list = [TOKEN, timestamp, nonce]
    temp_list.sort()
    # 将三个参数字符串拼接成一个字符串进行sha1加密
    sha1 = hashlib.sha1()
    sha1.update(''.join(temp_list).encode('utf-8'))
    hashcode = sha1.hexdigest()
    # 将加密后的字符串与signature对比,若相等则说明请求来自微信服务器
    if hashcode == signature:
        return echostr
    else:
        return "Token validation failed"

if __name__ == '__main__':
    app.run(host='0.0.0.0', port=80)

以上代码使用了Flask框架,首先在代码中设置了TOKEN值,然后在路由中获取微信服务器传来的signature、timestamp、nonce和echostr参数,并将其与TOKEN值一起进行加密验证,如果验证成功则将echostr返回给微信服务器,否则返回错误信息。需要注意的是,以上代码仅为示例,实际使用时还需要对代码进行安全性和错误处理等方面的优化。

该回答通过自己思路及引用到GPTᴼᴾᴱᴺᴬᴵ搜索,得到内容具体如下:
根据您提供的代码和截图,可能存在以下问题:

1、 web.py 框架版本问题:在 web.py 0.3 版本中,web.input() 方法返回的是一个字典,而在 0.4 版本中则返回一个 storage 对象。因此,如果您使用的是 0.4 版本及以上的 web.py,需要将代码中的 data.signature、data.timestamp、data.nonce 和 data.echostr 改为 data['signature']、data['timestamp']、data['nonce'] 和 data['echostr']。

2、 URL 配置问题:您的代码中,URL 配置中使用的是 Handle 类而不是 Handle 类的实例,导致访问 /wx 路径时返回的是 "hello, this is handle view",而不是 Handle 类中的 GET 方法的结果。解决方法是将 URL 配置中的 Handle 改为 Handle(),即:

urls = (
    '/wx', 'Handle',
)

class Handle(object):
    def GET(self):
        # ...

改为:

urls = (
    '/wx', 'Handle()',
)

class Handle(object):
    def GET(self):
        # ...

3、 端口号问题:您的代码中,web.py 默认使用的是 8080 端口,而您在访问时使用的是 80 端口。如果您想使用 80 端口,需要在运行应用程序时指定端口号,例如:

if __name__ == '__main__':
    app = web.application(urls, globals())
    app.run(port=80)

或者使用反向代理等方法将 80 端口映射到 8080 端口。

4、 其他问题:您提到基本配置验证 token 也是失败,可能还存在其他问题,例如服务器配置和域名配置等。建议您仔细检查配置是否正确,确保服务器能够正确响应微信服务器的请求。如果仍然无法解决问题,建议查看微信公众平台的官方文档。


如果以上回答对您有所帮助,点击一下采纳该答案~谢谢