2

我们想在请求表单的末尾添加 facebook messenger 复选框插件,以便用户可以通过 messenger 选择接收通知。

当用户选择加入时,我们的 webhook 会收到一个带有我们在表单中设置的 user_ref 的回调。

我们向此 user_ref 发送选择加入确认

但是我们收到的其他消息,例如来自用户的交付、已读回执或实际消息,确实不再包含用户引用,而是包含用户 ID。

这是facebook的官方文档:

收到回调事件后,您可以调用 Send API 以使用接收者中的 user_ref 标识符开始向用户发送消息,如下所示。请注意,此字段与渲染插件和确认选择加入之前使用的唯一 user_ref 参数相同。

如果对 Send API 的调用成功,则响应将包含一个 recipient_id 参数,这是一个稳定的用户 ID,您现在可以在未来的 API 调用中使用它。

因此,不可能在初始消息和新消息之间进行跟踪。有没有人找到解决方案?

非常感谢您提前。

4

2 回答 2

0

例如,您可以在用户选择使用可选ref参数时发送附加信息。您可以发送登录我网站的用户的用户名:

function confirmOptIn() {
      FB.AppEvents.logEvent('MessengerCheckboxUserConfirmation', null, {
        'app_id':'APP_ID',
        'page_id':'PAGE_ID',
        'ref': 'myuser@mywebsite.com',
        'user_ref':'UNIQUE_REF_PARAM'
      });

optin您将在 webhook 事件中收到用户名:

{
  "recipient":{
    "id":"PAGE_ID"
  },
  "timestamp":1234567890,
  "optin":{
    "ref":"myuser@mywebsite.com",
    "user_ref":"UNIQUE_REF_PARAM"
  }
}   

然后,您可以调用 Send API 以使用user_ref.

如果对 Send API 的调用成功,则响应将包含一个 recipient_id 参数,这是一个稳定的用户 ID,您现在可以在未来的 API 调用中使用它。

...因此您将收到 Messenger ID,您可以将其映射到您已有的网站用户名。在这里,我对官方开发者网站上的示例进行了一些修改,以调用发送 API,user_ref并将我在响应中获得的用户 ID 映射到我网站的用户名:

function callSendAPICheckbox(messageData, userApplicationId) {
((userApplicationId) => {
    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("Map messenger user ID %s with the username of my website %s", recipientId, userApplicationId);
                } else {
                    console.log("Successfully called Send API for recipient %s",
                        recipientId);
                }
            } else {
                console.error("Failed calling Send API for userId " +
                    recipientId, response.statusCode, response.statusMessage, body.error);
            }
        });

})(userApplicationId)
}
于 2017-07-06T14:03:28.093 回答
0

你为什么不使用元数据字段sendTextMessage。您发送给用户的每条消息,您也发送元数据,当您收到正在传递的消息的响应时,您会在其中找到元数据字段。

这是我所做的:

当用户选择复选框插件并触发事件时,我在服务器上收到呼叫,检查它是否包含user_ref. 如果是这样,那么我使用自定义元数据向用户发送一条短信user_ref。当用户收到消息时,webhook向我发送json文档中提到的数据。为了确定user_ref我收到了哪些响应,我设置了自定义元数据,它是一些组合,string + user_ref然后使用user_ref. 使用此自定义元数据,我可以识别sender.id我之前使用user_ref. 这sender.id是我的pageidrecipient.id您尝试获取和使用的用户 ID,我们通常将消息发送给用户,也称为psid.

上面如果只是提到我通常做的逻辑部分。对于详细的解决方案和代码,我已经在这里发布了:

于 2017-09-06T12:25:35.460 回答