FB Messenger Bot:Webhook更新未送达
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了FB Messenger Bot:Webhook更新未送达相关的知识,希望对你有一定的参考价值。
我正在使用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不发布数据或者我做错了什么?
任何帮助将受到高度赞赏。谢谢
我不是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。
希望这有帮助,如果您仍然使用上述解决方案遇到一些问题,那么请更新它:)
以上是关于FB Messenger Bot:Webhook更新未送达的主要内容,如果未能解决你的问题,请参考以下文章
Bot Framework v4 + Messenger 区域设置
如何查询 Facebook 应用的订阅 webhook 事件?