Meta-Webhooks für die Messenger-Plattform |
Mit Meta-Webhooks erhältst du HTTP-Benachrichtigungen in Echtzeit, die dich über Änderungen an bestimmten Objekten im Meta Social Graph informieren. Wir können dir beispielsweise eine Benachrichtigung senden, wenn eine Person deiner Facebook-Seite oder deinem professionellen Instagram-Konto eine Nachricht sendet. Anhand von Webhooks-Benachrichtigungen kannst du eingehende Nachrichten und Status-Updates zu Nachrichten nachverfolgen. Mit Webhooks-Benachrichtigungen kannst du außerdem Durchsatzratenbegrenzungen vermeiden, die auftreten können, wenn du die Endpunkte der Messenger-Plattform abfragst, um diese Änderungen nachzuverfolgen.
Führe folgende Schritte aus, um Webhooks für Messenger- oder Instagram-Unterhaltungen erfolgreich zu implementieren:
Bevor du beginnst, solltest du folgende Schritte erledigt haben:
Dein Server muss zwei Arten von HTTPS-Anfragen verarbeiten können: Verifizierungsanfragen und Event-Benachrichtigungen. Da beide Anfragen HTTPS verwenden, muss dein Server über ein korrekt konfiguriertes und installiertes TLS- oder SSL-Zertifikat verfügen. Selbstsignierte Zertifikate werden nicht unterstützt.
In den Abschnitten unten wird erläutert, was die einzelnen Anfragetypen enthalten und wie darauf zu reagieren ist.
Die hier angezeigten Codebeispiele stammen aus unserer Beispiel-App auf GitHub. Rufe GitHub auf, um das vollständige Beispiel zu sehen und mehr über die Einrichtung deines Webhooks-Servers zu erfahren.
Die zum Erstellen eines Endpunkts für den Empfang von Webhooks-Benachrichtigungen von der Messenger-Plattform verwendete app.js-Datei kann etwa so aussehen:
// 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 });
...
Dieser Code erstellt einen /webhook-Endpunkt, der POST-Anfragen akzeptiert und überprüft, ob es sich bei der Anfrage um eine Webhooks-Benachrichtigung handelt.
200 OK-Antwort zurückgebenDer Endpunkt muss eine 200 OK-Antwort zurückgeben, die der Messenger-Plattform mitteilt, dass das Event empfangen wurde und nicht erneut gesendet werden muss. In der Regel wird diese Antwort nicht gesendet, bis du die Benachrichtigung erfolgreich verarbeitet hast.
Dein Endpunkt sollte folgendermaßen auf alle Benachrichtigungen antworten:
200 OK HTTPS-AntwortDer folgende Code wird sich im app.post in deiner app.js-Datei befinden und kann etwa so aussehen:
...
// 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);
}
}); Jedes Mal, wenn du das Webhooks-Produkt im App-Dashboard konfigurierst, senden wir eine GET-Anfrage an deine Endpunkt-URL. Verifizierungsanfragen enthalten die folgenden Abfrage-String-Parameter, die an das Ende deiner Endpunkt-URL angehängt werden. Sie sehen in etwa wie folgt aus:
GET https://www.your-clever-domain-name.com/webhooks? hub.mode=subscribe& hub.verify_token=mytoken& hub.challenge=1158201444
Jedes Mal, wenn dein Endpunkt eine Verifizierungsanfrage erhält, muss er folgende Schritte ausführen:
hub.verify_token-Wert mit dem String übereinstimmt, den du bei der Konfiguration des Webhooks-Produkts in deinem App-Dashboard im Feld Verifizierungstoken festgelegt hast (du hast diesen Token-String noch nicht festgelegt).hub.challenge-Wert.Deine app.js-Datei könnte wie folgt aussehen:
// 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);
}
}
});| Parameter | Beispielwert | Beschreibung |
|---|---|---|
|
| Dieser Wert muss immer auf |
|
| Ein |
|
| Ein String, den wir aus dem Feld Verifizierungstoken im App-Dashboard deiner App beziehen. Diesen String legst du fest, wenn du die Schritte unter den Webhooks-Konfigurationseinstellungen durchführst. |
Hinweis:PHP konvertiert Punkte (.) in Parameternamen in Unterstriche (_).
Wenn du dein App-Dashboard aufgerufen hast und dein Webhooks-Produkt konfigurierst (und somit eine Verifizierungsanfrage auslöst), wird im Dashboard angezeigt, ob dein Endpunkt die Anfrage richtig validiert hat. Wenn du zur Konfiguration des Webhooks-Produkts den /app/subscriptions-Endpunkt der Graph API verwendest, sendet die API eine Antwort mit einer Erfolgs- oder Fehlerangabe.
Wenn du dein Webhooks-Produkt konfigurierst, abonnierst du bestimmte fields für einen object-Typ (z. B. das messages-Feld für das page-Objekt). Wird eines dieser Felder geändert, senden wir eine POST-Anfrage mit einer JSON-Payload an deinen Endpunkt, die die Änderung beschreibt.
Hast du beispielsweise das message_reactions-Feld des page-Objekts abonniert und eine*r deine*r App-Nutzer*innen reagiert auf eine von deiner App gesendeten Nachricht, senden wir dir eine POST-Anfrage ähnlich der Folgenden:
{
"object":"page",
"entry":[
{
"id":"<PAGE_ID>",
"time":1458692752478,
"messaging":[
{
"sender":{
"id":"<PSID>"
},
"recipient":{
"id":"<PAGE_ID>"
},
...
}
]
}
]
}Payloads enthalten ein Objekt mit einer Beschreibung der Änderung. Wenn du das Webhooks-Produkt konfigurierst, kannst du angeben, ob Payloads nur die Namen der geänderten Felder oder auch die neuen Werte enthalten sollen.
Wir formatieren alle Payloads mit JSON, damit du die Payload mit den gängigen JSON-Parsing-Methoden oder Paketen parsen kannst.
Hinweis: Wir können keine historischen Webhook-Event-Benachrichtigungsdaten abfragen. Stelle also sicher, dass du den gesamten Webhook-Payload-Inhalt, den du beibehalten möchtest, erfasst und speicherst.
Wir signieren alle Event-Benachrichtigungs-Payloads mit einer SHA256-Signatur und beziehen die Signatur in den Header „X-Hub-Signature-256“ der Anfrage ein, dem „sha256=" vorangestellt wird. Du musst die Payload nicht validieren, jedoch solltest du dies tun und es wird dringend empfohlen.
So validierst du die Payload:
X-Hub-Signature-256-Header (alles nach sha256=). Stimmen die Signaturen überein, ist die Payload echt.Beachte, dass die Signatur anhand einer maskierten Unicode-Version der Payload erstellt wird, mit kleingeschriebenen Hexadezimalziffern. Wenn du die Berechnung einfach anhand der dekodierten Bytes vornimmst, erhältst du eine andere Signatur. Der String äöå sollte beispielsweise als \u00e4\u00f6\u00e5 maskiert werden.
Die app.js-Datei könnte wie folgt aussehen:
// 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.");
}
}
}Wenn das Senden einer Benachrichtigung an deinen Server fehlschlägt, erfolgen sofort neue Versuche. Dein Server sollte die Deduplizierung in diesen Fällen verarbeiten können. Wenn es nach 15 Minuten weiterhin nicht möglich ist, Benachrichtigungen zuzustellen, wird eine Warnung an dein Entwicklerkonto gesendet.
Wenn die Zustellung einer Benachrichtigung weiterhin eine Stunde lang fehlschlägt, erhältst du den Warnhinweis Webhooks deaktiviert und das Abonnement deiner App für den Webhook der Seite oder des professionellen Instagram-Kontos wird eingestellt. Sobald du die Probleme behoben hast, musst du die Webhooks erneut abonnieren.
Wenn während des App-Ausfalls mehrere Nachrichten gesendet werden, werden diese möglicherweise nicht in der richtigen Reihenfolge zugestellt. Damit die Nachrichten in chronologischer Reihenfolge zugestellt werden, sollten Apps immer das Webhook-timestamp-Feld verwenden.
Um deine Webhook-Verifizierung zu testen, führe die folgende cURL-Anfrage mit deinem Verifizierungstoken durch:
curl -X GET "localhost:1337/webhook?hub.verify_token=YOUR-VERIFY-TOKEN&hub.challenge=CHALLENGE_ACCEPTED&hub.mode=subscribe"
Wenn die Webhook-Verifizierung wie erwartet funktioniert, sollte Folgendes angezeigt werden:
WEBHOOK_VERIFIED in der Befehlszeile, in der dein Node-Prozess ausgeführt wird.CHALLENGE_ACCEPTED in der Befehlszeile, in der du die cURL-Anfrage gesendet hast.Teste deinen Webhook, indem du folgende cURL-Anfrage sendest:
curl -H "Content-Type: application/json" -X POST "localhost:1337/webhook" -d '{"object": "page", "entry": [{"messaging": [{"message": "TEST_MESSAGE"}]}]}'Wenn dein Webhook wie erwartet funktioniert, sollte Folgendes angezeigt werden:
TEST_MESSAGE in der Befehlszeile, in der dein Node-Prozess ausgeführt wird.EVENT RECEIVED in der Befehlszeile, in der du die cURL-Anfrage gesendet hast.Wenn der Server-Endpunkt deiner Webhooks oder deine Beispiel-App bereit ist, navigiere in deiner App zum App-Dashboard von Meta, um Meta-Webhooks zu abonnieren.
In diesem Beispiel verwenden wir das Dashboard, um einen Webhook zu konfigurieren und das messages-Feld zu abonnieren. Jedes Mal, wenn ein*e Kund*in deiner App eine Nachricht sendet, wird eine Benachrichtigung an deinen Webhooks-Endpunkt gesendet.
TOKEN-Konfigurationsvariable deiner App verwendet hast.messages-Feld und sende eine Test-Event-Benachrichtigung.
Du kannst deine Webhooks-Abonnements, das Verifizierungstoken oder die API-Version jederzeit über das App-Dashboard ändern.
Hinweis: Um alle verfügbaren Informationen zu jedem Webhook zu erhalten, solltest du unbedingt die neueste API-Version verwenden.
Du kannst dies mit dem /app/subscriptions-Endpunkt auch programmgesteuert durchführen.
| Webhook-Event | Beschreibung |
|---|---|
| Abonniert die „Nachricht empfangen“-Events |
| Abonniert die Kontoverknüpfungs-Events |
| Abonniert die Kaufabschluss-Update-Events |
| Abonniert die „Nachricht zugestellt“-Events |
| Abonniert die „Zurückgesendeter Nachrichtentext“-Events |
| Abonniert die Instant Game-Events |
| Abonniert die Übergabeprotokoll-Events |
| Abonniert die Plugin-Aktivierungs-Events |
| Abonniert die Zahlungs-Events |
| Abonniert die Richtliniendurchsetzungs-Events |
| Abonniert die „Postback empfangen“-Events |
| Abonniert die Events vor der Zahlung |
| Abonniert die „Nachricht gelesen“-Events |
| Abonniert die Weiterempfehlungs-Events |
| Abonniert die Übergabeprotokoll-Events des Standby-Kanals |
Du musst deine Webhooks-App mit deiner Seite verbinden und deine Seite für die Webhooks-Benachrichtigungen abonnieren, die du erhalten möchtest.
Unter Meta Business Suite > Alle Tools > Business-Apps kannst du eine App mit einer Seite verbinden.
Hinweis: Du musst alle Messaging-Apps für dein Unternehmen im Messaging-Webhook abonnieren.
Du musst deine Seite für die Webhooks-Benachrichtigungen abonnieren, die du erhalten möchtest.
MODERATE-Aufgabe auf der angeforderten Seite ausführen kannUm ein Webhooks-Feld zu abonnieren, sendest du mithilfe des Zugriffstokens der Seite eine POST-Anfrage an die subscribed_apps-Edge der Seite.
curl -i -X POST "https://graph.facebook.com/PAGE-ID/subscribed_apps ?subscribed_fields=messages &access_token=PAGE-ACCESS-TOKEN"
{
"success": "true"
}
Wenn du ermitteln möchtest, welche Apps für deine Seite installiert sind, sende stattdessen eine GET-Anfrage:
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"
]
}
]
}Wenn für deine Seite keine Apps installiert sind, gibt die API einen leeren Datensatz zurück.
Du kannst auch den Graph API Explorer verwenden, um die Abonnementanfrage deiner Seite für ein Webhook-Feld zu senden.
pages_manage_metadata aus. Dadurch wird dein App-Token gegen ein Nutzer-Zugriffstoken mit der pages_manage_metadata-Berechtigung getauscht.GET klickst und POST auswählst.me?fields=id,name durch die ID der Seite gefolgt von /subscribed_apps und übermittle die Anfrage dann. Um Benachrichtigungen von Personen zu erhalten, die eine Rolle in deiner App innehaben, z. B. Admins, Entwickler*innen oder Tester*innen, benötigt deine App lediglich Standardzugriff. Damit du Nachrichten von deinen Kund*innen, also Personen, die keine Rolle in deiner App innehaben, erhalten kannst, benötigt deine App erweiterten Zugriff.
Weitere Informationen zu Standardzugriff und erweitertem Zugriff, den jeweils zugänglichen Daten und den Anforderungen für die Implementierung.