Zahlungen ausschließlich über signierte Stripe-Webhooks oder den Abgleich des Workers verbuchen. Doppelte, verspätete und ungeordnete Events dürfen keinen falschen Zustand erzeugen.
Umgesetzt
/api/stripe/webhook: Signaturprüfung gegen den unveränderten Body, jedes Event genau einmal über StripeEvent (src/lib/webhook.ts)
Getrennte Buchungs- und Zahlungszustände, monotone Übergänge unter Buchungssperre; verspätete Zahlung ohne freien Platz wird „Prüfung nötig“ statt Überbuchung (ADR-5)
Buchungsstatusseite /buchung/status/[token] (nicht indexiert) zeigt nur den Datenbankstand, Aktionen über /api/booking/status-action
Livemodus-Events im Testbetrieb werden abgewiesen
Grundlage
docs/ARCHITEKTUR.md (ADR-5), docs/BETRIEB.md Abschnitt 4 (Webhook-Endpunkt und Events), tests/payments.integration.test.ts. Webhook-Secrets für Test und Live: #22.
Status
Code: ja · Geprüft: ja (Integrationstests) · Gemergt: ja · Produktiv: ja (im Cluster belegt ausgerollt sha-5a88f3d am 13.10.2026)
Stand: 2026-10-16 (Quelle: git origin/main 9785eb2, Gitea-CI-Läufe und Registry, Memory der Sessions)
## Ziel
Zahlungen ausschließlich über signierte Stripe-Webhooks oder den Abgleich des Workers verbuchen. Doppelte, verspätete und ungeordnete Events dürfen keinen falschen Zustand erzeugen.
## Umgesetzt
- [x] `/api/stripe/webhook`: Signaturprüfung gegen den unveränderten Body, jedes Event genau einmal über `StripeEvent` (`src/lib/webhook.ts`)
- [x] Verarbeitete Events: `checkout.session.completed`, `…async_payment_succeeded`, `…async_payment_failed`, `…expired`, `invoice.paid`, `invoice.payment_failed`, `invoice.payment_action_required`, `charge.refunded`, `refund.created`, `refund.updated`, `charge.dispute.created`
- [x] Getrennte Buchungs- und Zahlungszustände, monotone Übergänge unter Buchungssperre; verspätete Zahlung ohne freien Platz wird „Prüfung nötig“ statt Überbuchung (ADR-5)
- [x] Buchungsstatusseite `/buchung/status/[token]` (nicht indexiert) zeigt nur den Datenbankstand, Aktionen über `/api/booking/status-action`
- [x] Livemodus-Events im Testbetrieb werden abgewiesen
## Grundlage
`docs/ARCHITEKTUR.md` (ADR-5), `docs/BETRIEB.md` Abschnitt 4 (Webhook-Endpunkt und Events), `tests/payments.integration.test.ts`. Webhook-Secrets für Test und Live: #22.
## Status
Code: ja · Geprüft: ja (Integrationstests) · Gemergt: ja · Produktiv: ja (im Cluster belegt ausgerollt sha-5a88f3d am 13.10.2026)
Stand: 2026-10-16 (Quelle: git origin/main 9785eb2, Gitea-CI-Läufe und Registry, Memory der Sessions)
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Ziel
Zahlungen ausschließlich über signierte Stripe-Webhooks oder den Abgleich des Workers verbuchen. Doppelte, verspätete und ungeordnete Events dürfen keinen falschen Zustand erzeugen.
Umgesetzt
/api/stripe/webhook: Signaturprüfung gegen den unveränderten Body, jedes Event genau einmal überStripeEvent(src/lib/webhook.ts)checkout.session.completed,…async_payment_succeeded,…async_payment_failed,…expired,invoice.paid,invoice.payment_failed,invoice.payment_action_required,charge.refunded,refund.created,refund.updated,charge.dispute.created/buchung/status/[token](nicht indexiert) zeigt nur den Datenbankstand, Aktionen über/api/booking/status-actionGrundlage
docs/ARCHITEKTUR.md(ADR-5),docs/BETRIEB.mdAbschnitt 4 (Webhook-Endpunkt und Events),tests/payments.integration.test.ts. Webhook-Secrets für Test und Live: #22.Status
Code: ja · Geprüft: ja (Integrationstests) · Gemergt: ja · Produktiv: ja (im Cluster belegt ausgerollt sha-5a88f3d am 13.10.2026)
Stand: 2026-10-16 (Quelle: git origin/main
9785eb2, Gitea-CI-Läufe und Registry, Memory der Sessions)