Azure Flask搭建WhatsApp API Webhook问题:无法接收事件负载
解决Azure部署Webhook接收WATI事件负载的问题
一、先修复Azure Function App代码的核心问题
你的Function App代码存在几个致命问题,直接导致请求无法处理、日志无输出:
- 缩进错误:
name = req.params.get('name')与上方logging.info缩进层级不一致,Python会抛出语法错误,请求根本无法进入处理逻辑。 - 日志输出错误:Azure Function仅捕获
logging模块的输出,print()内容不会出现在日志流中。 - 负载结构不匹配:WATI发送的Webhook负载不包含
name字段,你需要针对WATI的实际事件结构解析数据。
修正后的Function App代码示例:
import azure.functions as func import logging import json app = func.FunctionApp(http_auth_level=func.AuthLevel.ANONYMOUS) @app.route(route="HttpExample", methods=['POST']) def HttpExample(req: func.HttpRequest) -> func.HttpResponse: logging.info('Python HTTP trigger function processed a request.') try: req_body = req.get_json() logging.info(f"Received payload: {json.dumps(req_body)}") # 提取WATI消息内容(根据WATI官方文档调整字段) message_text = req_body.get('messages', [{}])[0].get('text', {}).get('body') if message_text: logging.info(f"Extracted message: {message_text}") # 此处添加你的WATI业务逻辑(如调用API回复消息) return func.HttpResponse("Webhook received successfully", status_code=200) else: logging.warning("No valid message text found in payload") return func.HttpResponse("Invalid payload structure", status_code=400) except ValueError: logging.error("Failed to parse JSON payload") return func.HttpResponse("Invalid JSON format", status_code=400)
二、Azure部署的关键配置检查
1. 确认HTTPS端点正确性
WATI要求Webhook必须使用HTTPS,Azure服务默认提供HTTPS域名,需确保WATI后台填写的URL格式正确:
- Function App:
https://<你的函数应用名>.azurewebsites.net/api/HttpExample(注意末尾路由名要与代码中route参数一致) - Web App:
https://<你的Web应用名>.azurewebsites.net/<你的Flask端点路径>
2. 配置CORS规则
WATI的请求可能触发跨域检查,需在Azure后台添加允许的来源:
- Function App:进入「平台功能」→「CORS」→ 添加
*(测试用,上线后可限制为WATI官方域名) - Web App:进入「平台功能」→「CORS」→ 同样添加允许的域名
3. 关闭不必要的身份验证
你的Function App已设置AuthLevel.ANONYMOUS,这是正确的(WATI不会携带Azure认证密钥)。如果用Web App,需确保未启用「App Service身份验证」,除非你专门配置了WATI的认证方式。
三、Webhook测试与排查方法
- 用Postman模拟请求:构造符合WATI格式的POST请求,直接发送到Azure端点,检查返回状态和日志流。
- 查看Azure监控日志:除了日志流,可在Application Insights中查看请求轨迹,确认请求是否到达、是否有报错。
- 使用WATI后台测试功能:WATI通常提供Webhook测试工具,发送测试事件后查看后台的失败提示(如超时、403错误等)。
四、Flask Web App部署额外注意事项
如果选择用Web App替代Function App,需完成以下配置:
- 在
requirements.txt中添加flask、WATI等依赖 - 编写Flask应用的POST端点逻辑
- 在Azure Web App的「配置」→「常规设置」中设置启动命令:
gunicorn --bind=0.0.0.0 --timeout 600 app:app
内容的提问来源于stack exchange,提问作者CsG.
相关产品推荐
相关产品推荐

