Facebook Chatbot 回发不起作用
Facebook Chatbot postback not working
我在 PHP 中设置了一个工作的 Facebook 聊天机器人,并构建了一个通用模板轮播,其中一个回发按钮是:
[
type"=>"postback",
"title"=>"Opening Hours",
"payload"=>"Opening Hours"
],
按下回发按钮并检查我的 PHP 日志,我得到:
{"object":"page","entry":[{"id":"457107221010xxx","time":1513219207386,
"messaging": [{"recipient":
{"id":"457107221010xxx"},"timestamp":1513219207386,"sender":
{"id":"1510264525690xxx"},"postback":{"payload":"Opening
Hours","title":"Opening Hours"}}]}]}
我通过以下方式在我的代码中处理此回发:
$postback = $input['entry'][0]['messaging'][0]['postback']['payload'];
if ($postback!="") {
$answer = ["text"=> $openingHours];
}
但是在 Messenger window 中按下回发按钮后,Messenger 似乎 "typing" 显示了三点对话框几秒钟,但随后就停止了,没有任何回复。我确实在 webhooks 中启用了 "message_postback" 选项,并且其他查询正在运行(例如,如果我手动输入 "Opening Hours",我将获得营业时间回复)。我使用以下代码处理其他查询并且它有效:
$sender = $input['entry'][0]['messaging'][0]['sender']['id'];
$message = $input['entry'][0]['messaging'][0]['message']['text'];
if(preg_match('[opening|hours]', strtolower($message))) {
$answer = ["text"=>"
Opening Hours:
10:30 am – 1:00 am (Sun-Thu)"];
} else {
//show menu
}
非常感谢任何建议!
由于我没有看到触发实际发送的代码,因此可以在那里找到错误。如果你复制了基础教程,它可能看起来像我很久以前开始的这个:
if(preg_match('[time|current time|now]', strtolower($message))) {
$message_to_reply = date('l jS \of F Y h:i:s A');
} else {
$message_to_reply = 'Huh! what do you mean?';
}
// your code here
$postback = $input['entry'][0]['messaging'][0]['postback']['payload'];
if ($postback!="") {
$message_to_reply = "postback!";
$foundPostback = true;
}
$url = 'https://graph.facebook.com/v2.11/me/messages?access_token='.$access_token;
$ch = curl_init($url);
$jsonData = '{
"recipient":{
"id":"'.$sender.'"
},
"message":{
"text":"'.$message_to_reply.'"
}
}';
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $jsonData);
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: application/json'));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
if(!empty($input['entry'][0]['messaging'][0]['message']) || $foundPostback ){
$result = curl_exec($ch);
}
注意 $foundPostback
。如果您的发送触发器看起来像教程中的一个,它不会发送消息,因为回发消息中没有 $input['entry'][0]['messaging'][0]['message']
属性。因此,如果您检测到回发,则必须保留该标志。
但是,我强烈建议构建自己的 类 来处理消息、回发、传递、回显等。您可以在此处找到有关这些内容的更多信息:Facebook Messenger Docs
我在 PHP 中设置了一个工作的 Facebook 聊天机器人,并构建了一个通用模板轮播,其中一个回发按钮是:
[
type"=>"postback",
"title"=>"Opening Hours",
"payload"=>"Opening Hours"
],
按下回发按钮并检查我的 PHP 日志,我得到:
{"object":"page","entry":[{"id":"457107221010xxx","time":1513219207386,
"messaging": [{"recipient":
{"id":"457107221010xxx"},"timestamp":1513219207386,"sender":
{"id":"1510264525690xxx"},"postback":{"payload":"Opening
Hours","title":"Opening Hours"}}]}]}
我通过以下方式在我的代码中处理此回发:
$postback = $input['entry'][0]['messaging'][0]['postback']['payload'];
if ($postback!="") {
$answer = ["text"=> $openingHours];
}
但是在 Messenger window 中按下回发按钮后,Messenger 似乎 "typing" 显示了三点对话框几秒钟,但随后就停止了,没有任何回复。我确实在 webhooks 中启用了 "message_postback" 选项,并且其他查询正在运行(例如,如果我手动输入 "Opening Hours",我将获得营业时间回复)。我使用以下代码处理其他查询并且它有效:
$sender = $input['entry'][0]['messaging'][0]['sender']['id'];
$message = $input['entry'][0]['messaging'][0]['message']['text'];
if(preg_match('[opening|hours]', strtolower($message))) {
$answer = ["text"=>"
Opening Hours:
10:30 am – 1:00 am (Sun-Thu)"];
} else {
//show menu
}
非常感谢任何建议!
由于我没有看到触发实际发送的代码,因此可以在那里找到错误。如果你复制了基础教程,它可能看起来像我很久以前开始的这个:
if(preg_match('[time|current time|now]', strtolower($message))) {
$message_to_reply = date('l jS \of F Y h:i:s A');
} else {
$message_to_reply = 'Huh! what do you mean?';
}
// your code here
$postback = $input['entry'][0]['messaging'][0]['postback']['payload'];
if ($postback!="") {
$message_to_reply = "postback!";
$foundPostback = true;
}
$url = 'https://graph.facebook.com/v2.11/me/messages?access_token='.$access_token;
$ch = curl_init($url);
$jsonData = '{
"recipient":{
"id":"'.$sender.'"
},
"message":{
"text":"'.$message_to_reply.'"
}
}';
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $jsonData);
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: application/json'));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
if(!empty($input['entry'][0]['messaging'][0]['message']) || $foundPostback ){
$result = curl_exec($ch);
}
注意 $foundPostback
。如果您的发送触发器看起来像教程中的一个,它不会发送消息,因为回发消息中没有 $input['entry'][0]['messaging'][0]['message']
属性。因此,如果您检测到回发,则必须保留该标志。
但是,我强烈建议构建自己的 类 来处理消息、回发、传递、回显等。您可以在此处找到有关这些内容的更多信息:Facebook Messenger Docs