2017-09-06 35 views
-1

我正在与Facebook Checkbox Plugin一起工作一切正常,除非facebook在确认选择加入时未向我的webhook网址发送请求。 在facebook docs中提到,FB Messenger僵尸工具:Webhook更新没有发送

的选择,在活动结束后,我们将发布一个网络挂接事件,您的服务器,如果该复选框状态进行了调查。此回调具有与选择回拨相同的格式,但不是发件人字段,而是具有带user_ref字段的optin对象。

但它没有发送任何数据。这里是我的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不会发布数据或者我做错了什么?

任何帮助将不胜感激。谢谢

+0

你会写你订阅了哪些页面领域?您可以在应用程序中找到此信息 - Messenger - 设置 - Webhooks - 编辑事件 – Norbert

+0

@Norbert我检查了以下字段。消息,messaging_optins,messaging_postbacks –

+0

你订阅了一个页面到你的事件? – Norbert

回答

1

我不是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您尝试获取和使用的用户标识,我们通常将消息发送给用户,并且也称为psid。

希望这会有所帮助,如果你还在使用,上述方案中得到一些问题,然后做更新吧:)

+0

谢谢你的详细答案。我了解逻辑,但我的问题是:当用户选中复选框,并确认选择并记录“MessengerCheckboxUserConfirmation”事件。我没有收到我的服务器上的电话。我的服务器应该用user_ref接收呼叫。 –

+0

好的,如果你的页面处于开发模式下,请确保你的fb id使用你创建的fb应用正在尝试复选框插件。如果您仍然没有收到webhook的回复,请确保您已完成页面末尾文档中正确提到的实施步骤:https://developers.facebook.com/docs/messenger-platform/plugin-reference/复选框,插件#实现 – Gaurav