Webhooks

Zuletzt aktualisiert: September 2026, Plugin 1.5.2

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

EreignisWanndata
form.createdEin Formular auf dem Tab "Forms" oder die WBS-Forms-Bridge hat einen Datensatz angelegtform (Formularschlüssel oder bridge:<slug>), entity_set, id (GUID, leer wenn unbekannt), record (die geschriebenen Daten)
health.failureDer Health-Monitor hat einen Fehler erfasst und gemeldet: den ersten einer Episode, eine geänderte Fehlerklasse oder einen Fehler nach Ablauf des Cooldownsstate, class (auth, network, api, form), detail, context, since (Unix-Zeit)
health.recoveryDie Verbindung funktioniert nach einer Fehlerepisode wiederDieselben Felder wie health.failure
test.pingDer 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:

HeaderWert
Content-Typeapplication/json; charset=utf-8
X-WBS-EventDer Slug des Ereignisses
X-WBS-Signaturesha256=<HMAC-SHA256 des rohen Bodys mit dem Secret, hexadezimal>; nur wenn ein Secret gesetzt ist
User-AgentWBS-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 sig und 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ür wp_remote_post vor 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_webhooks gespeichert und bei der Deinstallation entfernt.

Siehe auch