Verbesserungen am Subscriptions Plugin

Hallo, ich habe die folgenden Änderungen an diesem Plugin vorgenommen und wollte wissen, ob das Discourse-Team offen für einen PR ist.

Ich würde mich auch freuen, wenn andere umfangreiche Tests durchführen könnten. Ich teste gerade die Abläufe mit den für mich kritischsten Szenarien.


Das ursprüngliche Plugin ist eine ausgezeichnete Grundlage, konzentriert sich aber hauptsächlich auf wiederkehrende Abonnements über Stripe. Folgende Änderungen wurden vorgenommen:

Zusammenfassung der neuen Funktionen & Verbesserungen

1. Multi-Provider-Zahlungssystem (mit Razorpay) Das Plugin ist nicht mehr fest auf Stripe codiert. Es verwendet jetzt eine anbieterbasierte Architektur, die mehrere Zahlungs-Gateways ermöglicht.

  • Razorpay-Integration: Razorpay wurde als zweiter Zahlungsanbieter vollständig integriert. Dies ist entscheidend für Communities in Märkten wie Indien, wo Razorpay ein bevorzugtes Gateway ist.
  • Sichere Webhooks: Die Razorpay-Integration ist robust und umfasst einen sicheren Webhook-Handler zur Bestätigung von Zahlungen von Server zu Server, um sicherzustellen, dass keine Abonnements verpasst werden, wenn ein Benutzer den Browser nach der Zahlung schließt.

2. Einmalige, zeitlich begrenzte Abonnements Dies führt einen neuen, flexiblen Produkttyp über Standard-Abonnements hinaus ein.

  • Ablaufender Zugriff: Administratoren können jetzt Einmalzahlungspläne erstellen, die für eine bestimmte Dauer Gruppenmitgliedschaft gewähren (z. B. ein 7-Tage-Event-Pass, eine 30-Tage-Testversion oder ein 90-Tage-Paket).
  • Automatischer Ablauf: Ein täglicher Hintergrundjob läuft automatisch, um abgelaufene Abonnements zu überprüfen und Benutzer aus den entsprechenden Gruppen zu entfernen, wodurch die Zugriffskontrolle vollständig automatisiert wird.

3. Komplette Überarbeitung der Preisseite Die standardmäßige Benutzeroberfläche für Abonnements wurde komplett überarbeitet, um Konversionen und Benutzererfahrung zu verbessern.

  • Modernes kartenbasiertes UI: Die alte Produktliste wird durch ein sauberes, reaktionsschnelles, kartenbasiertes Layout ersetzt, das leichter zu lesen und zu vergleichen ist.
  • Theme-kompatibel: Das neue Design verwendet die Theme-Variablen von Discourse und ist vollständig kompatibel mit hellen und dunklen Modi.
  • Einseitiger Checkout: Der gesamte Checkout-Prozess findet jetzt auf der Preisseite statt. Durch Klicken auf “Abonnieren” wird direkt auf der Seite ein Zahlungsformular angezeigt, wodurch ein redundanter Schritt entfällt und die Benutzerfreundlichkeit verbessert wird.

4. Erweiterte Upselling- & Wertanzeige-Logik Die neuen Preiskarten sind als leistungsstarke Upselling-Tools konzipiert.

  • Effektive monatliche Kosten: Die Benutzeroberfläche berechnet und zeigt automatisch die effektiven “Kosten pro Monat” für alle Planarten (einschließlich 3-Monats- oder Jahres-Einmalpläne) an, sodass Benutzer den Wert verschiedener Optionen leicht vergleichen können.
  • Explizite Einsparungen: Ein “Sparen Sie ₹X”-Badge wird automatisch für längerfristige Pläne angezeigt, wodurch der Vorteil der Wahl eines höherwertigen Plans gegenüber dem Basisplan klar kommuniziert wird.

