在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
这仅存在于用户发送的消息中。回调或回发不包含这部分。 在回应之前检查这一点。如果存在,则回应,否则不。
所有这些调用都具有相同的内容还是不同?您可以记录Facebook发送给您的确切消息字符串,并查看它们包含的内容。
例如,有一个消息传递回调,通知您用户收到该消息。该JSON看起来是这样的:
{'delivery': {'mids': ['mid.146174459xxx:30a42600a95exxxxx'], 'seq': 429, 'watermark': 146174459xxx}, 'recipient': {'id': xxxxxxxx}, 'sender': {'id': xxxxxx}}
编辑:它也可能是您的不确认来电HTTP状态200.如果Facebook从您的网络挂接接收到错误的情况下,消息会多次发送。
我试着用res.status(200)来确认循环消息,但它一直进来。有没有一种方法来测试消息是否被确认为收到? – hoodsy
当你需要在考虑两件事情的Facebook的信使工作,你发送的消息后:由于您使用网络挂接这将工作
在每次发生事件时触发(接收消息,传递您发送的消息,用户阅读消息)。因此,如果您在您的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。所以,如果你登录到网络和移动应用程序,回调将被调用两次。
这就是为什么我得到3个相同的交付确认哈哈。非常感谢 ! – sonlexqt
所以你是如何避免这种情况的......我是如何区分这两者的......你可以分享你的请求的示例代码。谢谢 – ARK