Case Study · JoomSubs

Membership in Joomla mit Stripe, Webhooks und belastbarer Zustandslogik

JoomSubs entstand mit dem Ziel, Stripe-Abonnements sauber mit Joomla-Benutzergruppen zu verbinden. Im Mittelpunkt standen nicht nur Checkout und Zahlung, sondern der komplette Subscription-Lifecycle: Webhooks, Tarifwechsel, Kündigung, Reaktivierung, Recovery und Reconciliation.

PaymentsStripe
AccessJoomla Benutzergruppen
LifecycleCheckout · Wechsel · Kündigung · Reaktivierung
BetriebWebhook Inbox · Reconciliation · Scheduler
Projektstart

Ausgangslage

Ein Membership-System muss Zahlungsstatus und realen Joomla-Zugriff konsistent halten. Genau dort entstehen die schwierigen Fälle: Webhooks kommen verspätet oder doppelt, Zahlungen benötigen 3D Secure, Tarifwechsel greifen erst später und Gruppenrechte dürfen trotzdem nie in einem falschen Zustand bleiben.

Webhook

Asynchrone Events

Stripe-Events kommen unabhängig vom Browser und müssen idempotent sowie wiederholbar verarbeitet werden.

Access

Zugriff aus Zahlungsstatus

Joomla-Gruppen dürfen nur auf Basis eines konsistenten Subscription-Zustands gesetzt oder entfernt werden.

Changes

Tarifwechsel

Sofortige und vorgemerkte Wechsel brauchen unterschiedliche Behandlung von Proration und Laufzeit.

Recovery

Fehlerfälle

Fehlgeschlagene Event-Verarbeitung muss später gezielt wieder aufgenommen werden können.

Architektur

Die technische Struktur

Stripe

Stripe bleibt die Quelle für Checkout, Zahlung und Subscription-Lifecycle.

Inbox

Webhook Events werden zunächst gespeichert und erst danach kontrolliert verarbeitet.

Sync

Eine Access Engine übersetzt den gültigen Abo-Zustand in Joomla-Gruppen und Zugriffsrechte.

Reconciliation

Regelmäßige Vergleiche erkennen Abweichungen zwischen Stripe und Joomla und erlauben Safe Repair.

Entwicklung

Wichtige Meilensteine

Checkout
Checkout & Rückkehr

Abschluss, Abbruch und Rückkehrtexte wurden für reale Benutzerflüsse umgesetzt.

Lifecycle
Kündigung & Reaktivierung

Vorgemerkte Kündigungen und Rücknahmen wurden in den laufenden Abo-Zustand integriert.

Plan Change
Tarifwechsel

Sofortige und vorgemerkte Wechsel inklusive optionaler Proration wurden ergänzt.

Payment
Zahlungsmethode & 3D Secure

Zahlungsmethoden und zusätzliche Authentifizierung wurden praktisch getestet.

Recovery
Webhook Recovery

Fehlgeschlagene invoice.paid-Verarbeitung konnte nach Fehlerbehebung gezielt erneut ausgeführt werden.

RC
Release Candidate

Mehrere RC-Gates wurden mit Scheduler-, Sync- und Recovery-Tests abgesichert.

Probleme & Lösungen

Was technisch besonders interessant war

Doppelte Aktionen

Doppelklicks oder wiederholte Requests dürfen keine doppelten Checkouts oder widersprüchlichen Zustände erzeugen. Idempotenz und Konfliktantworten wurden deshalb explizit berücksichtigt.

Webhook-Reihenfolge

Ein Browser-Redirect ist kein verlässlicher Beleg für Zahlungsstatus. Der gültige Zustand wird aus Stripe-Events und serverseitigem Sync abgeleitet.

Gruppenabweichungen

Reconciliation zeigte, dass Membership-Zustand und Joomla-Gruppen aktiv verglichen werden müssen. Safe Repair kann erkannte Abweichungen kontrolliert korrigieren.

Abnahme

Tests und belastbare Nachweise

Checkout

Abbruch, Erfolg, 3D Secure und Doppelklick-/409-Sonderfälle wurden praktisch durchgespielt.

Sync

Mehrere Mitglieder und Abos wurden zwischen Stripe und Joomla synchronisiert und Gruppenrechte geprüft.

Scheduler

Scheduled Tasks und Recovery-Pfade wurden wiederholt ausgeführt, um asynchrone Abläufe abzusichern.

Ergebnis

Aus Checkout wurde ein vollständiger Membership-Lifecycle

JoomSubs wurde von einer einfachen Checkout-Integration zu einem Membership-Lifecycle-System weiterentwickelt. Der wichtigste Architekturpunkt ist die Trennung zwischen Stripe als Zahlungsquelle, Webhook-Inbox als nachvollziehbare Ereignisschicht und Joomla-Gruppen als tatsächliche Access Engine.

Nächster Schritt

Sie benötigen Stripe-Mitgliedschaften mit Joomla-Zugriffsrechten?

Die JoomSubs-Architektur ist besonders relevant, wenn Zahlungsstatus, Gruppenrechte und asynchrone Events zuverlässig zusammengeführt werden müssen.