【问题标题】:FB Messenger Bot: Webhook updates not being deliveredFB Messenger Bot:未交付 Webhook 更新
【发布时间】:2018-01-26 15:56:16
【问题描述】:

我正在与Facebook Checkbox Plugin 合作,一切正常,除了 facebook 在确认选择加入时没有向我的 webhook url 发送请求。 在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 没有发布数据,或者我做错了什么?

任何帮助将不胜感激。谢谢

【问题讨论】:

  • 你能写出你订阅了哪些页面字段吗?您可以在应用程序 - Messenger - 设置 - Webhooks - 编辑事件中找到此信息
  • @Norbert 我检查了以下字段。消息,messaging_optins,messaging_postbacks
  • 你为你的活动订阅了一个页面?
  • @Norbert 是的,我做到了。我遵循了文档 100%
  • 好的,你作为应用管理员试试这个?

标签: php facebook facebook-graph-api facebook-messenger-bot


【解决方案1】:

我不是 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,如果是,那么我使用自定义元数据向用户发送一条短信用户参考。当用户收到消息时,webhook 会以上述给定格式向我发送 json 数据。为了确定我收到了哪个 user_ref,我设置了自定义元数据,它是一些 string+user_ref 的组合。使用它,我可以识别我之前使用 user_ref 为其发送消息的用户的 sender.id。 sender.id 是我的 pageid,receiver.id 是您尝试获取和使用的用户 id,我们通常将消息发送给用户,也称为 psid。

希望这会有所帮助,如果您在使用上述解决方案时仍然遇到问题,请进行更新:)

【讨论】:

  • 感谢男士的详细回答。我理解逻辑,但我的问题是:当用户选中复选框并且我确认选择加入并记录“MessengerCheckboxUserConfirmation”事件时。我没有在我的服务器上接到电话。我的服务器应该收到一个带有 user_ref 的呼叫。
  • 好的,如果您的页面处于开发模式,请确保您使用创建 fb 应用程序的 fb id 正在尝试复选框插件。如果您仍然没有收到来自 webhook 的响应,请确保您已完成页面末尾文档中正确提到的实施步骤:developers.facebook.com/docs/messenger-platform/…
  • @MaavuzSaif 您是否正确测试了选择加入?我正在尝试很多方法,但我没有解决方案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-08-09
  • 2018-09-03
  • 2017-07-01
  • 2016-11-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多