Kaufmodelle & Tickets & Abo
Flexible Preismodelle, Abo-Verwaltung und Support-Tickets in einem Plugin
Überblick
Das Plugin "Bronn Kaufmodelle, Tickets & Abo-Verwaltung" erweitert Shopware 6 um drei zentrale Funktionsbereiche: flexible Kaufmodelle (Einmalkauf, Monatsabo, Jahresabo), ein integriertes Support-Ticket-System im Kundenkonto und eine vollständige Abo-Verwaltung mit automatischer Verlängerung über Stripe.
Shop-Betreiber können für jedes Produkt individuelle Preismodelle definieren. Kunden wählen auf der Produktdetailseite zwischen Einmalkauf und Abo. Abonnements werden automatisch verlängert, die Zahlung läuft über Stripe Subscriptions mit Smart Retry und Dunning. Das Ticket-System ermöglicht Kunden, produktbezogene Support-Anfragen direkt im Kundenkonto zu erstellen und zu verfolgen.
Systemvoraussetzungen
Installation
custom/plugins/BronnProductLicensing ablegencomposer require stripe/stripe-php:"^16.0"php bin/console cache:clearDeinstallation: Bei der Deinstallation werden die Plugin-Tabellen bronn_ticket_message, bronn_ticket, bronn_subscription und bronn_pricing_model sauber entfernt.
Das Plugin enthaelt vorkompiliertes Admin-JS und funktioniert ohne build-administration.sh – eine reine Installation ueber den Shopware Plugin-Manager im Admin ist ausreichend.
Konfiguration
Die Plugin-Konfiguration befindet sich unter Einstellungen > Erweiterungen > Kaufmodelle, Tickets & Abos (config.xml).
Allgemeine Einstellungen:
Stripe (Wiederkehrende Zahlungen):
Abo-Erinnerungen (Stripe-Setup):
Kaufmodelle:
Ticket-System:
Anzeige:
Stripe-Integration einrichten
Schritt 1: Stripe-Account
sk_test_...) verwenden, für Produktion den Live-Key (sk_live_...)Schritt 2: Plugin-Konfiguration
Schritt 3: Webhook einrichten
https://DEIN-SHOP.de/api/bronn-product-licensing/stripe-webhookinvoice.paid, invoice.payment_failed, customer.subscription.updated, customer.subscription.deletedwhsec_...) kopierenSchritt 4: Testen
4242 4242 4242 4242 verwendenZahlungsablauf:
Erinnerungsablauf bei fehlendem Stripe-Setup:
Stripe-Testdaten:
| Feld | Testwert |
|---|---|
| Kartennummer (Erfolg) | 4242 4242 4242 4242 |
| Kartennummer (3DS) | 4000 0025 0000 3155 |
| Kartennummer (Abgelehnt) | 4000 0000 0000 0002 |
| SEPA-IBAN (Test) | DE89 3704 0044 0532 0130 00 |
| Ablaufdatum | Beliebig in der Zukunft (z.B. 12/30) |
| CVC | Beliebig (z.B. 123) |
Funktionen
Kaufmodelle (Pricing Models)
Kaufmodelle (bronn_pricing_model) definieren drei Preisoptionen pro Produkt: Einmalkauf, Monatsabo und Jahresabo. Jede Option kann individuell aktiviert, bepreist und beschriftet werden. Die Auswahl erfolgt über Radio-Buttons auf der Produktdetailseite. Der PricingModelCartProcessor (Priorität 4500) passt den Warenkorbpreis je nach gewähltem Modell an.
Support-Ticket-System
Das Ticket-System ermöglicht Kunden, produktbezogene Support-Anfragen im Kundenkonto zu erstellen. Tickets (bronn_support_ticket) haben einen Status-Workflow (Offen > In Bearbeitung > Wartend > Gelöst > Geschlossen) und Prioritäten (Niedrig, Normal, Hoch). Ticket-Nachrichten (bronn_support_ticket_message) bilden den Kommunikationsverlauf zwischen Kunde und Support.
Abo-Verwaltung
Abonnements (bronn_subscription) werden automatisch bei Bestellungen mit Monats- oder Jahresmodell erstellt. Kunden verwalten ihre Abos im Storefront unter "Meine Abos" -- inklusive Kündigung und Zahlungsmethoden-Setup. Der ScheduledTask verarbeitet fällige Verlängerungen, Erinnerungen und automatische Deaktivierungen.
Stripe Subscriptions
Stripe übernimmt den kompletten Billing-Zyklus für Abo-Verlängerungen. Das Plugin erstellt Stripe Products, Prices und Subscriptions über die Stripe API. Die Webhook-Integration verarbeitet invoice.paid (Bestellerstellung + Bezahlt-Status), invoice.payment_failed (Status-Update) und customer.subscription.deleted (Abo-Deaktivierung). Stripes Smart Retry und Dunning ersetzen eigene Retry-Logik.
Events & Hooks
Das Plugin löst folgende Flow-Builder-fähige Events aus (alle implementieren FlowEventAware, MailAware, CustomerAware):
Flow Builder Events:
Alle sechs Plugin-Events sind im Shopware Flow Builder verfügbar und können für automatische Workflows genutzt werden.
Verfügbare Variablen in allen Events:
| Variable | Typ | Beschreibung |
|---|---|---|
| customer | CustomerEntity | Der zugehörige Kunde |
| subscription | SubscriptionEntity | Das betroffene Abonnement |
| productName | string | Name des Abo-Produkts |
| pricingTypeLabel | string | "monatlich" oder "jaehrlich" |
| reminderNumber | int | Nummer der Erinnerung (1, 2 oder 3) |
| isFinalWarning | bool | Letzte Erinnerung vor Deaktivierung |
| errorMessage | string | Fehlermeldung (bei payment_failed) |
Alle Events stellen ShopwareSalesChannelEvent-Daten bereit und können mit Mail-Aktionen, Webhooks oder eigenen Flow-Actions kombiniert werden.
FlowEventSubscriber: Der FlowEventSubscriber registriert alle 6 Events im Shopware Flow Builder. Bei Install und Update werden automatisch 6 Flows mit den zugehoerigen Mail-Aktionen angelegt: Bronn Abo: Abonnement erstellt, Bronn Abo: Abonnement verlaengert, Bronn Abo: Zahlung fehlgeschlagen, Bronn Abo: Abonnement deaktiviert, Bronn Abo: Abonnement gekuendigt, Bronn Abo: Erinnerung Zahlungsmethode.
Mail-Templates
Das Plugin registriert 6 Mail-Templates (DE + EN), die im Admin unter Einstellungen > E-Mail-Templates editierbar sind:
| Template | Technischer Name | Beschreibung |
|---|---|---|
| Bronn Abo: Abonnement erstellt | bronn_subscription_created | Bestätigung bei Abo-Erstellung |
| Bronn Abo: Abonnement verlängert | bronn_subscription_renewed | Bestätigung bei erfolgreicher Verlängerung |
| Bronn Abo: Zahlung fehlgeschlagen | bronn_subscription_payment_failed | Hinweis bei fehlgeschlagener Stripe-Zahlung |
| Bronn Abo: Erinnerung Zahlungsmethode | bronn_subscription_stripe_setup_reminder | Erinnerung zur Einrichtung der automatischen Zahlung |
| Bronn Abo: Abonnement deaktiviert | bronn_subscription_expired | Benachrichtigung bei Abo-Deaktivierung |
| Bronn Abo: Abonnement gekündigt | bronn_subscription_cancelled | Bestätigung bei Kündigung |
Textbausteine (Snippets)
Das Plugin registriert Storefront-Snippets unter dem Namespace bronn-product-licensing in DE und EN:
Storefront-Snippets (src/Resources/snippet/de_DE/bronn-product-licensing.de-DE.json):
Admin-Snippets (src/Resources/app/administration/src/module/bronn-product-licensing/snippet/de-DE.json, en-GB.json):
Scheduled Tasks
- Verlängert fällige Abos ohne Stripe-Subscription (erstellt neue Bestellung)
- Abos mit Stripe-Subscription werden übersprungen (Stripe handelt das Billing)
- Sendet Erinnerungsmails 7 Tage vor Verlängerung
- Sendet Stripe-Setup-Erinnerungen (nach konfigurierten Tagen)
- Deaktiviert Abos ohne Stripe-Setup nach konfigurierter Frist
Manuell testen:
# Abo auf gestern setzen
ssh kibronnerconsulting@develop-bronner-consulting.info \
"cd /var/www/vhosts/develop-bronner-consulting.store/httpdocs && \
php bin/console dbal:run-sql \"UPDATE bronn_subscription SET next_renewal_date = DATE_SUB(NOW(), INTERVAL 1 DAY) WHERE status = 'active' LIMIT 1\""
# Task manuell ausführen
ssh kibronnerconsulting@develop-bronner-consulting.info \
"cd /var/www/vhosts/develop-bronner-consulting.store/httpdocs && \
php bin/console scheduled-task:run-single bronn_product_licensing.subscription_renewal 2>&1"Datenbank-Tabellen
Das Plugin erstellt folgende Datenbank-Tabellen über 7 Migrationen:
| Tabelle | Entity-Name | Beschreibung |
|---|---|---|
| bronn_pricing_model | bronn_pricing_model | Kaufmodelle pro Produkt (Kauf/Monatlich/Jährlich) |
| bronn_support_ticket | bronn_support_ticket | Support-Tickets mit Status und Priorität |
| bronn_support_ticket_message | bronn_support_ticket_message | Ticket-Nachrichten (Kunde <> Admin) |
| bronn_subscription | bronn_subscription | Abonnements mit Stripe-Integration |
bronn_subscription Felder:
| Feld | Typ | Beschreibung |
|---|---|---|
| id | BINARY(16) | Primärschlüssel |
| customer_id | BINARY(16) | FK > customer |
| product_id | BINARY(16) | FK > product |
| order_id | BINARY(16) | FK > order (Original-Bestellung) |
| pricing_type | VARCHAR(50) | "monthly" oder "yearly" |
| price | DOUBLE | Abo-Preis |
| status | VARCHAR(50) | "active", "cancelled", "expired" |
| next_renewal_date | DATETIME(3) | Nächstes Verlängerungsdatum |
| cancelled_at | DATETIME(3) | Kündigungszeitpunkt |
| reminder_sent_at | DATETIME(3) | Erinnerung gesendet am |
| stripe_customer_id | VARCHAR(255) | Stripe Customer ID (cus_xxx) |
| stripe_payment_method_id | VARCHAR(255) | Stripe PaymentMethod ID (pm_xxx) |
| stripe_subscription_id | VARCHAR(255) | Stripe Subscription ID (sub_xxx) |
| stripe_payment_status | VARCHAR(50) | pending, succeeded, failed, requires_action |
| stripe_last_error | TEXT | Letzte Stripe-Fehlermeldung |
| payment_retry_count | INT | Anzahl Erinnerungen / Zahlungsversuche |
Migrationen:
Admin-Integration
Das Plugin registriert ein eigenes Admin-Modul bronn-product-licensing mit folgenden Menüpunkten:
Navigation:
Seiten:
Abo-Detail Zahlungsinformationen:
Die Abo-Detailseite zeigt eine Card "Zahlungsinformationen (Stripe)" mit:
Storefront-Integration
Das Plugin erweitert den Account-Bereich und den Checkout im Storefront:
Account-Seiten (src/Resources/views/storefront/page/account/):
Checkout-Erweiterungen:
Produktdetailseite:
Warenkorb:
Storefront-Routen:
| Route | Methode | Beschreibung |
|---|---|---|
| /account/subscriptions | GET | Abo-Übersicht |
| /account/subscriptions/{id}/cancel | POST | Abo kündigen (inkl. Stripe) |
| /account/subscriptions/{id}/setup-payment | POST | Stripe Checkout Session starten |
| /account/subscriptions/{id}/stripe-callback | GET | Stripe Callback nach Setup |
| /account/support-tickets | GET | Ticket-Liste |
| /account/support-tickets/create | GET/POST | Neues Ticket |
| /account/support-tickets/{id} | GET | Ticket-Detail |
| /account/support-tickets/{id}/reply | POST | Ticket-Antwort |
API-Routen:
| Route | Methode | Beschreibung |
|---|---|---|
| /api/_action/bronn-product-licensing/simulate-renewal/{id} | POST | Abo-Verlängerung simulieren (Auth erforderlich) |
| /api/bronn-product-licensing/stripe-webhook | POST | Stripe Webhook-Endpunkt (Signatur-Verifizierung) |
Kompatibilität
Aktuelle Version: 1.9.9