FB Messenger Bot:Webhook更新未送达

时间:2017-09-06 08:52:54

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

我正在使用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不发布数据或者我做错了什么?

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

1 个答案:

答案 0 :(得分:2)

我不是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。

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