Webhooks-Leitfaden

Aufstellen Kern-API Ausgehende Webhooks (X-Webhook-Signature) für Lizenz- und Plattformveranstaltungen.

Verwenden Sie für Pay-Zahlungen Webhooks Bezahlen Sie Händler-Webhooks. Informationen zur Mirror-Redirect-Signierung finden Sie unter Spiegel-SDK.

Überblick

Mit Webhooks können Sie Echtzeitbenachrichtigungen erhalten, wenn in Ihrem LicenseChain-Konto Ereignisse auftreten Kern-API (POST /v1/webhooks). Pay-Händler-Events nutzen Bezahlen Sie Händler-Webhooks; Mirror-Weiterleitungen verwenden die Spiegel-SDK Signierfluss.

Was Sie lernen werden

Einrichtung und Konfiguration

  • Webhooks erstellen und verwalten
  • Webhook-Endpunkte konfigurieren
  • Veranstaltungsabonnements einrichten
  • Webhook-Sicherheit und Signaturen

Durchführung

  • Webhook-Ereignisse werden empfangen
  • Webhook-Signaturen überprüfen
  • Umgang mit Webhook-Fehlern
  • Webhook-Endpunkte testen

Webhooks erstellen

1. Erstellen Sie einen Webhook-Endpunkt

Erstellen Sie zunächst einen HTTP-Endpunkt in Ihrer Anwendung, der POST-Anfragen von LicenseChain empfangen kann.

// Express.js Example
app.post('/webhooks/licensechain', async (req, res) => {'{'}
  const signature = req.headers['x-webhook-signature'];
  const timestamp = req.headers['x-webhook-timestamp'];
  const payload = JSON.stringify(req.body);
  
  // Verify signature (see Security section)
  if (!verifySignature(payload, signature, timestamp, webhookSecret)) {'{'}
    return res.status(401).send('Invalid signature');
  {'}'}
  
  // Process webhook event
  const event = req.body;
  console.log('Received event:', event.type, event.data);
  
  res.status(200).send('OK');
{'}'});

2. Registrieren Sie Ihren Webhook

Verwenden Sie die LicenseChain-API, um Ihren Webhook-Endpunkt zu registrieren. Sie müssen die URL angeben und angeben, welche Ereignisse Sie erhalten möchten.

POST /v1/webhooks
Authorization: Bearer YOUR_API_KEY
Content-Type: application/json

{'{'}
  "url": "https://your-app.com/webhooks/licensechain",
  "events": ["license.created", "license.updated", "license.revoked"],
  "secret": "optional-custom-secret"
{'}'}

Notiz: Wenn Sie kein Geheimnis angeben, generiert LicenseChain automatisch eines für Sie. Stellen Sie sicher, dass Sie dieses Geheimnis sicher aufbewahren, da Sie es zur Überprüfung von Webhook-Signaturen benötigen.

3. Verfügbare Veranstaltungen

LicenseChain unterstützt die folgenden Webhook-Ereignisse:

Lizenz.erstellt Wird ausgelöst, wenn eine neue Lizenz erstellt wird
Lizenz.aktualisiert Wird ausgelöst, wenn eine Lizenz aktualisiert wird
Lizenz.widerrufen Wird ausgelöst, wenn eine Lizenz widerrufen oder ausgesetzt wird
Lizenz.abgelaufen Wird ausgelöst, wenn eine Lizenz abläuft
Benutzer.registriert Wird ausgelöst, wenn sich ein neuer Benutzer registriert
app.erstellt Wird ausgelöst, wenn eine neue App erstellt wird

Sicherheit und Signaturüberprüfung

Webhook-Signaturen

Alle Webhook-Anfragen enthalten eine Signatur im X-Webhook-Signature Kopfzeile. Die Signatur des rohen Anforderungstexts lautet HMAC-SHA256 und verwendet Ihr Webhook-Geheimnis. Überprüfen Sie immer die Verwendung Konstantzeitvergleich (z.B. crypto.timingSafeEqual), um Timing-Angriffe zu verhindern. Der Header-Wert kann unformatiert hexadezimal oder sein sha256= gefolgt von Hex; Streifen Sie die sha256= Präfix vor dem Vergleich von Hex-Puffer, damit die Längen übereinstimmen.

// Node.js Example (constant-time, supports sha256= prefix)
const crypto = require('crypto');

function verifySignature(payload, signature, secret) {'{'}
  if (!payload || !signature || !secret) return false;
  const expected = crypto.createHmac('sha256', secret).update(payload).digest('hex');
  const received = String(signature).startsWith('sha256=') ? String(signature).slice(7) : String(signature);
  const a = Buffer.from(expected, 'hex');
  const b = Buffer.from(received, 'hex');
  if (a.length !== b.length) return false;
  return crypto.timingSafeEqual(a, b);
{'}'}

// In your webhook handler (use raw body for payload)
const signature = req.headers['x-webhook-signature'];
const payload = req.rawBody || JSON.stringify(req.body);
if (!verifySignature(payload, signature, webhookSecret)) {'{'}
  return res.status(401).send('Invalid signature');
{'}'}

