Zum Hauptinhalt springen

GitHub Repository

Vollständiges FastAPI + Dodo Payments Boilerplate

Übersicht

Das FastAPI-Boilerplate bietet einen produktionsbereiten Ausgangspunkt für die Integration von Dodo Payments in Ihr Python-Backend. Diese Vorlage umfasst die Handhabung von Checkout-Sitzungen, die Überprüfung von Webhooks, die Integration des Kundenportals und asynchrone API-Muster, um Ihnen zu helfen, schnell Zahlungen zu akzeptieren.
Dieses Boilerplate verwendet FastAPI mit async/await-Mustern, Pydantic zur Validierung und das dodopayments Python SDK für eine nahtlose API-Integration.

Funktionen

  • Schnelle Einrichtung - Starten Sie in weniger als 5 Minuten
  • Async-Unterstützung - Entwickelt mit den nativen async/await-Mustern von FastAPI
  • Checkout-Sitzungen - Vorgefertigter Checkout-Flow mit dem Python SDK
  • Webhook-Verarbeitung - Sicherer Webhook-Endpunkt mit Signaturüberprüfung
  • Kundenportal - Einfache Erstellung von Kundenportalsitzungen
  • Typensicherheit - Vollständige Pydantic-Validierung und Typ-Hinweise
  • Umgebungs-Konfiguration - Bereit zur Verwendung mit Umgebungsvariablen

Voraussetzungen

Bevor Sie beginnen, stellen Sie sicher, dass Sie Folgendes haben:
  • Python 3.9+ (empfohlen: Python 3.11+)
  • pip oder uv für das Paketmanagement
  • Dodo Payments-Konto (um API- und Webhook-Keys vom Dashboard abzurufen)

Schnellstart

1

Repository klonen

git clone https://github.com/dodopayments/fastapi-boilerplate.git
cd fastapi-boilerplate
2

Virtuelle Umgebung erstellen

Richten Sie eine isolierte Python-Umgebung ein:
python -m venv venv
source venv/bin/activate  # On Windows: venv\Scripts\activate
Oder verwenden Sie uv für ein schnelleres Abhängigkeitsmanagement:
uv venv
source .venv/bin/activate
3

Abhängigkeiten installieren

pip install -r requirements.txt
Oder mit uv:
uv pip install -r requirements.txt
4

API-Anmeldeinformationen abrufen

Melden Sie sich bei Dodo Payments an und holen Sie sich Ihre Anmeldeinformationen vom Dashboard:
Stellen Sie sicher, dass Sie sich im Testmodus befinden, während Sie entwickeln!
5

Umgebungsvariablen konfigurieren

Erstellen Sie eine .env Datei im Stammverzeichnis:
cp .env.example .env
Aktualisieren Sie die Werte mit Ihren Dodo Payments-Anmeldeinformationen:
.env
DODO_PAYMENTS_API_KEY=your_api_key_here
DODO_PAYMENTS_WEBHOOK_KEY=your_webhook_signing_key_here
DODO_PAYMENTS_ENVIRONMENT=test_mode
Verpflichten Sie niemals Ihre .env Datei zur Versionskontrolle. Sie ist bereits in .gitignore enthalten.
6

Entwicklungsserver starten

uvicorn main:app --reload
Öffnen Sie http://localhost:8000/docs, um die interaktive API-Dokumentation zu sehen!
Sie sollten die Swagger UI von FastAPI mit allen verfügbaren Endpunkten sehen, die bereit sind, getestet zu werden.

Projektstruktur

fastapi-boilerplate/
├── main.py                 # FastAPI application entry point
├── routers/
│   ├── checkout.py         # Checkout session endpoints
│   ├── webhook.py          # Webhook handler endpoint
│   └── customer_portal.py  # Customer portal endpoints
├── config.py               # Environment configuration
├── requirements.txt        # Python dependencies
├── .env.example            # Environment template
└── README.md

API-Endpunkte

Das Boilerplate umfasst die folgenden vorkonfigurierten Endpunkte:
EndpunktMethodeBeschreibung
/checkoutPOSTErstellen Sie eine neue Checkout-Sitzung
/webhookPOSTVerarbeiten Sie Dodo Payments-Webhooks
/customer-portalPOSTGenerieren Sie die URL des Kundenportals

Codebeispiele

Erstellen einer Checkout-Sitzung

from fastapi import APIRouter, HTTPException
from dodopayments import AsyncDodoPayments
from pydantic import BaseModel
from config import settings

router = APIRouter()
dodo = AsyncDodoPayments(
    bearer_token=settings.DODO_PAYMENTS_API_KEY,
    environment=settings.DODO_PAYMENTS_ENVIRONMENT
)

class CheckoutRequest(BaseModel):
    product_id: str
    quantity: int = 1
    customer_email: str | None = None
    customer_name: str | None = None

@router.post("/checkout")
async def create_checkout(request: CheckoutRequest):
    try:
        session = await dodo.checkout_sessions.create(
            product_cart=[{
                "product_id": request.product_id,
                "quantity": request.quantity
            }],
            customer={
                "email": request.customer_email,
                "name": request.customer_name
            } if request.customer_email else None,
            return_url="http://localhost:8000/success"
        )
        return {"checkout_url": session.url, "session_id": session.session_id}
    except Exception as e:
        raise HTTPException(status_code=400, detail=str(e))

