在facebook-messenger webhook上重复调用

问题描述:

我已经成功安装了facebook-messenger webhook。直到昨天,我还能够发送和接收消息。但是今天,当我从用户发送一条消息时,我在服务器webhook POST API处得到多个调用。他们似乎从未停止过。在facebook-messenger webhook上重复调用

想通了。我发送了来自Facebook的每个通信的回复。所以我最终也回应了ACK消息。反过来又有一个ACK来了。这就是为什么导致无限循环。

this页面,我们可以找到不同的对象结构,对收到的消息:

文本

{ 
"object":"page", 
"entry":[ 
{ 
    "id":PAGE_ID, 
    "time":1457764198246, 
    "messaging":[ 
    { 
     "sender":{ 
     "id":USER_ID 
     }, 
     "recipient":{ 
     "id":PAGE_ID 
     }, 
     "timestamp":1457764197627, 
     "message":{ 
     "mid":"mid.1457764197618:41d102a3e1ae206a38", 
     "seq":73, 
     "text":"hello, world!" 
     } 
    } 
    ] 
} 
] 
} 

消息交付回调

{ 
"object":"page", 
"entry":[ 
    { 
    "id":PAGE_ID, 
    "time":1458668856451, 
    "messaging":[ 
     { 
      "sender":{ 
       "id":USER_ID 
      }, 
      "recipient":{ 
       "id":PAGE_ID 
      }, 
      "delivery":{ 
       "mids":[ 
       "mid.1458668856218:ed81099e15d3f4f233" 
       ], 
       "watermark":1458668856253, 
       "seq":37 
      } 
     } 
    ] 
    } 
] 
} 

因此,对于区分,我们可以参考entry[0].messaging[0].message这仅存在于用户发送的消息中。回调或回发不包含这部分。 在回应之前检查这一点。如果存在,则回应,否则不。

+2

所以你是如何避免这种情况的......我是如何区分这两者的......你可以分享你的请求的示例代码。谢谢 – ARK

所有这些调用都具有相同的内容还是不同?您可以记录Facebook发送给您的确切消息字符串,并查看它们包含的内容。

例如,有一个消息传递回调,通知您用户收到该消息。该JSON看起来是这样的:

{'delivery': {'mids': ['mid.146174459xxx:30a42600a95exxxxx'], 'seq': 429, 'watermark': 146174459xxx}, 'recipient': {'id': xxxxxxxx}, 'sender': {'id': xxxxxx}} 

编辑:它也可能是您的确认来电HTTP状态200.如果Facebook从您的网络挂接接收到错误的情况下,消息会多次发送。

+0

我试着用res.status(200)来确认循环消息,但它一直进来。有没有一种方法来测试消息是否被确认为收到? – hoodsy

当你需要在考虑两件事情的Facebook的信使工作,你发送的消息后:由于您使用网络挂接这将工作

A)Message Delivery

B)Message Read

在每次发生事件时触发(接收消息,传递您发送的消息,用户阅读消息)。因此,如果您在您的webhook中激活了例如message_deliveries,并且您发送了一条消息作为操作,则最终会以循环方式结束。

正确的方法来处理这是在基本代码。 PHP示例:

 // Skipping delivery messages 
     if (!empty($message['delivery'])) { 
      #Do something here if you want 
      continue; 
     } 

     // Skipping read messages 
     if (!empty($message['read'])) { 
      #Do something here if you want 
      continue; 
     } 

希望它有帮助!

我的问题是类似的,但我得到多个消息传递职位。经过几个小时的沮丧之后,我意识到每次将消息传递到每个设备时都会调用Message Delivered callback。所以,如果你登录到网络和移动应用程序,回调将被调用两次。

+0

这就是为什么我得到3个相同的交付确认哈哈。非常感谢 ! – sonlexqt