Header anfordern

LicenseChain enthält bei jeder Webhook-Anfrage die folgenden Header:

X-Webhook-Signature HMAC-SHA256-Signatur des Anforderungstexts
X-Webhook-Timestamp Unix-Zeitstempel, wann der Webhook gesendet wurde
Content-Type Stets application/json

Webhook-Ereignisstruktur

Alle Webhook-Ereignisse folgen einer einheitlichen Struktur:

{'{'}
  "id": "550e8400-e29b-41d4-a716-446655440000",
  "type": "license.created",
  "data": {'{'}
    "id": "license-id",
    "licenseKey": "ABC123...",
    "userId": "user-id",
    "productId": "product-id",
    "status": "active",
    "expiresAt": "2024-12-31T23:59:59Z",
    "createdAt": "2024-01-01T00:00:00Z"
  {'}'},
  "timestamp": "2024-01-01T00:00:00Z",
  "signature": "hmac-sha256-signature"
{'}'}

Webhooks verwalten

Alle Webhooks auflisten

GET /v1/webhooks?page=1&limit=10
Authorization: Bearer YOUR_API_KEY

Webhook-Details abrufen

GET /v1/webhooks/:id
Authorization: Bearer YOUR_API_KEY

Webhook aktualisieren

PUT /v1/webhooks/:id
Authorization: Bearer YOUR_API_KEY
Content-Type: application/json

{'{'}
  "url": "https://new-url.com/webhooks",
  "events": ["license.created", "license.updated"]
{'}'}

Webhook löschen

DELETE /v1/webhooks/:id
Authorization: Bearer YOUR_API_KEY

Webhooks testen

Test-Webhook senden

Sie können Ihren Webhook-Endpunkt testen, ohne auf das Eintreten eines echten Ereignisses warten zu müssen:

POST /v1/webhooks/:id/test
Authorization: Bearer YOUR_API_KEY

Dadurch wird ein Testereignis mit einer Beispielnutzlast an Ihre Webhook-URL gesendet. Verwenden Sie dies, um zu überprüfen, ob Ihr Endpunkt ordnungsgemäß funktioniert.

Webhook-Protokolle anzeigen

Überprüfen Sie den Zustellungsstatus und die Antwort für jedes Webhook-Ereignis:

GET /v1/webhooks/:id/logs?page=1&limit=10
Authorization: Bearer YOUR_API_KEY

Zu den Protokollen gehören der HTTP-Statuscode, der Antworttext und ob die Zustellung erfolgreich war.

Best Practices

✅ Überprüfen Sie immer die Unterschriften

Verarbeiten Sie niemals Webhook-Ereignisse, ohne die Signatur zu überprüfen. Dadurch wird sichergestellt, dass die Anfrage von LicenseChain stammt und nicht manipuliert wurde.

✅ Reagieren Sie schnell

Ihr Webhook-Endpunkt sollte innerhalb von 5 Sekunden antworten. Bestätigen Sie bei Vorgängen mit langer Laufzeit den Webhook sofort und verarbeiten Sie ihn asynchron.

✅ Umgang mit Idempotenz

Verwenden Sie die Ereignis-ID, um zu verhindern, dass dasselbe Ereignis mehrmals verarbeitet wird. Speichern Sie verarbeitete Ereignis-IDs und überprüfen Sie sie vor der Verarbeitung.

✅ Verwenden Sie HTTPS

Verwenden Sie für Ihre Webhook-Endpunkte immer HTTPS, um sicherzustellen, dass die Daten während der Übertragung verschlüsselt werden.

✅ Überwachen Sie Webhook-Protokolle

Überprüfen Sie regelmäßig die Webhook-Protokolle, um Zustellungsprobleme zu erkennen und zu beheben. Richten Sie Benachrichtigungen für fehlgeschlagene Lieferungen ein.

Fehlerbehebung

Webhook empfängt keine Ereignisse

  • • Stellen Sie sicher, dass Ihre Webhook-URL über das Internet zugänglich ist
  • • Überprüfen Sie, ob Ihr Endpunkt einen 2xx-Statuscode zurückgibt
  • • Stellen Sie sicher, dass die Ereignisse, die Sie abonniert haben, tatsächlich stattfinden
  • • Überprüfen Sie die Webhook-Protokolle auf Zustellungsfehler

Signaturüberprüfung schlägt fehl

  • • Stellen Sie sicher, dass Sie das richtige Webhook-Geheimnis verwenden
  • • Stellen Sie sicher, dass Sie den genauen Anforderungstext signieren (als JSON-Zeichenfolge).
  • • Überprüfen Sie, ob Sie den HMAC-SHA256-Algorithmus verwenden
  • • Stellen Sie sicher, dass die Header korrekt gelesen werden (Groß- und Kleinschreibung beachten).

Timeout-Fehler

  • • Optimieren Sie Ihren Webhook-Handler, um schnell zu reagieren
  • • Verlagern Sie schwere Verarbeitungsvorgänge in Hintergrundjobs
  • • 200 OK sofort zurückgeben und asynchron verarbeiten