Facebook graph api Facebook聊天机器人(PHP webhook)发送多个回复

Facebook graph api Facebook聊天机器人(PHP webhook)发送多个回复,facebook-graph-api,webhooks,facebook-messenger,facebook-chatbot,Facebook Graph Api,Webhooks,Facebook Messenger,Facebook Chatbot,我的Facebook聊天机器人正在工作,但在我向它发送初始消息后,它会发回多条消息。这是我的webhook脚本(我很欣赏这是一个非常粗糙的工作示例): $challenge=$\u请求['hub\u challenge']; $verify_token=$_请求['hub_verify_token']; 如果($verify\u token==='MY\u verify\u token'){ 回声$挑战; } $input=json\u解码(文件\u获取\u内容('php://input",对)

我的Facebook聊天机器人正在工作,但在我向它发送初始消息后,它会发回多条消息。这是我的webhook脚本(我很欣赏这是一个非常粗糙的工作示例):

$challenge=$\u请求['hub\u challenge'];
$verify_token=$_请求['hub_verify_token'];
如果($verify\u token==='MY\u verify\u token'){
回声$挑战;
}
$input=json\u解码(文件\u获取\u内容('php://input",对),;
$sender=$input['entry'][0]['messaging'][0]['sender']['id'];
$message=$input['entry'][0]['messaging'][0]['message']['text'];
//API Url
$url='1https://graph.facebook.com/v2.6/me/messages?access_token=';
//开始卷曲。
$ch=curl\u init($url);
//JSON数据。
$jsonData={
“收件人”:{
“id”:“'.$sender.”
}, 
“信息”:{
“文本”:“嘿,李!”
}
}';
//将数组编码为JSON。
$jsonDataEncoded=$jsonData;
//告诉cURL我们要发送POST请求。
卷曲设置($ch,卷曲设置桩,1);
//将我们编码的JSON字符串附加到POST字段。
curl_setopt($ch,CURLOPT_POSTFIELDS,$jsonDataEncoded);
//将内容类型设置为application/json
curl_setopt($ch,CURLOPT_HTTPHEADER,array('Content-Type:application/json'));
//执行请求
$result=curl\u exec($ch);

FB使用原始传入消息点击您的webhook url,您将对其进行处理。然后将响应发送回用户,脚本结束。然后,一旦消息传递给用户,FB就会向webhook url发送传递确认。由于您的脚本总是设置为在任何时候调用它时发送“Hey Lee!”,因此传递回调实际上触发了另一条要发送的消息,然后另一个传递确认进入,然后该过程自己重复它。若要解决此问题,请在代码周围放置if语句以发送消息。这里有一个例子

$challenge=$\u请求['hub\u challenge'];
$verify_token=$_请求['hub_verify_token'];
如果($verify\u token==='MY\u verify\u token'){
回声$挑战;
}
$input=json\u解码(文件\u获取\u内容('php://input",对),;
$sender=$input['entry'][0]['messaging'][0]['sender']['id'];
$message=$input['entry'][0]['messaging'][0]['message']['text'];
//API Url
$url='1https://graph.facebook.com/v2.6/me/messages?access_token=';
//开始卷曲。
$ch=curl\u init($url);
如果($message==“hello”)
{
//JSON数据。
$jsonData={
“收件人”:{
“id”:“'.$sender.”
},
“信息”:{
“文本”:“嘿,李!”
}
}';
}
//将数组编码为JSON。
$jsonDataEncoded=$jsonData;
//告诉cURL我们要发送POST请求。
卷曲设置($ch,卷曲设置桩,1);
//将我们编码的JSON字符串附加到POST字段。
curl_setopt($ch,CURLOPT_POSTFIELDS,$jsonDataEncoded);
//将内容类型设置为application/json
curl_setopt($ch,CURLOPT_HTTPHEADER,array('Content-Type:application/json'));
//执行请求

$result=curl\u exec($ch)我认为这是因为您没有验证发送的消息是否为空:

请尝试以下方法:

$challenge = $_REQUEST['hub_challenge'];
$verify_token = $_REQUEST['hub_verify_token'];

if ($verify_token === 'MY_VERIFICATION_TOKEN') {
  echo $challenge;
}

$input = json_decode(file_get_contents('php://input'), true);

$sender = $input['entry'][0]['messaging'][0]['sender']['id'];
$message = $input['entry'][0]['messaging'][0]['message']['text'];


//API Url
$url = 'https://graph.facebook.com/v2.6/me/messages?access_token=<my-token>';

//Initiate cURL.
$ch = curl_init($url);

//The JSON data.
$jsonData = '{
    "recipient":{
        "id":"'.$sender.'"
    }, 
    "message":{
        "text":"Hey Lee!"
    }
}';

//Encode the array into JSON.
$jsonDataEncoded = $jsonData;

//Tell cURL that we want to send a POST request.
curl_setopt($ch, CURLOPT_POST, 1);

//Attach our encoded JSON string to the POST fields.
curl_setopt($ch, CURLOPT_POSTFIELDS, $jsonDataEncoded);

//Set the content type to application/json
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: application/json'));

//Execute the request
if(!empty($input['entry'][0]['messaging'][0]['message'])){
$result = curl_exec($ch);
}
$challenge=$\u请求['hub\u challenge'];
$verify_token=$_请求['hub_verify_token'];
如果($verify\u token==='MY\u verify\u token'){
回声$挑战;
}
$input=json\u解码(文件\u获取\u内容('php://input",对),;
$sender=$input['entry'][0]['messaging'][0]['sender']['id'];
$message=$input['entry'][0]['messaging'][0]['message']['text'];
//API Url
$url='1https://graph.facebook.com/v2.6/me/messages?access_token=';
//开始卷曲。
$ch=curl\u init($url);
//JSON数据。
$jsonData={
“收件人”:{
“id”:“'.$sender.”
}, 
“信息”:{
“文本”:“嘿,李!”
}
}';
//将数组编码为JSON。
$jsonDataEncoded=$jsonData;
//告诉cURL我们要发送POST请求。
卷曲设置($ch,卷曲设置桩,1);
//将我们编码的JSON字符串附加到POST字段。
curl_setopt($ch,CURLOPT_POSTFIELDS,$jsonDataEncoded);
//将内容类型设置为application/json
curl_setopt($ch,CURLOPT_HTTPHEADER,array('Content-Type:application/json'));
//执行请求
如果(!empty($input['entry'][0]['messaging'][0]['message'])){
$result=curl\u exec($ch);
}

尝试了相同的方法,第一个请求保存了实际的用户消息,其他请求则没有。我只发送一个答案,如果
$message=$input['entry'][0]['messaging'][0]['message']['text']不为空:

if ($message){
//send your message here
}

我正在使用这个例子。Webhook得到验证,当我尝试向我的机器人发送消息时,它什么也不返回。我也不知道如何调试Webhooked页面我也遇到了调试的挑战,但因为Drupal(我聊天机器人的后端平台)的运行,它有一个名为Watchdog的函数,它是一个日志模块,因此您可以将所有内容发送给Watchdog进行调试。使过程非常简单。像这样:$input=json\u decode(file\u get\u contents('php://input",对),;watchdog(“接收到Webhook数据”),''.print\r($input,true)。'';一个webhook被发布以确认交付这一事实让我震惊。谢谢你的解释。这很有道理。取而代之的是这些奇怪的错误:`
已弃用:自动填充$HTTP\u RAW\u POST\u数据已弃用,将在将来的版本中删除。要避免此警告,请在php.ini中将“始终填充\u原始\u发布\u数据”设置为“-1”,并使用php://input 而是流。在第0行未知中

警告:无法修改头信息-在第0行未知中已发送的头
{“错误”:{“消息”:“无效的OAuth访问令牌”,“类型”:“OAuthException”,“代码”:190,“fbtrace_id”:“BsNG\/mJVYem”}^是否需要退出();挑战后;lineI也面临类似的问题,但我添加了一个空邮件检查(传递)。当我检查webhook URL时,它似乎被点击了两次。我使用带有本地服务器的ngrok作为webhook,我可以清楚地看到webhook url被访问了两次,同时消息字段被填充了两次。有什么想法吗?谢谢你的回答!它是w
if ($message){
//send your message here
}