Stripe Integration Setup
Diese Anleitung erklärt, wie du die Stripe-Integration der School-SaaS Webapp (webapp/) einrichtest.
1. Stripe Account einrichten
- Erstelle einen Account auf stripe.com
- Wechsle zum Dashboard
- Stelle sicher, dass du im Testmodus bist (Toggle oben rechts)
2. API Keys generieren
- Gehe zu Developers > API keys im Stripe Dashboard
- Kopiere den Publishable key (beginnt mit
pk_test_) - Kopiere den Secret key (beginnt mit
sk_test_)
3. Webhook einrichten
Für Vercel Deployment:
-
Gehe zu Developers > Webhooks im Stripe Dashboard
-
Klicke auf Add endpoint
-
Setze die Endpoint URL auf:
https://deine-vercel-domain.vercel.app/api/stripe/webhook -
Wähle folgende Events aus. Diese Liste entspricht exakt dem
relevantEvents-Set inapp/api/stripe/webhook/route.ts— andere Events werden vom Handler ignoriert:checkout.session.completedcustomer.subscription.createdcustomer.subscription.updatedcustomer.subscription.deletedcustomer.subscription.trial_will_endinvoice.payment_succeededinvoice.payment_failed
Die Events
customer.subscription.pausedundcustomer.subscription.resumedwerden nicht verarbeitet und müssen nicht abonniert werden. -
Klicke auf Add endpoint
-
Kopiere den Webhook signing secret (beginnt mit
whsec_)
Für lokale Entwicklung:
- Installiere die Stripe CLI: stripe.com/docs/stripe-cli
- Einmalig authentifizieren (bei Ablauf der Session wiederholen):
stripe login - Starte den Webhook-Listener:
stripe listen --forward-to localhost:3000/api/stripe/webhook - Verwende den generierten Webhook Secret für lokale Tests
Die Stripe CLI verwendet eine eigene OAuth-Session, die unabhängig vom API-Key abläuft. Wenn stripe listen mit api_key_expired (401) fehlschlägt, einfach stripe login erneut ausführen.
4. Environment Variables konfigurieren
Für Vercel Deployment:
- Gehe zu deinem Vercel Dashboard
- Wähle dein Projekt → Settings → Environment Variables
- Füge folgende Variablen hinzu:
# Stripe API Keys
Name: STRIPE_SECRET_KEY
Value: sk_test_dein_secret_key_hier
Environment: Production, Preview, Development
Name: NEXT_PUBLIC_STRIPE_PUBLISHABLE_KEY
Value: pk_test_dein_publishable_key_hier
Environment: Production, Preview, Development
# Stripe Webhook
Name: STRIPE_WEBHOOK_SECRET
Value: whsec_dein_webhook_secret_hier
Environment: Production, Preview, Development
# Trial-Preis-ID (Schreibweise "PROCUCT" beachten — so im Code verwendet)
Name: NEXT_PUBLIC_STRIPE_TRIAL_PROCUCT_PRICE_ID
Value: price_dein_trial_price_id_hier
Environment: Production, Preview, Development
Hinweis: Eine Variable
STRIPE_PROFESSIONAL_PRICE_IDwird im Code nicht gelesen. Die einzige im Code referenzierte Preis-ID-Variable istNEXT_PUBLIC_STRIPE_TRIAL_PROCUCT_PRICE_ID(siehegetStripeTrialProductPriceId()inlib/environment-handling.ts). Alle übrigen Produkte/Preise werden zur Laufzeit live aus der Stripe-API geladen (GET /api/stripe/get-all-products).
Für lokale Entwicklung (.env):
Lokal lädt die App .env im Verzeichnis webapp/:
# Stripe API Keys
STRIPE_SECRET_KEY=sk_test_...
NEXT_PUBLIC_STRIPE_PUBLISHABLE_KEY=pk_test_...
STRIPE_WEBHOOK_SECRET=whsec_...
# Trial-Preis-ID (einzige im Code gelesene Preis-ID-Variable)
NEXT_PUBLIC_STRIPE_TRIAL_PROCUCT_PRICE_ID=price_...
5. Produkte und Preise erstellen
- Gehe zu Products im Stripe Dashboard
- Erstelle ein Produkt:
- Professional (€19.99/Monat) - für den 14-Tage Trial
- Für das Produkt:
- Erstelle einen Recurring price mit monatlicher Abrechnung
- Kopiere die Price ID (beginnt mit
price_)
6. Produkte im Dashboard pflegen
Produkte und Preise werden direkt aus Stripe geladen — es gibt keine hardcodierten Price IDs im Code. Der Endpoint GET /api/stripe/get-all-products ruft alle aktiven Produkte und Preise live ab, die PricingCards-Komponente rendert sie automatisch.
Damit ein Produkt korrekt dargestellt wird, müssen im Stripe Dashboard unter Metadata folgende Felder gesetzt sein:
| Key | Beispielwert | Bedeutung |
|---|---|---|
order | 1, 2, 3 | Sortierreihenfolge der Karten |
popular | true | Hebt das Produkt als „Am beliebtesten" hervor |
features | Unbegrenzt Schüler, Alle Features | Kommagetrennte Feature-Liste |
Der Trial-Plan wird separat über die Umgebungsvariable NEXT_PUBLIC_STRIPE_TRIAL_PROCUCT_PRICE_ID konfiguriert (siehe Abschnitt 4).
7. Testen
Für Vercel:
- Deploye deine App auf Vercel
- Gehe zu
/pricingum die Pricing-Seite zu testen - Teste den Registrierungsprozess mit Kreditkartendaten
- Verwende die Stripe Test-Kartennummern:
- Erfolgreiche Zahlung:
4242 4242 4242 4242 - Fehlgeschlagene Zahlung:
4000 0000 0000 0002
- Erfolgreiche Zahlung:
Für lokale Entwicklung:
- Starte deine Entwicklungsumgebung:
pnpm dev - Starte Stripe CLI:
stripe listen --forward-to localhost:3000/api/stripe/webhook - Gehe zu
/pricingum die Pricing-Seite zu testen - Teste den Registrierungsprozess
8. Webhook Events testen
Von Stripe Dashboard:
- Gehe zu Developers > Webhooks im Stripe Dashboard
- Klicke auf deinen Webhook
- Klicke auf "Send test webhook"
- Wähle ein Event aus (z.B.
customer.subscription.created) - Klicke auf "Send test webhook"
Mit Stripe CLI (lokal):
# Test-Event senden
stripe trigger customer.subscription.created
9. Produktionsumgebung
Für die Produktion:
- Wechsle zu Live mode im Stripe Dashboard
- Generiere neue Live API Keys
- Aktualisiere die Umgebungsvariablen in Vercel
- Stelle sicher, dass dein Webhook auf die Live-URL zeigt
- Teste alle Webhook-Events gründlich
Wichtige Hinweise
- Niemals deine Stripe Secret Keys im Frontend-Code verwenden
- Verwende immer HTTPS in der Produktion
- Für Vercel: Environment Variables müssen im Vercel Dashboard gesetzt werden
- Für lokale Tests: Verwende
.env(inwebapp/) und die Stripe CLI - Teste alle Webhook-Events gründlich
- Implementiere proper error handling für alle Stripe-API-Aufrufe
- Überwache deine Stripe-Logs für fehlgeschlagene Webhooks
- Subscription-Daten werden in der
subscriptions-Tabelle gespeichert (nicht amUser-Modell) — siehe Subscription-Datenmodell
Troubleshooting
Webhook funktioniert nicht:
- Überprüfe die Webhook-URL in Stripe
- Stelle sicher, dass alle Environment Variables in Vercel gesetzt sind
- Überprüfe die Vercel Function Logs
- Teste mit einem einfachen Event
Lokale Tests funktionieren nicht:
- Stelle sicher, dass Stripe CLI läuft
- Überprüfe die
.envDatei - Verwende
stripe listenfür Webhook-Forwarding
stripe listen schlägt fehl mit „Expired API Key" (401):
Die Stripe CLI verwendet eine eigene OAuth-Session, die unabhängig vom API-Key abläuft. Der Fehler sieht so aus:
FATAL Error while authenticating with Stripe: Authorization failed, status=401, body={
"error": { "type": "api_error", "code": "api_key_expired", ... }
}
Lösung: CLI-Session neu authentifizieren:
stripe login
Dadurch öffnet sich der Browser zur Bestätigung. Danach funktioniert stripe listen wieder — der eigentliche API-Key in .env ist davon nicht betroffen.
Support
Bei Problemen:
- Überprüfe die Stripe-Logs im Dashboard
- Überprüfe deine Vercel Function Logs
- Konsultiere die Stripe-Dokumentation
- Nutze den Stripe-Support