You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

配置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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 15:38:21