Php FB Messenger机器人程序:未交付Webhook更新

Php FB Messenger机器人程序:未交付Webhook更新,php,facebook,facebook-graph-api,facebook-messenger-bot,Php,Facebook,Facebook Graph Api,Facebook Messenger Bot,我正在处理一切工作正常,除了facebook在确认加入时没有向我的webhook url发送请求。 书中提到 在opt-in事件之后,如果复选框状态被选中,我们将向您的服务器发布一个webhook事件。此回调与opt-in回调的格式相同,但它具有一个optin对象和一个user_ref字段,而不是sender字段 但它没有发送任何数据。这是我的webhook代码 if (!empty($_REQUEST['hub_mode']) && $_REQUEST['hub_mode']

我正在处理一切工作正常,除了facebook在确认加入时没有向我的webhook url发送请求。 书中提到

在opt-in事件之后,如果复选框状态被选中,我们将向您的服务器发布一个webhook事件。此回调与opt-in回调的格式相同,但它具有一个optin对象和一个user_ref字段,而不是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调用接收用户_ref。没错。再次阅读文档,他们提到当用户选中复选框插件时,将收到用户\u ref。此用户\u ref由您设置,每次页面加载时,此用户\u ref必须唯一,然后只有复选框插件将呈现,如果它不唯一,插件将不会呈现。这是它背后的完整逻辑。您生成用户\u ref,当用户选中复选框时,您将收到此unqiue user\u ref,使用此用户\u ref您将向用户发送消息(您可以使用用户\u ref多次向用户发送消息,但我建议您使用senderId)。当您使用user_ref向用户发送消息时,webhook api将给您一个包含用户senderId的响应,该用户的senderId实际上是我们在应用程序中通常使用的psid。这是您需要保存在数据库中的内容。 现在我将把我的代码放在这里。 接收用户\u 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数据。要确定我收到此响应的用户_ref,我设置了自定义元数据,该元数据是某个字符串+user_ref的组合。使用该元数据,我可以标识我以前使用user_ref发送消息的用户的sender.id。sender.id是我的pageid,recipient.id是您试图获取的用户id,我们通常使用该用户id向用户发送消息,也称为psid


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

您能写下您订阅的页面字段吗?您可以在Application-Messenger-Settings-Webhooks-Edit中找到此信息Events@Norbert我已经检查了以下字段。信息,信息选项,信息发布,你订阅了活动页面吗?@Norbert是的,我订阅了。我100%遵循文档,好的,你作为应用程序管理员来尝试这个吗?谢谢你的详细回答。我理解逻辑,但我的问题是:当用户选中复选框,我确认选择加入并记录“Messenger CheckboxUserConfirmation”事件时。我的服务器上没有收到呼叫。我的服务器应该会收到用户_ref的呼叫。好的,如果您的页面处于开发模式,请确保您的fb id(创建fb应用时使用的fb id)正在尝试复选框插件。如果您仍然没有收到webhook的响应,请确保您已经正确完成了页面末尾文档中提到的实现步骤:@MaavuzSaif您是否正确测试了opt-in?我尝试了很多方法,但我没有解决这个问题的办法。