FB Messenger Bot:Webhook更新未送达

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了FB Messenger Bot:Webhook更新未送达相关的知识,希望对你有一定的参考价值。

我正在使用Facebook Checkbox Plugin一切正常,但Facebook确认选择加入时不向我的webhook网址发送请求。在facebook docs中提到了这一点

在选择加入事件后,如果选中了复选框状态,我们将向您的服务器发布webhook事件。此回调具有与opt-in回调相同的格式,但它具有带有user_ref字段的optin对象,而不是sender字段。

但它没有发送任何数据。这是我的webhook代码

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);

我也尝试手动点击我的webhook,看看它是否响应。它确实工作正常,所以这意味着Facebook不发布数据或者我做错了什么?

任何帮助将受到高度赞赏。谢谢

答案

我不是php开发人员,但在javascript,node.js中实现了相同的逻辑。我想详细分享步骤和javascript代码,希望你能弄明白你可以用它做些什么来改善你的生活:P正如你所说,你正在接受来自api调用的user_ref。那是对的。再次阅读文档,他们已经提到当用户选中复选框插件时将收到user_ref。此user_ref由您设置,并且每次页面加载此user_ref必须是唯一的,然后只有复选框插件将呈现,如果它不是唯一的插件不会呈现。这是它背后的完整逻辑。您生成user_ref,当用户选中该复选框时,您会收到此unqiue user_ref,使用此user_ref向用户发送消息(您可以根据需要使用user_ref向用户发送消息,但我建议您使用senderId) 。当您使用user_ref将消息发送给用户时,webhook api将为您提供包含用户的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格式的响应,其中包含用户的发送者ID:

{"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数据中,recipient.id就是你要找的东西。这里为了让你明白我在聊天机器人中做了什么,首先是用户选择复选框插件,我在服务器上接收呼叫,如果检查它是否包含user_ref,如果是,那么我使用自定义元数据向用户发送文本消息user_ref。当用户收到消息时,webhook以上述给定格式向我发送json数据。为了确定我收到此响应的user_ref,我设置了自定义元数据,它是某些字符串+ user_ref的组合。使用这个我识别我之前使用user_ref发送消息的用户的sender.id。 sender.id是我的pageid和recipient.id您尝试获取和使用的用户ID,我们通常向用户发送消息,也称为psid。

希望这有帮助,如果您仍然使用上述解决方案遇到一些问题,那么请更新它:)

以上是关于FB Messenger Bot:Webhook更新未送达的主要内容,如果未能解决你的问题,请参考以下文章

FB messenger Bot 没有收到回发负载

Facebook Messenger Bot:会话变量

Bot Framework v4 + Messenger 区域设置

如何查询 Facebook 应用的订阅 webhook 事件?

facebook messenger切换协议take_thread_control

Web 仪表板中的 Facebook Messenger 收件箱