# -*- 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的代码
直接访问 ip:80 显示 not found
基本配置验证token 也是失败
2023.4.11更
ip:80 有返回信息
hello, this is handle view
但是微信公众号一提交基本配置,就是验证token失败
前两条信息是直接访问ip:80,后面404的是提交基本配置、提示验证失败
这段代码中没有明显的语法错误,但是在直接访问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。
其次这个问题可能还有其它原因,以下是一些可能的解决方法:
确认端口是否开放:如果你使用的是80端口,那么需要确认该端口是否被防火墙或其他安全软件阻止。可以尝试使用telnet或其他工具测试该端口是否开放。
确认路由是否正确:如果你使用的是路由,需要确认路由是否正确配置。可以尝试使用curl或其他工具测试路由是否正确。
确认文件名是否正确:如果你使用的是Python Web框架,需要确认文件名是否正确。通常情况下,Web框架会将文件名命名为app.py或者main.py。同时需要确认文件名是否正确配置在路由中。
确认代码是否正确:如果以上方法都无法解决问题,需要确认代码是否正确。可以尝试使用其他示例代码测试,或者检查代码中是否有语法错误或逻辑错误。
确认服务器是否配置正确:如果以上方法都无法解决问题,需要确认服务器是否正确配置。确保服务器上安装了必要的软件和库,并且配置文件正确。
试下我这个代码,我之前就是用的这个验证的,你看看行不行
# 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)
根据提供的代码,如果直接访问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失败,可以检查以下几个方面:
最后,公众号后台的服务器配置需要使用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 也是失败,可能还存在其他问题,例如服务器配置和域名配置等。建议您仔细检查配置是否正确,确保服务器能够正确响应微信服务器的请求。如果仍然无法解决问题,建议查看微信公众平台的官方文档。
如果以上回答对您有所帮助,点击一下采纳该答案~谢谢