Facebook Messenger повторяет отправку пользовательского ввода

У меня установлен Facebook Messenger с чат-ботом на PHP.
Я разбиваю то, что обычно бывает одним ответом, на несколько ответных сообщений, чтобы оно выглядело более естественным в чате и было легче читать, чем один большой пузырь чата.

Вот как я это делаю:

for ($i=0; $i<count($response_array); $i++){
$message_fb_format = [
'recipient' => [
'id' => $userID,
],
'message' => [
'text' => $response_array[$i],
],
];

$ch = curl_init($url);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $replyMessageJSON);
curl_setopt($ch, CURLOPT_HTTPHEADER, array('X-Hub-Signature: xxxxxxxxxxxxxxxxxxxxxxxxx', 'Content-Type: application/json'));
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_HTTP_VERSION, 'CURLOPT_HTTP_VERSION_NONE');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$result = curl_exec($ch);
curl_close($ch);

sleep(2);
}

Я обнаружил, что когда я установил sleep() до 2 секунд или более, Facebook Messenger повторяет отправку исходного пользовательского ввода. Затем окно чата выглядит так, как будто мой чат-робот много раз повторяет свои ответы на один вход, но мои журналы ясно показывают, что мой сервер много раз получает одно и то же сообщение от Facebook, и чат-бот отвечает правильно на каждый из них.

Вопрос в том, почему?
Почему 2-секундная пауза между несколькими ответными сообщениями приводит к тому, что Facebook Messenger повторяет отправку исходного сообщения?

0

Решение

Потому что они ожидают, что вы ответите на запрос webhook с 200 OK своевременно, и в противном случае предположим, что что-то пошло не так, что ваш бот был известен тем, что получил отправленные данные, и поэтому он получает отправку снова.

https://developers.facebook.com/docs/messenger-platform/webhook#unsubscribe

Сначала вам нужно будет ответить на входящий запрос webhook с помощью 200 OK и первого ответа, а затем отправить дополнительные сообщения получателю независимо от этого первоначального запроса. (Только со стандартными сообщениями вы не сможете делать это неограниченным образом из-за политики «24 + 1».)

2

Другие решения

Согласно документации Facebook, Вы должны ответить на любой запрос в течение 20 секунд.

Когда вы получаете событие webhook, вы всегда должны возвращать HTTP-ответ 200 OK. Платформа Messenger будет отправлять событие webhook каждые 20 секунд, пока не будет получен ответ 200 OK. Невозможность вернуть 200 OK может привести к тому, что Messenger Platform отменит подписку на ваш веб-крючок.

Вы можете прочитать больше об этом здесь: https://developers.facebook.com/docs/messenger-platform/webhook#response

Может быть, когда приходит много ответов, очередь становится большой, и она периодически повторяет один и тот же ответ снова и снова.
Убедитесь, что вы ответили в течение 20 секунд.

1

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector