Skip to main content

GitHub Repository

Quellcode für das FastAPI- und Dodo Payments-Boilerplate.

Überblick

Das FastAPI-Boilerplate ist ein Python-Backend, in dem Dodo Payments bereits verbunden ist. Es verfügt über Endpunkte zum Erstellen von Checkout-Sitzungen und Customer-Portal-Sitzungen, einen Webhook-Endpunkt zur Überprüfung von Signaturen sowie eine aus Jinja2-Templates gerenderte Preisseite.
Dieses Boilerplate verwendet FastAPI mit async-Routen-Handlern, Pydantic für Validierung und Einstellungen sowie das dodopayments Python SDK. Die Handler rufen den synchronen DodoPayments-Client auf. Um eine Blockierung der Event-Schleife zu vermeiden, wechseln Sie zu AsyncDodoPayments und führen Sie dessen Aufrufe mit await aus.

Funktionen

Das Boilerplate umfasst:
  • Schnelle Einrichtung: Vom Klonen bis zu einem laufenden Server in etwa fünf Minuten.
  • Asynchrone Handler: Routen-Handler sind FastAPI- async def-Funktionen.
  • Checkout-Sitzungen: Ein vorkonfigurierter Checkout-Endpunkt, der das Python SDK verwendet.
  • Webhook-Verarbeitung: Ein Webhook-Endpunkt, der jede Signatur mit der unwrap-Methode des SDKs überprüft.
  • Customer Portal: Ein Endpunkt, der Customer-Portal-Sitzungen erstellt.
  • Typsicherheit: Pydantic-Modelle validieren Request-Bodies, und der Code verwendet Type Hints.
  • Umgebungskonfiguration: pydantic-settings lädt und validiert die Konfiguration aus .env.

Voraussetzungen

Bevor Sie beginnen, benötigen Sie:
  • Python 3.9 oder höher, das vom dodopayments SDK benötigt wird. Python 3.11 oder höher wird empfohlen.
  • pip oder uv zur Paketverwaltung.
  • Ein Dodo Payments-Konto, um im Dashboard einen API-Schlüssel und ein Webhook-Signaturgeheimnis zu erstellen.

Schnellstart

1

Clone the Repository

2

Create Virtual Environment

Richten Sie eine isolierte Python-Umgebung ein:
Oder verwenden Sie uv für eine schnellere Abhängigkeitsverwaltung:
3

Install Dependencies

Oder mit uv:
4

Get API Credentials

Registrieren Sie sich bei Dodo Payments und rufen Sie anschließend Ihre Zugangsdaten im Dashboard ab:
Erstellen Sie beide, während der Schalter Live Mode in der Seitenleiste deaktiviert ist. Ein Testmodus-Schlüssel funktioniert nur mit DODO_PAYMENTS_ENVIRONMENT=test_mode, und Zahlungen im Testmodus bewegen kein echtes Geld.
5

Configure Environment Variables

Kopieren Sie die Beispieldatei, um im Stammverzeichnis eine .env-Datei zu erstellen:
Legen Sie die Werte für Ihre Dodo Payments-Zugangsdaten fest:
.env
Alle vier Variablen sind erforderlich. app/core/config.py lädt sie mit pydantic-settings, und die App startet nicht, wenn eine davon fehlt oder leer ist. DODO_PAYMENTS_RETURN_URL bezeichnet die URL, zu der Checkout den Kunden nach der Zahlung weiterleitet.
Committen Sie Ihre .env-Datei nicht in die Versionsverwaltung. Die .gitignore des Repositorys schließt sie bereits aus.
6

Add Your Products

Ersetzen Sie die Beispielprodukte in app/lib/products.py durch Ihre eigenen. Setzen Sie jede product_id auf die ID eines Produkts unter Products in Ihrem Dashboard. Auf der Preisseite werden diese Produkte angezeigt.
7

Run the Development Server

Öffnen Sie http://localhost:8000/docs, um die interaktive API-Dokumentation anzuzeigen.
Swagger UI listet die Endpunkte /api/checkout/, /api/webhook/ und /api/customer-portal/ auf, die zum Testen bereitstehen.
Die Root-URL, http://localhost:8000, stellt die Preisseite bereit.
app/main.py ruft templates.TemplateResponse("index.html", {"request": request, ...}) auf, eine Signatur, die Starlette 1.x nicht mehr akzeptiert. Daher gibt die Preisseite bei einer frischen Installation einen 500-Fehler zurück. Ändere den Aufruf zu templates.TemplateResponse(request, "index.html", {"products": products}), um das Problem zu beheben.

Projektstruktur

API-Endpunkte

app/main.py bindet jeden Router unter einem /api-Präfix ein: Jeder Pfad endet mit einem Schrägstrich. FastAPI beantwortet eine Anfrage an den Pfad ohne Schrägstrich mit einer 307-Weiterleitung. Verwende daher den exakten Pfad, insbesondere in deiner Webhook-URL.

Codebeispiele

Diese Beispiele wurden aus den Dateien in app/api/ zusammengefasst.

Eine Checkout-Session erstellen

app/api/checkout.py erstellt eine Checkout-Session und gibt deren checkout_url zurück. Der Request-Body akzeptiert ein product_id, ein optionales quantity sowie ein optionales customer-Objekt mit name und email:

