Webhooks
Ein Webhook sendet eine JSON-Nachricht per POST an eine URL Ihrer Wahl, sobald auf der Website etwas passiert: Ein Formular hat einen Datensatz angelegt, oder die Dataverse-Verbindung ist ausgefallen oder wieder verfügbar. Damit starten Sie einen Power-Automate-Flow, posten in einen Teams-Kanal oder beliefern einen beliebigen HTTP-Endpunkt. Ist ein Secret gesetzt, wird jede Nachricht signiert, damit der Empfänger sie prüfen kann.
Webhook einrichten
Legen Sie auf dem Tab "Webhooks" einen Webhook an: mit Bezeichnung, URL, den abonnierten Ereignissen, einem optionalen Secret und dem Schalter zum Aktivieren. Das Secret-Feld ist mit einem Zufallswert vorbelegt; kopieren Sie ihn vor dem Speichern zum Empfänger, er wird danach nicht mehr angezeigt. Zustellungen laufen nach dem Prinzip "fire and forget" mit 5 Sekunden Timeout; die Website wartet nie auf den Empfänger.
Ereignisse
| Ereignis | Wann | data |
|---|---|---|
| form.created | Ein Formular auf dem Tab "Forms" oder die WBS-Forms-Bridge hat einen Datensatz angelegt | form (Formularschlüssel oder bridge:<slug>), entity_set, id (GUID, leer wenn unbekannt), record (die geschriebenen Daten) |
| health.failure | Der Health-Monitor hat einen Fehler erfasst und gemeldet: den ersten einer Episode, eine geänderte Fehlerklasse oder einen Fehler nach Ablauf des Cooldowns | state, class (auth, network, api, form), detail, context, since (Unix-Zeit) |
| health.recovery | Die Verbindung funktioniert nach einer Fehlerepisode wieder | Dieselben Felder wie health.failure |
| test.ping | Der Link "Test" auf dem Tab "Webhooks" | webhook (ID), label |
Aktualisierungen von Datensätzen durch Formulare im Update-Modus lösen die Action wbs_dataverse_connect_record_updated aus, aber kein Webhook-Ereignis.
Aufbau der Nachricht
Jede Nachricht ist ein JSON-Objekt mit vier Elementen. time ist UTC nach ISO 8601, site ist die Home-URL der sendenden Website.
{
"event": "form.created",
"site": "https://example.com/",
"time": "2026-09-07T10:15:30+00:00",
"data": {
"form": "inquiry",
"entity_set": "wbs_inquiries",
"id": "00000000-0000-0000-0000-000000000000",
"record": {
"wbs_name": "Jane Doe",
"wbs_email": "jane@example.com",
"wbs_Listing@odata.bind": "/wbs_listings(00000000-0000-0000-0000-000000000000)"
}
}
}
Header jeder Zustellung:
| Header | Wert |
|---|---|
| Content-Type | application/json; charset=utf-8 |
| X-WBS-Event | Der Slug des Ereignisses |
| X-WBS-Signature | sha256=<HMAC-SHA256 des rohen Bodys mit dem Secret, hexadezimal>; nur wenn ein Secret gesetzt ist |
| User-Agent | WBS-Connect-for-Dataverse/1.5.0; https://example.com/ |
Das Element record enthält die Daten, die der Besucher abgeschickt hat. Dürfen personenbezogene Daten die Website nicht verlassen, kürzen Sie es mit dem Filter wbs_dataverse_connect_webhook_payload. Er erhält den empfangenden Webhook, sodass Sie den Body je Endpunkt gestalten können.
Signatur prüfen
Der Empfänger berechnet den HMAC über den rohen Request-Body neu, Byte für Byte, und vergleicht ihn in konstanter Zeit mit dem Header.
PHP
$secret = 'the secret from the Webhooks tab';
$body = file_get_contents('php://input');
$given = $_SERVER['HTTP_X_WBS_SIGNATURE'] ?? '';
$expect = 'sha256=' . hash_hmac('sha256', $body, $secret);
if (!hash_equals($expect, $given)) {
http_response_code(401);
exit;
}
$message = json_decode($body, true);
// $message['event'], $message['data'] ...
Power Automate
Verwenden Sie den Trigger When an HTTP request is received (in der deutschen Oberfläche "Wenn eine HTTP-Anforderung empfangen wird") und fügen Sie dessen URL in den Webhook ein. Die Ausdruckssprache des Flows hat keine HMAC-Funktion, der Flow kann die Signatur also nicht selbst nachrechnen. Zwei praktikable Muster:
- Behandeln Sie die Trigger-URL als gemeinsames Geheimnis: Sie trägt einen eigenen Parameter
sigund lässt sich nicht erraten. Fügen Sie eine Condition ein, die den Ereignis-Header prüft, bevor etwas anderes passiert, und lassen Sie das Webhook-Secret leer oder ignorieren Sie den Signatur-Header. - Muss die Signatur geprüft werden, setzen Sie eine Azure Function oder eine Logic App mit Inline-Code vor den Flow: Sie prüft den HMAC wie im PHP-Beispiel und leitet den Body weiter.
Bedingung für das erste Muster, die den Ereignis-Header mit dem erwarteten Wert vergleicht:
triggerOutputs()?['headers']?['X-WBS-Event'] is equal to form.created
Lesen Sie den Body in späteren Schritten mit triggerBody()?['data']?['record']?['wbs_email'], oder hinterlegen Sie die Nachricht oben als JSON-Schema-Beispiel des Triggers, damit die Felder in der Auswahl für dynamische Inhalte erscheinen.
Der Link "Test"
Jeder Webhook in der Liste hat einen Link "Test". Er sendet ein test.ping an die URL, wartet auf die Antwort und zeigt den HTTP-Status, den der Endpunkt zurückgegeben hat (oder den Transportfehler). Ein Status von 200 bis 299 gilt als zugestellt. Nutzen Sie den Link, nachdem Sie eine Power-Automate-URL eingefügt haben: Der Ausführungsverlauf des Flows zeigt dann die Beispielnachricht mit ihren Headern.
Für Entwickler
wbs_dataverse_connect_webhook_payload($payload, $event, $hook): formt den Body je Endpunkt um, zum Beispiel zu einer Adaptive Card für Teams.wbs_dataverse_connect_webhook_args($args, $hook, $event): die Argumente fürwp_remote_postvor dem Signieren; ein umgeschriebener Body erhält trotzdem eine passende Signatur.wbs_dataverse_connect_webhook_dispatched($event, $data, $sent): Action, nachdem ein Ereignis an seine Webhooks übergeben wurde, mit der Anzahl der Zustellungen.- Webhooks werden in der Option
wbsdvc_webhooksgespeichert und bei der Deinstallation entfernt.