Получение повторных вызовов на веб-хостинге facebook-messenger

Я успешно установил веб-сайт facebook-messenger. До вчерашнего дня я мог отправлять и получать сообщения. Но сегодня, когда я отправляю одно сообщение от пользователя, я получаю несколько вызовов на сервере POST API сервера webhook. Они никогда не останавливаются.

Ответ 1

Выяснил это. Я отправлял ответ на каждое сообщение, полученное из facebook. Поэтому я также ответил на сообщения ACK. В свою очередь появился еще один ACK. Вот почему это привело к бесконечному циклу.

В этой странице мы можем найти различные структуры объектов для полученных сообщений:

текст

{
"object":"page",
"entry":[
{
  "id":PAGE_ID,
  "time":1457764198246,
  "messaging":[
    {
      "sender":{
        "id":USER_ID
      },
      "recipient":{
        "id":PAGE_ID
      },
      "timestamp":1457764197627,
      "message":{
        "mid":"mid.1457764197618:41d102a3e1ae206a38",
        "seq":73,
        "text":"hello, world!"
      }
    }
  ]
}
]
}

Message-Delivered callback

{
 "object":"page",
 "entry":[
  {
     "id":PAGE_ID,
     "time":1458668856451,
     "messaging":[
        {
           "sender":{
              "id":USER_ID
           },
           "recipient":{
              "id":PAGE_ID
           },
           "delivery":{
              "mids":[
                 "mid.1458668856218:ed81099e15d3f4f233"
              ],
              "watermark":1458668856253,
              "seq":37
           }
        }
     ]
  }
 ]
}

Итак, для дифференцирования мы можем ссылаться на entry[0].messaging[0].message, это существует только в отправленном пользователем сообщении. Обратный вызов или обратная связь не содержат эту часть. Проверьте это, прежде чем отвечать. Если он существует, ответьте, иначе нет.

Ответ 2

У всех этих вызовов есть один и тот же контент или они разные? Вы можете записать точную строку сообщения, которую посылает facebook, и посмотреть, что они включают.

Например, есть обратный вызов доставки сообщения, который информирует вас о том, что пользователь получил сообщение. JSON выглядит так:

{'delivery': {'mids': ['mid.146174459xxx:30a42600a95exxxxx'], 'seq': 429, 'watermark': 146174459xxx}, 'recipient': {'id': xxxxxxxx}, 'sender': {'id': xxxxxx}}

Изменить: Также может быть ваш не, подтверждающий входящие вызовы с http-статусом 200. Если facebook получает сообщение об ошибке из вашего веб-хостинга, сообщение будет отправлено несколько раз.

Ответ 3

Моя проблема была похожей, но я получал сообщения с несколькими сообщениями. После нескольких часов разочарования я понял, что Message Delivered callback вызывается каждый раз, когда сообщение доставляется на КАЖДОЕ УСТРОЙСТВО. Итак, если вы вошли в веб-и мобильное приложение, обратный вызов будет вызываться дважды.

Ответ 4

При работе с мессенджером facebook вам нужно учитывать две вещи после отправки сообщения:

A) Доставка сообщений

B) Сообщение прочитано

Поскольку вы работаете с webhooks, это будет срабатывать каждый раз, когда происходит одно из событий (получать сообщение, доставлять отправленное сообщение, пользователь читает сообщение). Поэтому, если вы активируете, например, message_deliveries в своем веб-кадре, и вы отправляете сообщение как действие, вы попадете в цикл.

Правильный способ справиться с этим - в базовом коде. Пример PHP:

        // Skipping delivery messages
        if (!empty($message['delivery'])) {
            #Do something here if you want
            continue;
        }

        // Skipping read messages
        if (!empty($message['read'])) {
            #Do something here if you want
            continue;
        }

Надеюсь, что это поможет!