Zuverlässiger Webhook-Empfänger: Signatur, Idempotenz, Queue und Retries
Baue einen Webhook-Endpunkt, der die HMAC-Signatur prüft, schnell antwortet, Arbeit in eine Queue legt, Duplikate ignoriert und mit Backoff und Dead-Letter-Queue wiederholt. Entwickelt für ChatGPT, Claude, Gemini und Microsoft Copilot. Er enthält 4 anpassbare Variablen und lässt sich kostenlos mit einem Klick kopieren.
Experte · Code · Redaktionelle Prüfung ausstehend
Prompt
Handle als Backend-Engineer mit Erfahrung in Integrationen und verteilten Systemen.
Ich muss Webhooks zuverlässig empfangen:
- Anbieter und Signaturverfahren: {{anbieter}}
- Relevante Ereignisse und was ich jeweils tue: {{ereignisse}}
- Stack: {{stack}}
- Verfügbares Queue-System: {{queue}}
Liefere:
1. Ein Textdiagramm des Ablaufs: Empfang, Prüfung, Speicherung, Einreihen, Verarbeitung, Retries und Dead-Letter-Queue.
2. Den Empfangsendpunkt:
- Liest den Rohbody vor dem Parsen und prüft die HMAC-Signatur mit zeitkonstantem Vergleich.
- Lehnt Anfragen mit Zeitstempel außerhalb eines kurzen Fensters ab, um Replay-Angriffe zu verhindern.
- Speichert das Ereignis und antwortet innerhalb von Millisekunden mit 2xx; keine aufwendige Logik im Request.
3. Idempotenz: eine Ereignistabelle mit der Ereignis-ID des Anbieters als Unique Key, Zuständen (empfangen, in Arbeit, erledigt, fehlgeschlagen) und dem Vorgehen, wenn dasselbe Ereignis zweimal eintrifft.
4. Worker: Verarbeitung mit exponentiellem Backoff und Jitter, maximaler Versuchszahl, Unterscheidung zwischen vorübergehenden und dauerhaften Fehlern sowie Dead-Letter-Queue mit Möglichkeit zur erneuten Verarbeitung.
5. Reihenfolge: Umgang mit Ereignissen in falscher Reihenfolge (z. B. Version oder Zeitstempel der Ressource prüfen oder sie über die API des Anbieters neu abrufen).
6. Logging und Alerting: was protokolliert wird, ohne sensible Daten zu speichern, und welche Kennzahlen zu überwachen sind.
7. Tests: gültige und ungültige Signatur, doppeltes Ereignis, veralteter Zeitstempel, vorübergehender Fehler mit Erholung und dauerhafter Fehler, der in der Dead-Letter-Queue landet.
8. Lokales Testen (Tunnel oder Event-Weiterleitung), ohne das Secret preiszugeben.
Einschränkungen:
- Rate nicht das genaue Signaturformat oder die Header-Namen des Anbieters: Wenn ich sie nicht nenne, markiere sie mit [AUSFÜLLEN] und sag mir, wo ich sie in der Dokumentation finde.
- Das Secret kommt aus Umgebungsvariablen oder einem Secret-Manager, nie aus dem Code.
- Fehlen wichtige Informationen, frag nach, bevor du Code schreibst.So verwenden Sie ihn
- Übernimm Signatur-Header und Algorithmus aus der Dokumentation deines Anbieters.
- Liste die benötigten Ereignisse und die jeweilige fachliche Aktion auf.
- Teste lokal mit weitergeleiteten Ereignissen und provoziere gezielt Fehler, um die Retries zu sehen.
- Beobachte nach dem Deployment die Dead-Letter-Queue.
Anwendungsbeispiel
Anbieter: Zahlungsdienst, der mit HMAC-SHA256 in einem Header signiert · Ereignisse: Zahlung bestätigt, Erstattung · Stack: Python mit FastAPI · Queue: Celery mit Redis.
Beispielergebnis
1. Ablauf
Zahlungsdienst → POST /webhooks/zahlungen → Signatur + Zeitstempel prüfen → INSERT Ereignis (unique)
→ Commit → 200 → Celery: verarbeiten → Retries mit Backoff → Dead-Letter
2. Empfangs-Endpoint
@router.post("/webhooks/zahlungen")
async def empfangen(request: Request, db: AsyncSession = Depends(get_db)) -> dict:
roh = await request.body() # roher Body, vor dem Parsen
ts = request.headers.get("[AUSFÜLLEN: Zeitstempel-Header]", "")
signatur = request.headers.get("[AUSFÜLLEN: Signatur-Header]", "")
if not ts.isdigit() or abs(time.time() - int(ts)) > 300:
raise HTTPException(400, "Zeitstempel fehlt oder ist veraltet")
# Format der signierten Nachricht laut Anbieter-Doku: [AUSFÜLLEN]
erwartet = hmac.new(settings.webhook_secret.encode(),
f"{ts}.".encode() + roh, hashlib.sha256).hexdigest()
if not hmac.compare_digest(erwartet, signatur): # Vergleich in konstanter Zeit
raise HTTPException(400, "ungültige Signatur")
ereignis = json.loads(roh)
stmt = (insert(WebhookEvent)
.values(provider_event_id=ereignis["id"], typ=ereignis["type"],
payload=ereignis, status="empfangen")
.on_conflict_do_nothing(index_elements=["provider_event_id"])
.returning(WebhookEvent.id))
neue_id = (await db.execute(stmt)).scalar_one_or_none()
await db.commit()
if neue_id is not None: # Duplikat → nicht erneut einreihen
ereignis_verarbeiten.delay(neue_id)
return {"ok": True}
Eingereiht wird erst nach dem Commit, damit der Worker nie ein Ereignis liest, das noch nicht existiert…
Wichtige Fakten
- Kategorie
- Programmierung & Entwicklung · APIs
- Ausgabetyp
- Code
- Niveau
- Experte
- Entwickelt für
- ChatGPT, Claude, Gemini und Microsoft Copilot
- Verifiziert in
- Redaktionelle Prüfung ausstehend
- Variablen
- Anbieter und Signatur, Ereignisse und Aktionen, Stack und Queue-System
- Sprache
- Deutsch
- Preis
- Kostenlos, ohne Anmeldung
- Aktualisiert
- 07.11.2026
Häufig gestellte Fragen
Warum 2xx zurückgeben, bevor das Ereignis verarbeitet ist?
Viele Anbieter werten langsame Webhooks als fehlgeschlagen und senden sie erneut, was Duplikate und Zusatzlast erzeugt. Speichern und Einreihen erlaubt eine sofortige Antwort und eine Verarbeitung in Ruhe.
Warum die Signatur gegen den Rohbody prüfen?
Die Signatur wird über die exakt gesendeten Bytes berechnet. Wird das JSON geparst und neu serialisiert, ändern sich Leerzeichen oder Schlüsselreihenfolge und die Prüfung schlägt fehl.
Wofür ist dieser Prompt gedacht?
Baue einen Webhook-Endpunkt, der die HMAC-Signatur prüft, schnell antwortet, Arbeit in eine Queue legt, Duplikate ignoriert und mit Backoff und Dead-Letter-Queue wiederholt.
Mit welchen KI-Tools funktioniert er?
Er ist für ChatGPT, Claude, Gemini und Microsoft Copilot entwickelt. Wir haben ihn in diesen Tools noch nicht überprüft, daher können die Ergebnisse variieren.
Wie passe ich den Prompt an?
Klicken Sie auf „Anpassen“ und füllen Sie die Variablen aus (Anbieter und Signatur, Ereignisse und Aktionen, Stack und Queue-System). Der Text wird sofort aktualisiert und lässt sich anschließend mit einem Klick kopieren. Die Werte werden nur in Ihrem Browser gespeichert.
Brauche ich Erfahrung, um ihn zu verwenden?
Er ist für Experten: Er richtet sich an Personen mit Erfahrung im Thema, die das Ergebnis beurteilen und anpassen können.
Ist dieser Prompt kostenlos?
Ja. Jeder Prompt von HomeCasa Prompts ist kostenlos, ohne Anmeldung und ohne Abonnement. Sie können ihn auch in beruflichen Projekten verwenden.
Kann ich der KI-Ausgabe vertrauen?
Betrachten Sie sie als hochwertigen Entwurf: Prüfen Sie Daten, Zahlen und wichtige Aussagen immer, bevor Sie etwas veröffentlichen oder Entscheidungen treffen.