2016-04-26 97 views
11

我已經成功安裝了facebook-messenger webhook。直到昨天,我還能夠發送和接收消息。但是今天,當我從用戶發送一條消息時,我在服務器webhook POST API處得到多個調用。他們似乎從未停止過。在facebook-messenger webhook上重複調用

回答

7

想通了。我發送了來自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這僅存在於用戶發送的消息中。回調或回發不包含這部分。 在迴應之前檢查這一點。如果存在,則迴應,否則不。

+2

所以你是如何避免這種情況的......我是如何區分這兩者的......你可以分享你的請求的示例代碼。謝謝 – ARK

11

所有這些調用都具有相同的內容還是不同?您可以記錄Facebook發送給您的確切消息字符串,並查看它們包含的內容。

例如,有一個消息傳遞迴調,通知您用戶收到該消息。該JSON看起來是這樣的:

{'delivery': {'mids': ['mid.146174459xxx:30a42600a95exxxxx'], 'seq': 429, 'watermark': 146174459xxx}, 'recipient': {'id': xxxxxxxx}, 'sender': {'id': xxxxxx}} 

編輯:它也可能是您的確認來電HTTP狀態200.如果Facebook從您的網絡掛接接收到錯誤的情況下,消息會多次發送。

+0

我試着用res.status(200)來確認循環消息,但它一直進來。有沒有一種方法來測試消息是否被確認爲收到? – hoodsy

0

當你需要在考慮兩件事情的Facebook的信使工作,你發送的消息後:由於您使用網絡掛接這將工作

A)Message Delivery

B)Message Read

在每次發生事件時觸發(接收消息,傳遞您發送的消息,用戶閱讀消息)。因此,如果您在您的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; 
     } 

希望它有幫助!

4

我的問題是類似的,但我得到多個消息傳遞職位。經過幾個小時的沮喪之後,我意識到每次將消息傳遞到每個設備時都會調用Message Delivered callback。所以,如果你登錄到網絡和移動應用程序,回調將被調用兩次。

+0

這就是爲什麼我得到3個相同的交付確認哈哈。非常感謝 ! – sonlexqt