Verarbeitung von Webhooks

from fastapi import APIRouter, Request, HTTPException
import hmac
import hashlib
from config import settings

router = APIRouter()

def verify_webhook_signature(payload: bytes, signature: str) -> bool:
    expected = hmac.new(
        settings.DODO_PAYMENTS_WEBHOOK_KEY.encode(),
        payload,
        hashlib.sha256
    ).hexdigest()
    return hmac.compare_digest(expected, signature)

@router.post("/webhook")
async def handle_webhook(request: Request):
    payload = await request.body()
    signature = request.headers.get("webhook-signature", "")
    
    if not verify_webhook_signature(payload, signature):
        raise HTTPException(status_code=401, detail="Invalid signature")
    
    event = await request.json()
    event_type = event.get("type")
    
    match event_type:
        case "payment.succeeded":
            # Handle successful payment
            payment_id = event["data"]["payment_id"]
            print(f"Payment succeeded: {payment_id}")
            
        case "subscription.active":
            # Handle subscription activation
            subscription_id = event["data"]["subscription_id"]
            print(f"Subscription activated: {subscription_id}")
            
        case "refund.succeeded":
            # Handle refund
            refund_id = event["data"]["refund_id"]
            print(f"Refund processed: {refund_id}")
    
    return {"status": "received"}

Integration des Kundenportals

from fastapi import APIRouter, HTTPException
from dodopayments import AsyncDodoPayments
from pydantic import BaseModel
from config import settings

router = APIRouter()
dodo = AsyncDodoPayments(
    bearer_token=settings.DODO_PAYMENTS_API_KEY,
    environment=settings.DODO_PAYMENTS_ENVIRONMENT
)

class PortalRequest(BaseModel):
    customer_id: str

@router.post("/customer-portal")
async def create_portal_session(request: PortalRequest):
    try:
        session = await dodo.customers.create_customer_portal(
            customer_id=request.customer_id
        )
        return {"portal_url": session.url}
    except Exception as e:
        raise HTTPException(status_code=400, detail=str(e))

Webhook-Ereignisse

Das Boilerplate demonstriert die Verarbeitung gängiger Webhook-Ereignisse:
EreignisBeschreibung
payment.succeededZahlung erfolgreich abgeschlossen
payment.failedZahlungsversuch fehlgeschlagen
subscription.activeAbonnement ist jetzt aktiv
subscription.cancelledAbonnement wurde gekündigt
refund.succeededRückerstattung erfolgreich verarbeitet
Fügen Sie Ihre Geschäftslogik im Webhook-Handler hinzu, um:
  • Benutzerberechtigungen in Ihrer Datenbank zu aktualisieren
  • Bestätigungs-E-Mails zu senden
  • Zugriff auf digitale Produkte bereitzustellen
  • Analysen und Metriken zu verfolgen

Webhooks lokal testen

Für die lokale Entwicklung verwenden Sie Tools wie ngrok, um Ihren lokalen Server freizugeben:
ngrok http 8000
Aktualisieren Sie die Webhook-URL in Ihrem Dodo Payments Dashboard:
https://your-ngrok-url.ngrok.io/webhook

Bereitstellung

Docker

FROM python:3.11-slim

WORKDIR /app

COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt

COPY . .

CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8000"]
Bauen und ausführen:
docker build -t fastapi-dodo .
docker run -p 8000:8000 --env-file .env fastapi-dodo

Produktionsüberlegungen

Bevor Sie in die Produktion gehen:
  • Wechseln Sie DODO_PAYMENTS_ENVIRONMENT zu live_mode
  • Verwenden Sie Produktions-API-Schlüssel aus dem Dashboard
  • Aktualisieren Sie die Webhook-URL auf Ihre Produktionsdomain
  • Aktivieren Sie HTTPS für alle Endpunkte

Fehlersuche

Stellen Sie sicher, dass Ihre virtuelle Umgebung aktiviert und die Abhängigkeiten installiert sind:
source venv/bin/activate
pip install -r requirements.txt
Häufige Ursachen:
  • Ungültige Produkt-ID - überprüfen Sie, ob sie in Ihrem Dodo-Dashboard vorhanden ist
  • Falscher API-Schlüssel oder Umgebungs-Einstellung in .env
  • Überprüfen Sie die FastAPI-Protokolle auf detaillierte Fehlermeldungen
Für lokale Tests verwenden Sie ngrok, um Ihren Server freizugeben:
ngrok http 8000
Aktualisieren Sie die Webhook-URL in Ihrem Dodo-Dashboard auf die ngrok-URL. Stellen Sie sicher, dass Sie Ihre .env Datei mit dem richtigen Webhook-Überprüfungsschlüssel aktualisieren.
  • Stellen Sie sicher, dass DODO_PAYMENTS_WEBHOOK_KEY korrekt in Ihrer .env gesetzt ist
  • Überprüfen Sie, ob Sie den Rohdatenkörper für die Signaturüberprüfung verwenden
  • Stellen Sie sicher, dass Sie den webhook-signature Header korrekt lesen

Erfahren Sie mehr

Unterstützung

Brauchen Sie Hilfe mit dem Boilerplate?