配置WhatsApp Webhook回调URL失败,请求技术指导
WhatsApp Webhook验证失败的修复方案
核心问题
你的代码里缺少返回hub.challenge的关键步骤,Meta服务器验证Webhook时,会发送带hub.challenge和hub.verify_token的GET请求,当令牌匹配时,必须原样返回hub.challenge的值,否则会判定验证失败。
修复后的完整代码
<?php add_action('rest_api_init', function () { register_rest_route( 'test/v1', '/whatsapp', array( 'methods' => ['GET', 'POST'], // 同时支持POST,后续接收消息需要用POST请求 'callback' => 'whatsapp_webhook_handler' ) ); }); $hubVerifyToken = "123456789"; function whatsapp_webhook_handler() { // 处理GET验证请求 if ($_SERVER['REQUEST_METHOD'] === 'GET') { // 检查必要参数是否存在 if (isset($_GET['hub.challenge']) && isset($_GET['hub.verify_token'])) { // 验证令牌匹配 if ($_GET['hub.verify_token'] === $hubVerifyToken) { // 原样返回challenge,终止后续输出 echo $_GET['hub.challenge']; exit; } else { // 令牌不匹配返回403 http_response_code(403); echo "Invalid verification token"; exit; } } else { // 参数缺失返回400 http_response_code(400); echo "Missing required parameters"; exit; } } // 处理POST消息接收(后续接收WhatsApp消息用) if ($_SERVER['REQUEST_METHOD'] === 'POST') { // 这里添加处理消息的逻辑 http_response_code(200); echo "OK"; exit; } }
额外排查点
- 确保回调URL是公网可访问的,本地localhost或内网地址无法被Meta服务器访问
- 确认Webhook配置页面输入的验证令牌和代码里的
$hubVerifyToken完全一致,注意大小写、空格等细节 - 检查服务器防火墙、WordPress安全插件是否拦截了Meta的请求,必要时放行相关IP段
- 如果用WordPress REST API,更规范的写法是使用
WP_REST_Request对象获取参数:
function whatsapp_webhook_handler(WP_REST_Request $request) { if ($request->get_method() === 'GET') { $challenge = $request->get_param('hub.challenge'); $verifyToken = $request->get_param('hub.verify_token'); if ($verifyToken === $hubVerifyToken && $challenge) { return new WP_REST_Response($challenge, 200); } else { return new WP_REST_Response("Invalid token", 403); } } // POST请求处理 if ($request->get_method() === 'POST') { // 处理消息逻辑 return new WP_REST_Response("OK", 200); } }
内容的提问来源于stack exchange,提问作者Phạm Quang Trung
相关产品推荐
相关产品推荐

