WhatsApp Business API Webhook无数据接收问题求助
排查WhatsApp Business API Webhook无数据传入的问题
1. 先确认Webhook订阅事件是否开启
登录Meta Business Manager的WhatsApp配置后台,检查Webhook的订阅字段:必须勾选messages、message_statuses等你需要接收的事件类型,否则Meta不会主动推送数据。
2. 修正Webhook代码逻辑(区分GET验证和POST数据接收)
你当前的代码没有明确区分GET(验证)和POST(数据推送)请求,而且测试时Meta发送的是POST请求,需要单独处理。替换成以下代码:
<?php $logFile = 'log.txt'; $currentDate = date('Y-m-d H:i:s'); $verifyToken = '你的Meta配置验证令牌'; // 替换成你设置的令牌 // 处理GET请求:Webhook验证 if ($_SERVER['REQUEST_METHOD'] === 'GET') { if (isset($_GET['hub_challenge']) && $_GET['hub_verify_token'] === $verifyToken) { echo $_GET['hub_challenge']; file_put_contents($logFile, "[$currentDate] GET 验证成功 - IP: {$_SERVER['REMOTE_ADDR']}\n", FILE_APPEND); } else { http_response_code(403); echo '无效验证令牌'; file_put_contents($logFile, "[$currentDate] GET 验证失败 - IP: {$_SERVER['REMOTE_ADDR']}\n", FILE_APPEND); } exit; } // 处理POST请求:接收Webhook数据 if ($_SERVER['REQUEST_METHOD'] === 'POST') { $postData = file_get_contents('php://input'); $headers = getallheaders(); // 写入完整日志(包含请求头和请求体) $logEntry = "[$currentDate] POST 请求 - IP: {$_SERVER['REMOTE_ADDR']}\n"; $logEntry .= "请求头:\n"; foreach ($headers as $name => $value) { $logEntry .= "$name: $value\n"; } $logEntry .= "请求体:\n$postData\n"; $logEntry .= "-------------------------\n"; file_put_contents($logFile, $logEntry, FILE_APPEND); // 必须返回200 OK,否则Meta会重复推送 http_response_code(200); echo 'OK'; exit; } // 其他请求方法返回405 http_response_code(405); echo '不允许的请求方法'; ?>
3. 检查服务器配置和权限
- 确认
log.txt文件有写入权限(比如设置chmod 664或775,根据服务器环境调整),否则日志无法写入。 - 检查服务器防火墙、安全插件(如WordPress安全插件)、Nginx/Apache配置是否拦截了POST请求到
webhook.php。 - 确认PHP的
allow_url_fopen配置开启(虽然php://input不受此影响,但可以排查潜在问题)。
4. 正确测试Webhook
在Meta的Webhook配置页面点击「测试」时,必须选择具体的事件类型(比如messages),而不是仅触发验证操作——验证操作是GET请求,本来就不会携带业务数据。
也可以用curl手动模拟POST请求测试:
curl -X POST -H "Content-Type: application/json" -d '{"object":"whatsapp_business_account","entry":[{"id":"你的账号ID","changes":[{"value":{"messages":[{"from":"测试号码","id":"wamid.123","text":{"body":"测试消息"}}]},"field":"messages"}]}]}' https://你的域名/webhook.php
执行后查看log.txt是否有记录,以此验证代码是否正常工作。
5. 检查Meta后台的Webhook状态
在Meta配置页面查看「最近事件」,如果有推送失败记录(比如返回码不是200),说明你的代码没有正确响应,Meta会停止推送。确保代码在接收POST请求时返回200 OK。
内容的提问来源于stack exchange,提问作者JanBal
相关产品推荐
相关产品推荐

