Facebook Messenger Webhooks 执行cURL POST请求时无法发送消息
问题原因与修复方案
核心代码错误
你代码中最直接的问题是变量名不匹配:send_reply函数的入参名为$reply_message,但你在设置CURLOPT_POSTFIELDS参数时调用了未定义的变量$json_string,这会导致提交给Facebook接口的请求体为空,自然无法成功发送消息。
直接修改这一行即可修复该问题:
// 原错误代码 curl_setopt($curl, CURLOPT_POSTFIELDS, $json_string); // 修改为 curl_setopt($curl, CURLOPT_POSTFIELDS, $reply_message);
其他排查修复步骤
如果修改后仍有问题,按以下顺序排查:
- 打印接口返回信息确认错误原因:你当前看到的
200 OK是你自己的webhook接口的响应状态,不是Facebook Graph API的返回结果。在curl_exec执行后增加错误校验逻辑,查看具体报错:
常见的Facebook返回错误包括令牌无效、权限不足、接收者ID错误、消息类型不符合规则等,根据返回的错误码针对性处理即可。$data = curl_exec($curl); // 增加curl错误校验 if(curl_errno($curl)){ var_dump(curl_error($curl)); } $result = json_decode($data, TRUE); // 打印Facebook返回的完整结果 var_dump($result); - 校验Access Token权限:确认你使用的页面访问令牌已申请
pages_messaging权限,且未过期,令牌绑定的页面和webhook接收事件的页面为同一个。 - 校验消息发送规则:
RESPONSE类型的消息仅能在用户给你发消息后的24小时窗口期内发送,超过窗口期需要使用带合规标签的MESSAGE_TAG类型才能发送。 - 避免手动拼接JSON:手动写JSON容易出现多余空格、换行、引号不匹配等语法错误,建议用PHP内置的
json_encode生成请求体,示例如下:$reply_data = [ "messaging_type" => "RESPONSE", "recipient" => ["id" => $sender_id], "message" => ["text" => "hello, world!"] ]; $reply_message = json_encode($reply_data); - 校验接收者ID正确性:确认你填写的接收者ID是webhook事件中拿到的用户
sender.id,不要和页面ID、接收者ID填反。
内容的提问来源于stack exchange,提问作者Kawin Cheong
相关产品推荐
相关产品推荐

