2017-09-06 108 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