5. Einheitliche Admin- & Benutzer-Dashboards Sowohl die Admin- als auch die Benutzer-Abrechnungsseiten wurden überarbeitet, um einfacher und leistungsfähiger zu sein.

  • Eine einheitliche Ansicht: Anstelle separater Listen für verschiedene Zahlungsarten gibt es jetzt eine einzige Tabelle, die alle Abonnements von allen Anbietern (Stripe, Razorpay, Manuell) anzeigt.
  • Klare Informationen: Diese Ansichten zeigen klar den Anbieter, den Status, das Ablauf-/Erneuerungsdatum und den Betrag für jede Transaktion an, wodurch sowohl Administratoren als auch Benutzern eine vollständige Historie ihrer Berechtigungen zur Verfügung steht.

6. Manuelle Abonnementverwaltung für Administratoren Eine neue Reihe von Tools wurde hinzugefügt, um Administratoren mehr Kontrolle zu geben.

  • Abonnement gewähren: Administratoren können jetzt jedem Benutzer manuell jeden Abonnementplan für einen bestimmten Zeitraum gewähren. Dies ist perfekt für die Bearbeitung von Offline-Zahlungen, die Bereitstellung von kostenlosem Zugang oder die Korrektur von Fehlern.
  • Zugriff widerrufen: Der Zugriff auf nicht wiederkehrende Pläne kann sofort über das Admin-Dashboard widerrufen werden.

7. Kritische Fehlerbehebung für die Gruppenverwaltung

  • Ein schwerwiegender Fehler in der ursprünglichen Logik zur Gruppenentfernung wurde behoben. Wenn ein Abonnement gekündigt oder widerrufen wird, führt das System jetzt eine “Sicherheitsprüfung” durch, um festzustellen, ob der Benutzer noch andere aktive Abonnements für dieselbe Gruppe hat. Der Benutzer wird nur dann aus der Gruppe entfernt, wenn er keine andere gültige Möglichkeit hat, darauf zuzugreifen, wodurch verhindert wird, dass Benutzer fälschlicherweise entfernt werden.
5 „Gefällt mir“

Können Sie einen Link zu Ihrem GitHub-Repository einfügen?

1 „Gefällt mir“

Ja, ja, natürlich… gib mir einfach einen Tag. Bügeln einiger Fehler im Zusammenhang mit der Handhabung von Altdaten von Stripe, wenn wir zu dieser Plugin-Version mit neuen Feldern wechseln.

Habe den ersten Beitrag mit dem Repository aktualisiert.

Einrichtungs- und Konfigurationsanleitung

Diese Anleitung führt Sie durch die Einrichtung der notwendigen Zahlungsanbieter und die Erstellung Ihrer ersten Produkte und Pläne.

1. Einrichtung des Anbieters

Navigieren Sie zunächst zu Admin > Einstellungen > Plugins und wählen Sie Ihren primären Zahlungsanbieter in der Einstellung discourse_subscriptions_payment_provider aus. Befolgen Sie dann die Anweisungen für Ihren ausgewählten Anbieter unten.

A) Konfiguration von Stripe

Wenn Sie Stripe als Ihren Anbieter gewählt haben:

  1. API-Schlüssel eingeben: Geben Sie in Ihren Discourse-Einstellungen Ihre Stripe-API-Schlüssel ein:
    • discourse_subscriptions_public_key (Ihr Stripe veröffentlichbarer Schlüssel)
    • discourse_subscriptions_secret_key (Ihr Stripe geheimer Schlüssel)
  2. Webhook einrichten: Dieser Schritt ist entscheidend für die Verfolgung wiederkehrender Zahlungen, Kündigungen und anderer Abonnementereignisse.
    • Navigieren Sie in Ihrem Stripe Dashboard zu Entwickler > Webhooks.
    • Klicken Sie auf „Endpunkt hinzufügen“.
    • Geben Sie für die Endpunkt-URL ein: https://your-discourse-url.com/s/hooks
    • Klicken Sie auf „Ereignisse auswählen“ und fügen Sie die folgenden drei Ereignisse hinzu:
      • checkout.session.completed
      • customer.subscription.deleted
      • customer.subscription.updated
    • Klicken Sie auf „Endpunkt hinzufügen“.
    • Finden Sie auf der nächsten Seite das geheime Signaturschlüssel (es beginnt mit whsec_...).
    • Kopieren Sie diesen geheimen Schlüssel und fügen Sie ihn in die Einstellung discourse_subscriptions_webhook_secret in Discourse ein.
