Messenger 平台專用 Meta Webhooks |
Meta Webhooks 讓您可以收到 Meta 社交關係圖內特定物件相關變更的即時 HTTP 通知。例如,當用戶向您的 Facebook 專頁或 Instagram 專業帳戶傳送訊息時,我們會傳送通知給您。Webhooks 通知讓您可以追蹤傳入訊息和訊息狀態更新。如果您之前是透過查詢 Messenger 平台端點來追蹤此類變更,使用 Webhooks 通知也可讓您避免限速限制問題。
如要成功執行適用於 Messenger 或 Instagram 對話的 Webhooks,您需要採取以下操作:
在正式開始前,我們假設您已經完成以下事項:
您的伺服器必須能夠處理兩類 HTTPS 要求:驗證要求和事件通知。由於這兩類要求都使用 HTTPs,因此您的伺服器必須已正確配置並安裝有效的 TLS 或 SSL 憑證。系統不支援自行簽署的憑證。
以下各部分將說明每類要求中的內容,以及回應這些要求的方式。
此處所示的程式碼範例擷取自我們在 GitHub 上的應用程式範例 。請瀏覽 GitHub 以查看完整範例,並進一步了解如何設定 Webhooks 伺服器。
如要建立端點以從 Messenger 平台接收 Webhooks 通知,app.js
檔案可能需要如下所示:
// Create the endpoint for your webhook app.post("/webhook", (req, res) => { let body = req.body; console.log(`\u{1F7EA} Received webhook:`); console.dir(body, { depth: null }); ...
這段程式碼會建立可接受 POST
要求的 /webhook
端點,以確認有關要求是否為 Webhooks 通知。
200 OK
回應端點必須傳回 200 OK
回應,來告知 Messenger 平台已經收到事件,無需重新傳送。一般而言,您應等到通知處理完成後才傳送這個回應。
您的端點應該在回應所有通知時滿足下列條件:
200 OK HTTPS
回應以下程式碼會位於 app.js
檔案內的 app.post
中,可能如下所示:
... // Send a 200 OK response if this is a page webhook if (body.object === "page") { // Returns a '200 OK' response to all requests res.status(200).send("EVENT_RECEIVED"); ... // Determine which webhooks were triggered and get sender PSIDs and locale, message content and more. ... } else { // Return a '404 Not Found' if event is not from a page subscription res.sendStatus(404); } });
每當您在應用程式管理中心配置 Webhooks 產品時,我們都會將一項 GET
要求傳送至您的端點網址。驗證要求包含下列查詢字串參數,這些參數會附加至端點網址的尾段,類似下方所示:
GET https://www.your-clever-domain-name.com/webhooks? hub.mode=subscribe& hub.verify_token=mytoken& hub.challenge=1158201444
每當您的端點收到驗證要求時,其都必須如下操作:
hub.verify_token
值與您在應用程式管理中心配置 Webhooks 產品時,在驗證憑證欄位所設定的字串相符(您尚未設定此憑證)。hub.challenge
值回應。app.js
檔案可能會如下所示:
// Add support for GET requests to our webhook app.get("/messaging-webhook", (req, res) => { // Parse the query params let mode = req.query["hub.mode"]; let token = req.query["hub.verify_token"]; let challenge = req.query["hub.challenge"]; // Check if a token and mode is in the query string of the request if (mode && token) { // Check the mode and token sent is correct if (mode === "subscribe" && token === config.verifyToken) { // Respond with the challenge token from the request console.log("WEBHOOK_VERIFIED"); res.status(200).send(challenge); } else { // Respond with '403 Forbidden' if verify tokens do not match res.sendStatus(403); } } });
參數 | 回應範例 | 說明 |
---|---|---|
|
| 此值一律設為 |
|
| 您必須傳回給我們的 |
|
| 我們從您應用程式的應用程式管理中心驗證憑證欄位所獲取的字串。當您完成 Webhooks 配置設定步驟時,便會設定此字串。 |
如果您正在應用程式管理中心配置 Webhooks 產品並因此觸發驗證要求,管理中心會表明您的端點是否已正確地驗證要求。如果您使用 Graph API 的 /app/subscriptions
端點來配置 Webhooks 產品,此 API 會透過回應表明設定成功還是失敗。
當您配置 Webhooks 產品時,您將會訂閱某個 object
類型的特定 fields
(例如 page
物件的 messages
欄位)。每當其中某個欄位出現變更時,我們都會向您的端點傳送 POST
要求,其中包含描述相關變更的 JSON 裝載。
舉例來說,如果您已訂閱 page
物件的 message_reactions
欄位,而且顧客對您應用程式傳送的訊息表達了心情,我們會傳送如下所示的 POST
要求給您:
{
"object":"page",
"entry":[
{
"id":"<PAGE_ID>",
"time":1458692752478,
"messaging":[
{
"sender":{
"id":"<PSID>"
},
"recipient":{
"id":"<PAGE_ID>"
},
...
}
]
}
]
}
裝載會包含描述相關變更的物件。配置 Webhooks 產品時,您可以指明裝載應該只包含已更改欄位的名稱,還是亦應包含新值。
我們會將所有裝載的格式設定為 JSON,這樣您便可以使用常見的 JSON 剖析方法或套件來剖析裝載。
我們不會儲存傳送給您的任何 Webhook 事件通知數據,因此請務必擷取並儲存您想保留的任何裝載內容。
我們會使用 SHA256 簽章簽署所有事件通知裝載,而且在相關要求的「X-Hub-Signature-256」標題中包含簽章並在前面加上「sha256=」。雖然您無需驗證裝載,但我們強烈建議您完成驗證。
如要驗證裝載,請按照下列步驟操作:
X-Hub-Signature-256
標題中的簽章(sha256=
之後的所有內容)。如果簽章一致,則表示裝載真實有效。請注意,我們會使用裝載的逸出 Unicode 版本產生簽章,並以小寫 16 進位表示。如果您只需針對已解碼位元組進行計算,則您最終會產生一個不同的簽章。例如,字串 äöå
應該逸出為 \u00e4\u00f6\u00e5
。
app.js
檔案可能會如下所示:
// Import dependencies and set up http server const express = require("express"), bodyParser = require("body-parser"), { urlencoded, json } = require("body-parser"), app = express().use(bodyParser.json()); ... // Verify that the callback came from Facebook. function verifyRequestSignature(req, res, buf) { var signature = req.headers["x-hub-signature-256"]; if (!signature) { console.warn(`Couldn't find "x-hub-signature-256" in headers.`); } else { var elements = signature.split("="); var signatureHash = elements[1]; var expectedHash = crypto .createHmac("sha256", config.appSecret) .update(buf) .digest("hex"); if (signatureHash != expectedHash) { throw new Error("Couldn't validate the request signature."); } } }
若通知未能傳送至您的伺服器,我們會立即再嘗試傳送幾次。您的伺服器應在這些情況下處理重複數據。若在 15 分鐘後,我們仍無法向您傳送通知,系統會向您的開發人員帳戶傳送一則提醒訊息。
如果通知傳送功能持續失效達 1 小時,您就會收到「Webhooks 被停用」提醒,然後您的應用程式就會取消訂閱專頁或 Instagram 專業帳戶的 Webhooks。解決相關問題後,您需要再次訂閱 Webhooks。
如要測試您的 Webhooks 驗證,請使用驗證憑證執行以下 cURL 要求:
curl -X GET "localhost:1337/webhook?hub.verify_token=YOUR-VERIFY-TOKEN&hub.challenge=CHALLENGE_ACCEPTED&hub.mode=subscribe"
如果您的 Webhooks 驗證運作正常,您將會看到:
WEBHOOK_VERIFIED
記錄到節點進程運行所在的指令行中。CHALLENGE_ACCEPTED
記錄到傳送 cURL 要求的指令行中。如要測試您的 Webhook,請傳送下列 cURL 要求:
curl -H "Content-Type: application/json" -X POST "localhost:1337/webhook" -d '{"object": "page", "entry": [{"messaging": [{"message": "TEST_MESSAGE"}]}]}'
如果您的 Webhooks 運作正常,您將會看到:
TEST_MESSAGE
記錄到節點進程運行所在的指令行中。EVENT RECEIVED
記錄到傳送 cURL 要求的指令行中。在您的 Webhooks 伺服器端點或應用程式範例準備就緒後,請前往您應用程式的應用程式管理中心 訂閱 Meta Webhooks。
在此範例中,我們將使用管理中心配置 Webhook 並訂閱 messages
欄位。每當顧客向您的應用程式傳送訊息,系統都會傳送通知到您的 Webhooks 端點。
在回呼網址欄位中輸入端點網址,並在驗證憑證欄位中新增驗證憑證。我們會在所有驗證要求中加入此字串。如果您正在使用我們其中一個範例應用程式,則此字串應該就是您用於自家應用程式 TOKEN
配置變數的同一組字串。
最後一個步驟是訂閱個別欄位。訂閱 photos
欄位,並傳送測試事件通知。
如果您的端點設定正確,它應該會驗證裝載,並會在驗證成功後,執行您為其設定的任何程式碼。如果您正在使用我們的範例應用程式,請在網頁瀏覽器中載入應用程式網址。畫面應該會顯示裝載內容。
您可以隨時使用應用程式管理中心更改您的 Webhooks 訂閱、驗證憑證或 API 版本。
備註:建議您使用最新版本的 API 來接收每個 Webhook 的所有可用資訊。
您亦可使用 /app/subscriptions
端點 ,以程式設計的方式完成操作。
Webhook 事件 | 描述 |
---|---|
| 訂閱訊息已接收事件 |
| 訂閱帳戶連結事件 |
| 訂閱結帳更新事件 |
| 訂閱訊息已送達事件 |
| 訂閱訊息回應事件 |
| 訂閱即時遊戲事件 |
| |
| 訂閱附加程式啟用事件 |
| 訂閱付款事件 |
| 訂閱政策執行事件 |
| 訂閱回傳已接收事件 |
| 訂閱付款預先結帳事件 |
| 訂閱訊息已讀取事件 |
| 訂閱轉介事件 |
|
您需要將 Webhooks 應用程式連結至自家專頁,並為專頁訂閱您想接收的 Webhooks 通知。
您可透過以下路徑將應用程式連結至專頁:Meta Business Suite > 所有工具 > 商業應用程式
備註:您需要為企業的所有訊息應用程式訂閱訊息 Webhooks。
您需要為自家專頁訂閱您想接收的 Webhooks 通知。
MODERATE
任務的用戶所要求
如要訂閱 Webhooks 欄位,請使用專頁的存取憑證向專頁的 subscribed_apps 關係連線傳送一則 POST
要求。
curl -i -X POST "https://graph.facebook.com/PAGE-ID/subscribed_apps ?subscribed_fields=messages &access_token=PAGE-ACCESS-TOKEN"
{ "success": "true" }
如要查看您的專頁安裝了哪款應用程式,請改為傳送 GET
要求:
curl -i -X GET "https://graph.facebook.com/PAGE-ID/subscribed_apps &access_token=PAGE-ACCESS-TOKEN"
{ "data": [ { "category": "Business", "link": "https://my-clever-domain-name.com/app", "name": "My Sample App", "id": "APP-ID" "subscribed_fields": [ "messages" ] } ] }
如果您的專頁未安裝任何應用程式,API 將傳回空白資料組合。
您也可以使用 Graph API 測試工具 來傳送要求,為您的專頁訂閱 Webhooks 欄位。
pages_manage_metadata
權限。這會將您的應用程式憑證換取為獲授予 pages_manage_metadata
權限的用戶存取憑證。GET
下拉式選單,然後選擇 POST
,即可更改操作方式。me?fields=id,name
查詢替換為專頁的編號(接著是 /subscribed_apps
),然後提交查詢。 如要接收來自擁有應用程式角色之用戶(如應用程式管理員、開發人員和測試人員)的通知,您的應用程式僅需要一般存取權限。如要接收來自顧客(即沒有應用程式角色的用戶)的通知,您的應用程式需要進階存取權限。
進一步了解一般存取權限和進階存取權限、使用每種權限可以存取的資料以及執行要求。