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-settingslädt und validiert die Konfiguration aus.env.
Voraussetzungen
Bevor Sie beginnen, benötigen Sie:- Python 3.9 oder höher, das vom
dodopaymentsSDK 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
4
Get API Credentials
Registrieren Sie sich bei Dodo Payments und rufen Sie anschließend Ihre Zugangsdaten im Dashboard ab:
- API-Schlüssel: Erstellen Sie einen Schlüssel unter Dashboard → Developer → API Keys.
- Webhook-Schlüssel: Fügen Sie unter Dashboard → Developer → Webhooks einen Endpunkt hinzu und kopieren Sie anschließend dessen Signaturgeheimnis. Die Endpunkt-URL muss öffentlich sein und HTTPS verwenden. Informationen zum Empfangen von Ereignissen auf Ihrem Rechner finden Sie unter Webhooks lokal testen.
5
Configure Environment Variables
Kopieren Sie die Beispieldatei, um im Stammverzeichnis eine Legen Sie die Werte für Ihre Dodo Payments-Zugangsdaten fest:Alle vier Variablen sind erforderlich.
.env-Datei zu erstellen:.env
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.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
Swagger UI listet die Endpunkte
/api/checkout/, /api/webhook/ und /api/customer-portal/ auf, die zum Testen bereitstehen.http://localhost:8000, stellt die Preisseite bereit.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 inapp/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:
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 inapp/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 kannlocalhost nicht erreichen. Verwende für die lokale Entwicklung ein Tool wie ngrok, um deinen lokalen Server bereitzustellen:
/api/webhook/, als Endpunkt in deinem Dodo Payments Dashboard hinzu:
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 keineDockerfile. 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
Fehlerbehebung
Import errors or missing modules
Import errors or missing modules
Stelle sicher, dass deine virtuelle Umgebung aktiviert und alle Abhängigkeiten installiert sind:
Server fails to start with Directory 'app/static' does not exist
Server fails to start with Directory 'app/static' does not exist
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.Checkout session creation fails
Checkout session creation fails
Prüfe diese häufigen Ursachen:
- Die Produkt-ID existiert nicht in deinem Dodo Payments Dashboard.
- Der API-Schlüssel oder
DODO_PAYMENTS_ENVIRONMENTin.envist falsch. Ein Schlüssel für den Testmodus funktioniert nur mittest_mode.
400-Antwort zurück. Prüfe die FastAPI-Protokolle auf detaillierte Fehlermeldungen.Webhooks not receiving events
Webhooks not receiving events
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.Webhook signature verification fails
Webhook signature verification fails
- Stelle sicher, dass
DODO_PAYMENTS_WEBHOOK_KEYin.envmit 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-timestampundwebhook-signatureanclient.webhooks.unwrap(). Die Signatur von Standard Webhooks umfasstid.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:- Stelle Fragen in der Discord-Community.
- Melde Probleme und verfolge Aktualisierungen im GitHub-Repository.
- Schreibe dem Support-Team.