B) Konfiguration von Razorpay

Wenn Sie Razorpay als Ihren Anbieter gewählt haben:

  1. API-Schlüssel eingeben:
    • Gehen Sie in Ihrem Razorpay Dashboard zu Einstellungen > API-Schlüssel, um ein neues Schlüsselpaar zu generieren.
    • Kopieren Sie Ihre Schlüssel und fügen Sie sie in die entsprechenden Discourse-Einstellungen ein:
      • discourse_subscriptions_razorpay_key_id
      • discourse_subscriptions_razorpay_key_secret
  2. Webhook einrichten: Dieser Schritt ist entscheidend, um zu bestätigen, dass eine Zahlung erfolgreich erfasst wurde.
    • Gehen Sie in Ihrem Razorpay Dashboard zu Einstellungen > Webhooks.
    • Klicken Sie auf „+ Neuen Webhook hinzufügen“.
    • Geben Sie für die Webhook-URL ein: https://your-discourse-url.com/s/hooks/razorpay
    • Erstellen Sie ein geheimes Schlüssel und bewahren Sie es für den nächsten Schritt sicher auf.
    • Wählen Sie unter Aktive Ereignisse nur payment.captured aus.
    • Klicken Sie auf „Webhook erstellen“.
    • Kopieren Sie den gerade erstellten geheimen Schlüssel und fügen Sie ihn in die Einstellung discourse_subscriptions_razorpay_webhook_secret in Discourse ein.

2. Erstellen von Produkten und Plänen

Navigieren Sie zu Admin > Plugins > Abonnements, um Ihre Produkte und Pläne zu verwalten.

Produkt erstellen
  1. Gehen Sie zur Registerkarte Produkte.
  2. Klicken Sie auf „Neues Produkt erstellen“.
  3. Füllen Sie die Details aus. Das Feld „Beschreibung“ unterstützt Markdown und wird den Benutzern auf der neuen Preisgestaltungsseite angezeigt.
Pläne für das Produkt erstellen
  1. Klicken Sie nach der Erstellung eines Produkts auf das Bearbeitungssymbol (✎) daneben.
  2. Klicken Sie im Abschnitt „Preispläne“ auf „Neuen Plan hinzufügen“.
  3. Sie können zwei Arten von Plänen erstellen:
  • Um einen wiederkehrenden Plan zu erstellen (z. B. monatlich/jährlich):
    • Aktivieren Sie das Kontrollkästchen „Wiederkehrender Plan?“.
    • Legen Sie den Betrag und das Abrechnungsintervall (Monat, Jahr usw.) fest.
    • Weisen Sie ihn einer Benutzergruppe zu.
  • Um einen einmaligen, zeitlich begrenzten Plan zu erstellen (z. B. 30-Tage-Pass):
    • Lassen Sie das Kontrollkästchen „Wiederkehrender Plan?“ deaktiviert.
    • Legen Sie den Betrag fest.
    • Ein neues Feld, „Dauer (in Tagen)“, wird angezeigt. Geben Sie die Anzahl der Tage ein, an denen der Benutzer Zugriff haben soll (z. B. 30).
    • Weisen Sie ihn einer Benutzergruppe zu.

3. Neue administrative Werkzeuge

Diese Version enthält neue Werkzeuge zur manuellen Verwaltung von Abonnements.

  • Abonnement gewähren:
    • Klicken Sie auf der Hauptseite Admin > Plugins > Abonnements auf die Schaltfläche „Abonnement gewähren“.
    • Wählen Sie im erscheinenden Modal einen Benutzernamen und einen Plan aus.
    • Wenn der gewählte Plan ein Einmalplan ist, können Sie eine Dauer in Tagen angeben. Wenn Sie dies leer lassen, erhält der Benutzer dauerhaften Zugriff auf die zugehörige Gruppe.
  • Abonnement widerrufen:
    • Navigieren Sie im Admin-Bereich zur Registerkarte Abonnements.
    • Jedes nicht wiederkehrende Abonnement (d. h. manuell oder Razorpay) verfügt über eine Schaltfläche „Zugriff widerrufen“.
    • Ein Klick darauf entfernt den Benutzer sofort aus der zugehörigen Gruppe und beendet seinen Zugriff.
