在 facebook-messenger webhook 上重复调用
Getting repeated calls on facebook-messenger webhook
我已经成功设置了 facebook-messenger webhook。直到昨天,我还能够发送和接收消息。但是今天,当我从用户发送一条消息时,我在服务器 webhook POST API 收到多个调用。他们似乎永远不会停止。
所有这些电话的内容是相同的还是不同的?您可以记录 Facebook 发送给您的确切消息字符串并查看它们包含的内容。
例如,有一个消息传递回调通知您用户已收到消息。 JSON 看起来像这样:
{'delivery': {'mids': ['mid.146174459xxx:30a42600a95exxxxx'], 'seq': 429, 'watermark': 146174459xxx}, 'recipient': {'id': xxxxxxxx}, 'sender': {'id': xxxxxx}}
编辑:也可能是您未确认带有 http 状态 200 的来电。如果 facebook 收到来自您的 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 Messenger 时,发送消息后需要考虑两件事:
B) Message Read
由于您使用的是 webhook,因此每次发生其中一个事件时都会触发此事件(接收消息、传递您发送的消息、用户阅读消息)。因此,如果您在 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。因此,如果您同时登录 Web 和移动应用程序,回调将被调用两次。
我已经成功设置了 facebook-messenger webhook。直到昨天,我还能够发送和接收消息。但是今天,当我从用户发送一条消息时,我在服务器 webhook POST API 收到多个调用。他们似乎永远不会停止。
所有这些电话的内容是相同的还是不同的?您可以记录 Facebook 发送给您的确切消息字符串并查看它们包含的内容。
例如,有一个消息传递回调通知您用户已收到消息。 JSON 看起来像这样:
{'delivery': {'mids': ['mid.146174459xxx:30a42600a95exxxxx'], 'seq': 429, 'watermark': 146174459xxx}, 'recipient': {'id': xxxxxxxx}, 'sender': {'id': xxxxxx}}
编辑:也可能是您未确认带有 http 状态 200 的来电。如果 facebook 收到来自您的 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 Messenger 时,发送消息后需要考虑两件事:
B) Message Read
由于您使用的是 webhook,因此每次发生其中一个事件时都会触发此事件(接收消息、传递您发送的消息、用户阅读消息)。因此,如果您在 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。因此,如果您同时登录 Web 和移动应用程序,回调将被调用两次。