Webhooks Data Center
Mit Webhooks erhalten externe Anwendungen Benachrichtigungen in Echtzeit, wenn im Babel Licensing Service bestimmte Ereignisse eintreten. Verwenden Sie sie, um Ihre vorhandenen Systeme anzubinden, Abläufe zu automatisieren und Daten synchron zu halten.

Webhooks
Webhooks aufrufen
Webhooks erreichen Sie über das Hauptnavigationsmenü des Babel Licensing Service. Klicken Sie in der linken Seitenleiste auf den Menüeintrag „Webhooks“, um die Verwaltung der Webhooks zu öffnen.
Webhooks verwalten
Webhooks anzeigen
Die Webhook-Seite zeigt eine Tabelle aller konfigurierten Webhook-Abonnements mit ihren Details:
- Name: Ein beschreibender Name des Webhooks
- URL: Der Endpunkt, an den die Ereignisbenachrichtigungen gesendet werden. Die URL wird nur dann als anklickbarer Link angezeigt, wenn sie http oder https verwendet.
- Event: Der Ereignistyp, den der Webhook abonniert hat
- Owner User: Der Benutzer, der den Webhook angelegt hat
- Sent At: Der Zeitstempel der letzten Zustellung eines Ereignisses
- Next Retry: Der Zeitpunkt des nächsten Zustellversuchs (falls zutreffend)
- Status: Aktueller Status des Webhooks (OK, Error und so weiter)
Einen neuen Webhook hinzufügen
Formular für neuen Webhook öffnen
Klicken Sie oben rechts auf der Webhook-Seite auf die Schaltfläche „+ ADD“.
Erforderliche Angaben ausfüllen
- Name: Geben Sie einen beschreibenden Namen für den Webhook ein
- URL: Geben Sie die URL des Endpunkts an, an den die Benachrichtigungen gesendet werden sollen
- Event: Wählen Sie den oder die Ereignistypen, die Sie abonnieren möchten
- Secret: Erzeugen Sie ein Geheimnis für die Prüfung der Anfragen oder geben Sie eines ein
Webhook speichern
Klicken Sie auf „Save“, um das Webhook-Abonnement anzulegen.
Einen Webhook bearbeiten
Webhook suchen
Suchen Sie den Webhook in der Liste.
Editor öffnen
Klicken Sie in der Zeile auf das Symbol zum Bearbeiten (Stift).
Details ändern
Ändern Sie die Details des Webhooks.
Änderungen speichern
Klicken Sie auf „Save“, um das Webhook-Abonnement zu aktualisieren.
Einen Webhook löschen
Webhook-Abonnement suchen
Suchen Sie das Webhook-Abonnement in der Liste.
Abonnement löschen
Klicken Sie in der Zeile auf das Symbol zum Löschen (Papierkorb).
Löschen bestätigen
Bestätigen Sie das Löschen, wenn Sie dazu aufgefordert werden.
Einen Webhook testen
Webhook-Abonnement suchen
Suchen Sie das Webhook-Abonnement in der Liste.
Testereignis senden
Klicken Sie auf das Symbol zum Aktualisieren, um ein Testereignis zu senden.
Ergebnis der Zustellung ansehen
Das Ergebnis der Zustellung sehen Sie in den Ereignisdetails des Webhooks.
Das System verarbeitet das Testereignis über denselben Zustellmechanismus wie echte Ereignisse, mit denselben Headern und derselben Signaturprüfung. So können Sie prüfen, wie Ihr Endpunkt die Nutzdaten eines Webhooks verarbeitet.
Details eines Webhook-Ereignisses
Wenn ein Webhook ausgelöst wurde, zeigt die aufgeklappte Ansicht die Details der Zustellung:
- Timestamp: Zeitpunkt, zu dem das Ereignis eingetreten ist
- Event Type: Der Ereignistyp (zum Beispiel license.created)
- Status: Status der Zustellung (OK, Failed)
- Response: Die Antwort, die Ihr Endpunkt zurückgegeben hat
- Error: Etwaige Fehlermeldungen (falls die Zustellung fehlgeschlagen ist)
- Retry Count: Anzahl der Zustellversuche
- Next Retry: Zeitpunkt des nächsten erneuten Versuchs (falls zutreffend)
Unterstützte Ereignisse
Der Babel Licensing Service unterstützt folgende Webhook-Ereignisse:
Lizenzen
- license.created Wird ausgelöst, wenn eine neue Lizenz erstellt wird.
- license.updated Wird ausgelöst, wenn eine vorhandene Lizenz aktualisiert wird.
- license.deleted Wird ausgelöst, wenn eine Lizenz gelöscht wird.
- license.expiring Wird ausgelöst, wenn eine Lizenz in Kürze abläuft.
- license.expired Wird ausgelöst, wenn eine Lizenz abgelaufen ist.
- license.revoked Wird ausgelöst, wenn eine Lizenz widerrufen wird.
- license.supportexpiring Wird ausgelöst, wenn die Wartung einer Lizenz in Kürze abläuft.
- license.supportexpired Wird ausgelöst, wenn die Wartung einer Lizenz abgelaufen ist.
- license.activated Wird ausgelöst, wenn eine Lizenz aktiviert wird.
- license.deactivated Wird ausgelöst, wenn eine Lizenz deaktiviert wird.
- license.requested Wird ausgelöst, wenn eine Lizenz angefordert wird.
- license.released Wird ausgelöst, wenn eine Lizenz freigegeben wird.
Bestellungen
- order.created Wird ausgelöst, wenn eine neue Bestellung angelegt wird.
- order.updated Wird ausgelöst, wenn eine vorhandene Bestellung aktualisiert wird.
- order.deleted Wird ausgelöst, wenn eine Bestellung gelöscht wird.
Berichte
report.created Wird ausgelöst, wenn ein neuer Bericht erstellt wird.
Referenz der Webhook-Nutzdaten
Dieser Abschnitt beschreibt im Detail, wie die Nutzdaten der Webhook-Ereignisse für die verschiedenen Ereignistypen aufgebaut sind und was sie enthalten.
Nutzdaten eines Lizenzereignisses
Bei einem Lizenzereignis (etwa license.created) enthalten die Nutzdaten folgende Felder:
{
"id": 101,
"licenseId": "LIC-0001",
"userKey": "XJK-SHJD-GE5E",
"licensee": "Acme Corp",
"licensingMode": 1,
"issueDate": "2025-03-16T00:00:00Z",
"supportExpireDate": "2026-03-16T00:00:00Z",
"expireDate": "2025-12-31T23:59:59Z",
"customerId": 501,
"orderId": 302,
"templateId": 10,
"revoked": false,
"trace": false,
"eventType": "license.created",
"timestamp": "2025-03-16T12:00:00Z"
}| Feld | Typ | Beschreibung |
|---|---|---|
id | Ganzzahl | Die eindeutige Datenbankkennung der Lizenz. Wird für API-Aufrufe und die interne Nachverfolgung verwendet. |
licenseId | Zeichenfolge | Eine gut lesbare Lizenzkennung (zum Beispiel „LIC-0001“), die in der Kommunikation mit Kunden und in der Dokumentation verwendet wird. |
userKey | Zeichenfolge | Der Aktivierungsschlüssel, den Endbenutzer eingeben, um die lizenzierte Software zu aktivieren. |
licensee | Zeichenfolge | Der Name der Person oder Organisation, für die die Lizenz ausgestellt ist. |
licensingMode | Ganzzahl | Die angewendete Lizenzierungsart (zum Beispiel „0: File“, „1: Activation“, „2: Floating“). |
issueDate | Datum und Uhrzeit (ISO 8601) | Datum und Uhrzeit, zu denen die Lizenz ursprünglich ausgestellt wurde. |
supportExpireDate | Datum und Uhrzeit (ISO 8601) | Datum und Uhrzeit, zu denen die Wartung dieser Lizenz endet. |
expireDate | Datum und Uhrzeit (ISO 8601) | Datum und Uhrzeit, zu denen die Lizenz selbst abläuft und ungültig wird. |
customerId | Ganzzahl | Referenz auf den Kunden, dem diese Lizenz gehört. Entspricht einem Kundendatensatz im System. |
orderId | Ganzzahl | Referenz auf die Bestellung, mit der diese Lizenz gekauft wurde. |
templateId | Ganzzahl | Die ID der Lizenzvorlage, aus der diese Lizenz erzeugt wurde und die ihre Funktionen und Einschränkungen bestimmt. |
revoked | Boolescher Wert | Gibt an, ob die Lizenz administrativ für ungültig erklärt wurde (true) oder aktiv bleibt (false). |
trace | Boolescher Wert | Gibt an, ob für die Lizenz die Ablaufverfolgung eingeschaltet ist. |
eventType | Zeichenfolge | Gibt den Ereignistyp an, der diesen Webhook ausgelöst hat (zum Beispiel „license.created“, „license.updated“). |
timestamp | Datum und Uhrzeit (ISO 8601) | Der genaue Zeitpunkt, zu dem das Ereignis eingetreten ist und der Webhook versendet wurde. |
Nutzdaten eines Bestellereignisses
Bei Bestellereignissen (etwa order.created) enthalten die Nutzdaten des Webhooks diese Felder:
{
"id": 202,
"orderNumber": "ORD-12345",
"customerId": 501,
"createdAt": "2025-03-16T12:00:00Z",
"status": "completed",
"eventType": "order.created",
"timestamp": "2025-03-16T12:05:00Z"
}| Feld | Typ | Beschreibung |
|---|---|---|
id | Ganzzahl | Die eindeutige Datenbankkennung der Bestellung. Verwenden Sie diese ID bei API-Aufrufen für Bestelldetails. |
orderNumber | Zeichenfolge | Eine gut lesbare Bestellnummer, die in der Kommunikation mit Kunden und in der Buchhaltung verwendet wird. |
customerId | Ganzzahl | Die eindeutige Kennung des Kunden, der die Bestellung aufgegeben hat. Verweist auf einen Kundendatensatz. |
createdAt | Datum und Uhrzeit (ISO 8601) | Datum und Uhrzeit, zu denen die Bestellung ursprünglich im System angelegt wurde. |
status | Zeichenfolge | Der aktuelle Bearbeitungsstatus der Bestellung. Mögliche Werte sind unter anderem: „pending“, „processing“, „completed“, „cancelled“, „refunded“. |
eventType | Zeichenfolge | Gibt an, welches Bestellereignis diesen Webhook ausgelöst hat (zum Beispiel „order.created“, „order.updated“, „order.deleted“). |
timestamp | Datum und Uhrzeit (ISO 8601) | Der genaue Zeitpunkt, zu dem das Ereignis eingetreten ist und der Webhook versendet wurde. |
Nutzdaten eines Berichtsereignisses
Bei Berichtsereignissen (etwa report.created) enthalten die Nutzdaten des Webhooks diese Felder:
{
"id": 303,
"name": "Monthly Report",
"date": "2025-03-15T00:00:00Z",
"eventType": "report.created",
"timestamp": "2025-03-16T12:10:00Z"
}| Feld | Typ | Beschreibung |
|---|---|---|
id | Ganzzahl | Die eindeutige Datenbankkennung des Berichts. Mit dieser ID rufen Sie den vollständigen Bericht über die API ab. |
name | Zeichenfolge | Der beschreibende Titel des Berichts, wie er im System definiert ist. |
date | Datum und Uhrzeit (ISO 8601) | Das Datum, auf das sich der Inhalt des Berichts bezieht (in der Regel das Enddatum des Berichtszeitraums). |
eventType | Zeichenfolge | Gibt an, welches Berichtsereignis diesen Webhook ausgelöst hat (derzeit nur „report.created“). |
timestamp | Datum und Uhrzeit (ISO 8601) | Der genaue Zeitpunkt, zu dem das Ereignis eingetreten ist und der Webhook versendet wurde. |
Zustellung von Webhooks und Wiederholungslogik
Der Babel Licensing Service verarbeitet Webhooks in einem Hintergrunddienst, der ständig läuft:
- Der Dienst prüft alle 30 Sekunden, ob neue Webhook-Ereignisse vorliegen
- Webhooks werden in Stapeln von bis zu 50 Ereignissen verarbeitet
- Das System verarbeitet sowohl ausstehende (neue) Ereignisse als auch zuvor fehlgeschlagene Ereignisse, für die ein erneuter Versuch geplant ist
- Jede Webhook-Zustellung enthält Standardheader:
User-Agent: Kennzeichnet den Babel Licensing ServiceX-Babel-Webhook-Id: Eindeutige Kennung der Webhook-ZustellungX-Babel-Event: Der Typ des zugestellten EreignissesX-Babel-Timestamp: Zeitpunkt, zu dem das Ereignis versendet wurdeX-Babel-Signature: HMAC-SHA256-Signatur (falls ein Geheimnis konfiguriert ist)
Wiederholungsmechanismus
Für eine fehlgeschlagene Webhook-Zustellung gilt:
- Das System plant automatisch einen erneuten Versuch 5 Minuten später
- Für jeden Webhook lässt sich eine maximale Anzahl von Wiederholungen konfigurieren
- Fehlgeschlagene Ereignisse bleiben im System, bis sie erfolgreich zugestellt sind oder die maximale Anzahl von Wiederholungen erreicht ist
- Die Webhook-Oberfläche zeigt bei fehlgeschlagenen Zustellungen den Zeitpunkt des nächsten geplanten Versuchs
- Zu jeder fehlgeschlagenen Zustellung wird die Fehlermeldung oder der HTTP-Statuscode für die Fehlerbehebung gespeichert
Webhook-Status
Webhooks können im System folgende Status haben:
- OK: Das Ereignis wurde erfolgreich zugestellt
- Failed: Die Zustellung ist fehlgeschlagen, und die maximale Anzahl von Wiederholungen wurde überschritten
- Pending: Das Ereignis wartet auf die Verarbeitung
- Scheduled: Die Zustellung ist fehlgeschlagen, und ein erneuter Versuch ist geplant
Webhooks absichern
Alle Webhook-Anfragen enthalten eine Signatur im Header X-Babel-Signature. Diese Signatur wird mit HMAC-SHA256 aus dem Geheimnis Ihres Webhooks und dem Anfragetext erzeugt.
So prüfen Sie den Webhook:
Signatur auslesen
Lesen Sie die Signatur aus dem Header X-Babel-Signature.
Erwartete Signatur berechnen
Berechnen Sie eine HMAC-SHA256-Signatur aus Ihrem Geheimnis und dem unveränderten Anfragetext.
Signaturen vergleichen
Vergleichen Sie die berechnete Signatur mit der Signatur im Header.
Nur bei Übereinstimmung verarbeiten
Verarbeiten Sie den Webhook nur, wenn die Signaturen übereinstimmen.
Beispielcode für die Prüfung (C#):
private bool VerifyWebhookSignature(string payload, string signatureHeader, string secret)
{
using var hmac = new HMACSHA256(Encoding.UTF8.GetBytes(secret));
var computedHash = hmac.ComputeHash(Encoding.UTF8.GetBytes(payload));
var computedSignature = Convert.ToBase64String(computedHash);
return signatureHeader == computedSignature;
}Einen Webhook-Empfänger implementieren
Das folgende vollständige Beispiel zeigt, wie Sie in ASP.NET Core einen Webhook-Empfänger implementieren, der die Signaturen der Webhooks ordnungsgemäß validiert:
// WebhookValidator.cs
using System;
using System.Security.Cryptography;
using System.Text;
namespace YourProject.Utilities
{
public static class WebhookValidator
{
/// <summary>
/// Validates the webhook payload against the provided signature using HMAC-SHA256.
/// </summary>
/// <param name="payload">The raw JSON payload.</param>
/// <param name="secret">The shared secret.</param>
/// <param name="signature">The signature from the incoming request header.</param>
/// <returns>True if the signature is valid; otherwise, false.</returns>
public static bool ValidateSignature(string payload, string secret, string signature)
{
using var hmac = new HMACSHA256(Encoding.UTF8.GetBytes(secret));
var hash = hmac.ComputeHash(Encoding.UTF8.GetBytes(payload));
var computedSignature = BitConverter.ToString(hash).Replace("-", "").ToLowerInvariant();
return string.Equals(computedSignature, signature, StringComparison.OrdinalIgnoreCase);
}
}
}
// WebhookController.cs
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Logging;
using System.IO;
using System.Threading.Tasks;
using YourProject.Utilities;
namespace YourProject.Controllers
{
[ApiController]
[Route("api/webhook")]
public class WebhookController : ControllerBase
{
private readonly ILogger<WebhookController> _logger;
// Ideally, the secret comes from configuration
private readonly string _webhookSecret = "your-webhook-secret";
public WebhookController(ILogger<WebhookController> logger)
{
_logger = logger;
}
[HttpPost]
public async Task<IActionResult> ReceiveWebhook()
{
// Read the payload from the request body
var payload = await new StreamReader(Request.Body).ReadToEndAsync();
// Retrieve the signature from the request headers
if (!Request.Headers.TryGetValue("X-Babel-Signature", out var incomingSignature))
{
_logger.LogWarning("Missing X-Babel-Signature header");
return Unauthorized("Signature header missing");
}
// Validate the signature
if (!WebhookValidator.ValidateSignature(payload, _webhookSecret, incomingSignature))
{
_logger.LogWarning("Invalid webhook signature");
return Unauthorized("Invalid signature");
}
// Process the webhook payload
_logger.LogInformation("Webhook payload validated and processed");
// TODO: Deserialize and process the payload as needed
return Ok();
}
}
}Bewährte Vorgehensweisen für den Empfang von Webhooks
Beachten Sie bei der Implementierung eines Webhook-Empfängers:
- Signaturen immer validieren: Prüfen Sie mit dem bereitgestellten Code zur Signaturvalidierung die Echtheit jedes Webhooks
- Webhook-Geheimnis sicher speichern: Schreiben Sie es nicht fest in den Code wie im Beispiel, sondern verwenden Sie ein sicheres Konfigurationssystem
- Schnell antworten: Geben Sie eine Antwort 200 OK zurück, sobald Sie die Signatur validiert haben
- Asynchron verarbeiten: Verarbeiten Sie den Webhook nach der Validierung und der Antwort in einem Hintergrundthread oder einer Warteschlange
- Idempotenz implementieren: Verwenden Sie die Ereignis-ID, damit mehrfach zugestellte Webhooks nicht doppelt verarbeitet werden
- Alle Webhook-Ereignisse protokollieren: Zeichnen Sie alle empfangenen Webhooks für Debugging und Prüfungen auf
Webhook-Ereignisse verarbeiten
Verschiedene Ereignistypen behandeln
Ihr Webhook-Empfänger sollte so angelegt sein, dass er die verschiedenen Ereignistypen passend behandelt. Das folgende Beispiel zeigt, wie Sie nach der Validierung der Signatur verschiedene Webhook-Ereignisse verarbeiten können:
// Example of webhook event processing
private async Task ProcessWebhookEvent(string payload, string eventType)
{
switch (eventType)
{
case "license.created":
await ProcessNewLicense(payload);
break;
case "license.expired":
await ProcessExpiredLicense(payload);
break;
case "order.created":
await ProcessNewOrder(payload);
break;
// Handle other event types
default:
_logger.LogWarning($"Unhandled webhook event type: {eventType}");
break;
}
}
// Example deserialization and processing
private async Task ProcessNewLicense(string payload)
{
try
{
// Deserialize the payload
var licenseEvent = JsonSerializer.Deserialize<LicenseCreatedEvent>(payload);
// Process the license
_logger.LogInformation($"Processing new license: {licenseEvent.LicenseId}");
// Example: Store in your database, notify users, etc.
await _licenseService.SyncLicenseAsync(licenseEvent.Id);
}
catch (Exception ex)
{
_logger.LogError(ex, "Error processing license.created webhook");
}
}Fehlerbehebung
Häufige Probleme
- Webhook empfängt keine Ereignisse: Prüfen Sie den Status des Webhooks im Dashboard und ob Sie den Ereignistyp abonniert haben
- Authentifizierungsfehler: Prüfen Sie, ob Ihr Code zur Signaturvalidierung korrekt ist und ob Sie dasselbe Geheimnis verwenden, das im Webhook konfiguriert ist
- Zeitüberschreitungen: Stellen Sie sicher, dass Ihr Endpunkt in angemessener Zeit antwortet (das System wartet auf eine Antwort, bevor es die Zustellung als erfolgreich kennzeichnet)
- Ungültige URL: Prüfen Sie, ob Ihre Webhook-URL aus dem Internet erreichbar ist und HTTP-Statuscodes 2xx zurückgibt
- Benutzerdefinierte Header werden nicht angewendet: Prüfen Sie das Format Ihrer benutzerdefinierten Header in der Konfiguration des Webhooks
- Webhook als fehlgeschlagen gekennzeichnet: Sehen Sie in den Details des Webhooks in der Fehlermeldung nach, welcher HTTP-Statuscode oder welche Ausnahme aufgetreten ist
Webhook-Verlauf anzeigen
Zu jedem Webhook können Sie den vollständigen Zustellverlauf einsehen:
- Klicken Sie in der Hauptliste auf einen Webhook, um seine Details aufzuklappen
- Der Abschnitt mit dem Verlauf zeigt alle Zustellversuche mit Zeitstempeln, Ereignistypen, Status und etwaigen Fehlermeldungen
- Mit diesen Informationen diagnostizieren Sie Zustellprobleme oder bestätigen erfolgreiche Zustellungen