3 „Gefällt mir“

Habe das Repository mit den folgenden Änderungen/Korrekturen aktualisiert. Ich bin jetzt bereit, es auf meiner Produktionsseite zu installieren und zu verwenden.

Zusammenfassung der Verbesserungen in Bezug auf Stabilität und Sicherheit

1. Moderne Stripe Checkout-Integration Das Plugin wurde aktualisiert, um den modernen, auf Weiterleitungen basierenden Stripe Checkout-Flow zu verwenden.

  • Was das bedeutet: Anstelle eines Kreditkartenformulars auf der Seite werden Benutzer nun zu einer sicheren, von Stripe gehosteten Seite weitergeleitet, um ihre Zahlung abzuschließen.
  • Warum es besser ist: Dies ist der empfohlene Ansatz von Stripe. Es verbessert die Sicherheit, reduziert die PCI-Compliance-Belastung Ihrer Website und bietet eine bessere Benutzererfahrung mit Unterstützung für Methoden wie Apple Pay und Google Pay.

2. Felsenfeste Wiederholungskauf-Logik Die Logik, die verhindert, dass Benutzer ein Produkt erneut kaufen, für das sie bereits ein aktives Abonnement haben, wurde komplett überarbeitet.

  • Die Korrektur: Wir haben die product_id zu jedem lokalen Abonnementdatensatz hinzugefügt. Die Prüfung ist jetzt eine einfache, blitzschnelle Abfrage Ihrer lokalen Datenbank mit null externen API-Aufrufen, was sie zu 100 % zuverlässig macht.
  • Das Ergebnis: Ein Benutzer mit einem aktiven Abonnement (wiederkehrend oder zeitlich begrenzt) wird nun korrekt daran gehindert, dasselbe Produkt erneut zu kaufen, bis es abläuft.

3. Datenintegrität auf allen Dashboards Die Benutzerabrechnungsseite und das Admin-Abonnement-Dashboard wurden korrigiert, um sicherzustellen, dass sie immer genaue Echtzeitdaten anzeigen.

  • Die Korrektur: Beide Seiten rufen nun den neuesten Status und die Erneuerungs-/Ablaufdaten für jedes Abonnement direkt vom Zahlungsanbieter (Stripe) ab.
  • Das Ergebnis: Was Sie im Admin-Panel sehen, stimmt immer perfekt mit dem überein, was der Benutzer sieht, und beide spiegeln den wahren Zustand des Abonnements in Stripe wider. Die Fehler, die “N/A” für PlanDetails oder falsche “aktive” Status anzeigen, sind behoben.

4. Robuste Webhook- & Job-Verarbeitung

  • Keine doppelten Abonnements mehr: Die Webhook-Handler wurde korrigiert, um die Reihenfolge der Ereignisse von Stripe korrekt zu verarbeiten und sicherzustellen, dass eine Transaktion genau einen Abonnementdatensatz erstellt.
  • Zuverlässiger Ablauf-Job: Der tägliche Hintergrundjob, der einmalige Pläne ablaufen lässt, wurde gehärtet. Er setzt nun korrekt den erforderlichen API-Schlüssel und lässt ein Abonnement ablaufen, auch wenn der ursprüngliche Plan aus Stripe gelöscht wurde, um sicherzustellen, dass Ihre Gruppenberechtigungen immer korrekt sind.
2 „Gefällt mir“

Wow, danke, dass Sie all diese Änderungen vorgenommen haben!

So wie es ist, können wir jedoch keine wirklich großen Änderungen auf einmal zusammenführen. Wenn Sie diese in das discourse-subscriptions-Plugin integrieren möchten, müssen Sie jede Änderung einzeln aufschlüsseln und separate PRs mit Tests erstellen. Bitte stellen Sie außerdem sicher, dass es keine abwärtskompatiblen Änderungen für bestehende Benutzer gibt, die derzeit das Abonnement-Plugin verwenden und bereits viele Abonnenten haben.

6 „Gefällt mir“

Sicher, danke. Werde mir Zeit nehmen und mehrere PRs erstellen, nachdem die Spezifikationen ausgearbeitet wurden.

6 „Gefällt mir“