FB Messenger Bot: обновления Webhook не доставляются

я работаю с Facebook Checkbox Plugin, все работает хорошо, за исключением того, что facebook не отправляет запрос на мой URL-адрес веб-перехватчика при подтверждении подписки. в документах facebook упоминается, что

После события согласия мы опубликуем событие веб-перехватчика на вашем сервере, если состояние флажка было проверено. Этот обратный вызов имеет тот же формат, что и обратный вызов подписки, но вместо поля отправителя он имеет объект optin с полем user_ref.

Но он не отправляет никаких данных. вот мой код вебхука

if (!empty($_REQUEST['hub_mode']) && $_REQUEST['hub_mode'] == 'subscribe' && $_REQUEST['hub_verify_token'] == 'verificationtoken') {
    echo $_REQUEST['hub_challenge'];        
}
$data = file_get_contents("php://input");
$fp = file_put_contents( PROTECH_FBB_DIR.'/data.log', $data);

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

Любая помощь будет высоко оценен. Благодарность


person Maavuz Saif    schedule 06.09.2017    source источник
comment
Можете ли вы написать, на какие поля страницы вы подписаны? Вы найдете эту информацию в Приложение - Мессенджер - Настройки - Вебхуки - Редактировать события   -  person Norbert    schedule 06.09.2017
comment
@Norbert, я проверил следующие поля. сообщения, сообщения_optins, сообщения_постбэков   -  person Maavuz Saif    schedule 06.09.2017
comment
А вы подписали страницу на ваши мероприятия?   -  person Norbert    schedule 06.09.2017
comment
@ Норберт, да, я сделал. я следил за документами на 100%   -  person Maavuz Saif    schedule 06.09.2017
comment
хорошо, а вы попробуете это как администратор приложения?   -  person Norbert    schedule 06.09.2017
comment
Да, я пробовал это как администратор и другие пользователи. даже я попробовал живое приложение, которое было общедоступно. но все равно не работал   -  person Maavuz Saif    schedule 06.09.2017


Ответы (1)


Я не разработчик php, но реализовал ту же логику в javascript, node.js. Я хотел бы подробно рассказать о шагах, а также о коде javascript и надеюсь, что вы сможете понять, что вы можете сделать с ним, чтобы сделать свою жизнь лучше: P Как вы сказали, вы получаете user_ref из вызова API. Это правильно. Прочитайте документацию еще раз, они упомянули, что user_ref будет получен, когда пользователь проверит плагин флажка. Этот user_ref устанавливается вами, и каждый раз, когда страница загружается, этот user_ref должен быть уникальным, тогда будет отображаться только плагин флажка, если он не уникален, плагин не будет отображать. А вот и полная логика. Вы создаете user_ref, когда пользователь устанавливает флажок, вы получаете этот unqiue user_ref, используя этот user_ref, вы отправляете сообщение пользователю (вы можете отправлять сообщение пользователю, используя user_ref, столько раз, сколько хотите, но я предлагаю вам использовать senderId) . Когда вы отправляете сообщение пользователю с помощью user_ref, API-интерфейс webhook даст вам ответ, содержащий senderId пользователя, который на самом деле является psid, который мы обычно используем в нашем приложении. Это то, что вам нужно сохранить в вашей БД. Теперь я помещу свой код здесь, как я это сделал. Получение user_ref и отправка сообщения пользователю: Моя полезная нагрузка:

    function sendTextMessageRef(user_ref, messageText,md) {
  var messageData = {
    recipient: {
      user_ref: user_ref
    },
    message: {
      text: messageText,
      metadata: md
    }
  };

  callSendAPI(messageData);
}
function callSendAPI(messageData) {
  request({
    uri: 'https://graph.facebook.com/v2.6/me/messages',
    qs: { access_token: PAGE_ACCESS_TOKEN },
    method: 'POST',
    json: messageData

  }, function (error, response, body) {
    if (!error && response.statusCode == 200) {
      var recipientId = body.recipient_id;
      var messageId = body.message_id;

      if (messageId) {
        console.log("Successfully sent message with id %s to recipient %s", 
          messageId, recipientId);
      } else {
      console.log("Successfully called Send API for recipient %s", 
        recipientId);
      }
    } else {
      console.error("Failed calling Send API", response.statusCode, response.statusMessage, body.error);
    }
  });  
}

Теперь, после отправки сообщения, я получаю ответ в этом формате json, который будет включать идентификатор отправителя пользователя:

{"sender":{"id":"xxxxxxx"},"recipient":{"id":"xxxxxWhat you are looking for is this*******"},"timestamp":1504698781373,"message":{"is_echo":true,"app_id":xxxxxxxxxxxxxxx,"metadata":"INVITATION__REPLY__qwe__2017-09-05T02xo20__xxxxxxxx__063__yes","mid":"mid.$cAAGcxxxxxxxxVxuAtJ","seq":120162,"text":":)"}}

В приведенных выше данных JSON получатель.id — это то, что вы ищете. Здесь Чтобы вы поняли, что я сделал в своем чат-боте, сначала пользователь выбирает плагин флажка, я получаю вызов на своем сервере, если проверьте, содержит ли он user_ref, если да, то я отправляю текстовое сообщение пользователю с пользовательскими метаданными, используя user_ref. Когда пользователь получает сообщение, веб-хук отправляет мне данные json в указанном выше формате. Чтобы определить, для какого user_ref я получил этот ответ, я устанавливаю пользовательские метаданные, которые представляют собой комбинацию некоторой строки + user_ref. Используя это, я идентифицирую sender.id пользователя, для которого я ранее отправил сообщение, используя user_ref. sender.id — это мой идентификатор страницы, а получатель.id — идентификатор пользователя, который вы пытаетесь получить и с помощью которого мы обычно отправляем сообщение пользователю, также известный как psid.

Надеюсь, это поможет, если у вас все еще возникают проблемы с использованием вышеупомянутого решения, обновите информацию об этом :)

person Gaurav    schedule 06.09.2017
comment
спасибо мужик за подробный ответ. я понимаю логику, но моя проблема заключается в следующем: когда пользователь устанавливает флажок, и я подтверждаю подписку и регистрирую событие MessengerCheckboxUserConfirmation. я не получаю вызов на моем сервере. мой сервер должен получить вызов с user_ref. - person Maavuz Saif; 06.09.2017
comment
Хорошо, если ваша страница находится в режиме разработки, убедитесь, что ваш идентификатор fb, с помощью которого вы создали приложение fb, пробует плагин флажка. Если вы по-прежнему не получаете ответа от веб-перехватчика, убедитесь, что вы правильно выполнили шаги по реализации, упомянутые в документации в конце страницы: developers.facebook.com/docs/messenger-platform/ - person Gaurav; 06.09.2017
comment
@MaavuzSaif вы правильно проверили подписку? Я пробую много способов, но у меня нет решения для этого. - person wilfredonoyola; 16.08.2018