Webhooks verarbeiten

app/api/webhook.py überprüft die Signatur mit der unwrap-Methode des SDK und verzweigt anschließend nach Ereignistyp:

Customer-Portal-Integration

app/api/portal.py erstellt eine Customer-Portal-Session für eine Kunden-ID und gibt den Portal-Link als url zurück:
Die Preisseite in app/templates/index.html sendet eine fest codierte Kunden-ID (cus_001) an diesen Endpunkt sowie einen fest codierten Namen und eine fest codierte E-Mail-Adresse an den Checkout-Endpunkt. Ersetze diese durch die Werte des angemeldeten Benutzers.

Webhook-Ereignisse

Der Handler in app/api/webhook.py verzweigt bei diesen Ereignissen: Um ein weiteres Ereignis zu verarbeiten, füge einen Zweig für dessen Typ hinzu, z. B. refund.succeeded für eine erfolgreich verarbeitete Rückerstattung. Eine Übersicht über alle Ereignistypen findest du im Leitfaden zu Webhook-Ereignissen. Füge deine Geschäftslogik in den Webhook-Handler ein, um:
  • Benutzerberechtigungen in deiner Datenbank zu aktualisieren
  • Bestätigungs-E-Mails zu senden
  • Zugriff auf digitale Produkte bereitzustellen
  • Analysen und Metriken zu erfassen

Webhooks lokal testen

Dodo Payments kann localhost nicht erreichen. Verwende für die lokale Entwicklung ein Tool wie ngrok, um deinen lokalen Server bereitzustellen:
Füge die HTTPS-URL von ngrok, gefolgt von /api/webhook/, als Endpunkt in deinem Dodo Payments Dashboard hinzu:
Kopiere das Signaturgeheimnis des Endpunkts nach DODO_PAYMENTS_WEBHOOK_KEY in .env und starte den Server anschließend neu. Die App liest .env nur beim Start ein.

Bereitstellung

Docker

Das Repository enthält keine Dockerfile. Um die App in einem Container auszuführen, füge diese Dockerfile im Stammverzeichnis des Repositorys hinzu:
COPY . . kopiert jede Datei im Build-Kontext, einschließlich .env. Damit deine Schlüssel nicht im Image landen, füge eine .dockerignore-Datei hinzu, die .env auflistet. Erstelle anschließend das Image und führe es mit deiner Umgebungsdatei aus:

Überlegungen zur Produktion

Vor der Bereitstellung in der Produktion:
  • Ändere DODO_PAYMENTS_ENVIRONMENT zu live_mode.
  • Verwende einen API-Schlüssel für den Live-Modus aus dem Dashboard.
  • Füge einen Webhook-Endpunkt für deine Produktionsdomain hinzu und setze DODO_PAYMENTS_WEBHOOK_KEY auf dessen Signaturgeheimnis.
  • Setze DODO_PAYMENTS_RETURN_URL auf deine Produktions-URL.
  • Aktiviere HTTPS für alle Endpunkte.

Fehlerbehebung

Stelle sicher, dass deine virtuelle Umgebung aktiviert und alle Abhängigkeiten installiert sind:
app/main.py stellt statische Dateien aus app/static bereit, aber das Repository enthält dieses Verzeichnis nicht. Erstelle es mit mkdir app/static und starte den Server anschließend erneut.
Prüfe diese häufigen Ursachen:
  • Die Produkt-ID existiert nicht in deinem Dodo Payments Dashboard.
  • Der API-Schlüssel oder DODO_PAYMENTS_ENVIRONMENT in .env ist falsch. Ein Schlüssel für den Testmodus funktioniert nur mit test_mode.
Der Endpunkt gibt den SDK-Fehler in einer 400-Antwort zurück. Prüfe die FastAPI-Protokolle auf detaillierte Fehlermeldungen.
Verwende für lokale Tests ngrok, um deinen Server bereitzustellen:
Füge in deinem Dodo-Dashboard einen Endpunkt mit der ngrok-URL gefolgt von /api/webhook/ hinzu, einschließlich des abschließenden Schrägstrichs. Kopiere das Signaturgeheimnis dieses Endpunkts in DODO_PAYMENTS_WEBHOOK_KEY in deine Datei .env.
  • Stelle sicher, dass DODO_PAYMENTS_WEBHOOK_KEY in .env mit dem Signaturgeheimnis des Endpunkts übereinstimmt.
  • Überprüfe die Signatur anhand des rohen Request-Bodys, bevor du ihn als JSON analysierst.
  • Übergebe alle drei Header webhook-id, webhook-timestamp und webhook-signature an client.webhooks.unwrap(). Die Signatur von Standard Webhooks umfasst id.timestamp.body, nicht nur den Body.

Weitere Informationen

Python SDK

Vollständige Python-SDK-Dokumentation mit async-Unterstützung

Webhooks Documentation

Erfahre mehr über alle Webhook-Ereignisse und Best Practices

Checkout Sessions

Ausführliche Informationen zur Konfiguration von Checkout-Sessions

API Reference

Vollständige Dodo Payments API-Dokumentation

Support

Hilfe zum Boilerplate-Projekt:
Zuletzt geändert am 26. September 2026