Skip to main content

GitHub Repository

Codice sorgente per il boilerplate FastAPI e Dodo Payments.

Panoramica

Il boilerplate FastAPI è un backend Python con Dodo Payments già connesso. Include endpoint che creano checkout session e sessioni del Customer Portal, un endpoint webhook che verifica le firme e una pagina dei prezzi renderizzata con template Jinja2.
Questo boilerplate usa FastAPI con async route handler, Pydantic per la validazione e le impostazioni e dodopayments Python SDK. Gli handler chiamano il client sincrono DodoPayments. Per evitare di bloccare l’event loop, passa a AsyncDodoPayments e await le relative chiamate.

Caratteristiche

Il boilerplate include:
  • Configurazione rapida: dal clone a un server in esecuzione in circa cinque minuti.
  • Handler asincroni: gli handler delle route sono funzioni FastAPI async def.
  • Checkout session: un endpoint checkout preconfigurato che usa il Python SDK.
  • Gestione dei webhook: un endpoint webhook che verifica ogni firma con il metodo unwrap dell’SDK.
  • Customer Portal: un endpoint che crea sessioni del Customer Portal.
  • Sicurezza dei tipi: i modelli Pydantic convalidano i request body e il codice usa i type hint.
  • Configurazione dell’ambiente: pydantic-settings carica e convalida la configurazione da .env.

Prerequisiti

Prima di iniziare, ti servono:
  • Python 3.9 o versione successiva, richiesto dall’SDK dodopayments. È consigliato Python 3.11 o versione successiva.
  • pip o uv per la gestione dei pacchetti.
  • Un account Dodo Payments, per creare una API key e un webhook signing secret nella dashboard.

Avvio rapido

1

Clone the Repository

2

Create Virtual Environment

Configura un ambiente Python isolato:
In alternativa, usa uv per una gestione più rapida delle dipendenze:
3

Install Dependencies

Oppure con uv:
4

Get API Credentials

Registrati su Dodo Payments, quindi recupera le credenziali dalla dashboard:
Crea entrambi con l’interruttore Live Mode della barra laterale disattivato. Una chiave in modalità test funziona solo con DODO_PAYMENTS_ENVIRONMENT=test_mode e i pagamenti in modalità test non trasferiscono denaro reale.
5

Configure Environment Variables

Copia il file di esempio per creare un file .env nella directory principale:
Imposta i valori sulle tue credenziali Dodo Payments:
.env
Tutte e quattro le variabili sono obbligatorie. app/core/config.py le carica con pydantic-settings e l’app non si avvia se una variabile è assente o vuota. DODO_PAYMENTS_RETURN_URL è il punto in cui il checkout reindirizza il cliente dopo il pagamento.
Non eseguire il commit del file .env nel controllo versione. Il file .gitignore del repository lo esclude già.
6

Add Your Products

Sostituisci i prodotti di esempio in app/lib/products.py con i tuoi. Imposta ogni product_id sull’ID di un prodotto nella sezione Products della dashboard. La pagina dei prezzi mostra questi prodotti.
7

Run the Development Server

Apri http://localhost:8000/docs per visualizzare la documentazione interattiva dell’API.
Swagger UI elenca gli endpoint /api/checkout/, /api/webhook/ e /api/customer-portal/, pronti per essere testati.
L’URL radice, http://localhost:8000, serve la pagina dei prezzi.
app/main.py chiama INLINE_CODE_PLACEHOLDER_fd4869eef4784ce_END, una firma che Starlette 1.x non accetta più, quindi la pagina dei prezzi restituisce un errore 500 in una nuova installazione. Per risolvere il problema, modifica la chiamata in templates.TemplateResponse(request, "index.html", {"products": products}).

Struttura del progetto

Endpoint API

app/main.py monta ogni router con un prefisso /api: Ogni percorso termina con una barra. FastAPI risponde a una richiesta del percorso senza barra con un reindirizzamento 307, quindi usa il percorso esatto, soprattutto nel tuo URL webhook.

Esempi di codice

Questi esempi sono estratti dai file in app/api/.

Creazione di una sessione di checkout

app/api/checkout.py crea una sessione di checkout e restituisce il relativo checkout_url. Il corpo della richiesta accetta un product_id, un quantity opzionale e un oggetto customer opzionale con name e email:

Gestione dei webhook

app/api/webhook.py verifica la firma con il metodo unwrap dell’SDK, quindi gestisce i diversi tipi di evento:

Integrazione con Customer Portal

app/api/portal.py crea una sessione Customer Portal per un ID cliente e restituisce il link al portale come url:
La pagina dei prezzi in app/templates/index.html invia un ID cliente hardcoded (cus_001) a questo endpoint e un nome e un indirizzo email hardcoded all’endpoint di checkout. Sostituiscili con i valori dell’utente autenticato.

Eventi webhook

Il gestore in app/api/webhook.py gestisce i seguenti eventi: Per gestire un altro evento, aggiungi un ramo per il relativo tipo, ad esempio refund.succeeded per un rimborso elaborato correttamente. Per tutti i tipi di evento, consulta la guida agli eventi webhook. Aggiungi la tua logica aziendale all’interno del gestore webhook per:
  • Aggiornare le autorizzazioni degli utenti nel database
  • Inviare email di conferma
  • Provisionare l’accesso ai prodotti digitali
  • Monitorare analisi e metriche

Test dei webhook in locale

Dodo Payments non può raggiungere localhost. Per lo sviluppo locale, usa uno strumento come ngrok per esporre il tuo server locale:
Aggiungi l’URL HTTPS di ngrok, seguito da /api/webhook/, come endpoint nella tua Dodo Payments Dashboard:
Copia il signing secret dell’endpoint in DODO_PAYMENTS_WEBHOOK_KEY in .env, quindi riavvia il server. L’app legge .env solo all’avvio.

Deployment

Docker

Il repository non include un Dockerfile. Per eseguire l’app in un container, aggiungi questo Dockerfile nella root del repository:
COPY . . copia ogni file nel contesto di build, incluso .env. Per mantenere le chiavi fuori dall’immagine, aggiungi un file .dockerignore che elenchi .env. Quindi crea l’immagine ed eseguila con il tuo file di ambiente:

Considerazioni per la produzione

Prima di eseguire il deployment in produzione:
  • Imposta DODO_PAYMENTS_ENVIRONMENT su live_mode.
  • Usa una chiave API live dalla dashboard.
  • Aggiungi un endpoint webhook per il tuo dominio di produzione e imposta DODO_PAYMENTS_WEBHOOK_KEY sul relativo signing secret.
  • Imposta DODO_PAYMENTS_RETURN_URL sull’URL di produzione.
  • Abilita HTTPS per tutti gli endpoint.

Risoluzione dei problemi

Assicurati che l’ambiente virtuale sia attivato e che le dipendenze siano installate:
app/main.py serve i file statici da app/static, ma il repository non include quella directory. Creala con mkdir app/static, quindi avvia nuovamente il server.
Verifica queste cause comuni:
  • L’ID prodotto non esiste nella tua dashboard Dodo Payments.
  • La chiave API o DODO_PAYMENTS_ENVIRONMENT in .env è errata. Una chiave in modalità test funziona solo con test_mode.
L’endpoint restituisce l’errore dell’SDK in una risposta 400. Controlla i log di FastAPI per messaggi di errore dettagliati.
Per i test locali, usa ngrok per esporre il tuo server:
Nella tua Dodo dashboard, aggiungi un endpoint con l’URL di ngrok seguito da /api/webhook/, inclusa la barra finale. Copia il signing secret dell’endpoint in DODO_PAYMENTS_WEBHOOK_KEY nel file .env.
  • Assicurati che DODO_PAYMENTS_WEBHOOK_KEY in .env corrisponda al signing secret dell’endpoint.
  • Verifica la firma rispetto al corpo grezzo della richiesta, prima di analizzarlo come JSON.
  • Passa tutti e tre gli header webhook-id, webhook-timestamp e webhook-signature a client.webhooks.unwrap(). La firma Standard Webhooks copre id.timestamp.body, non solo il corpo.

Approfondimenti

Python SDK

Documentazione completa dell’SDK Python con supporto async

Webhooks Documentation

Scopri tutti gli eventi webhook e le best practice

Checkout Sessions

Approfondisci la configurazione delle sessioni di checkout

API Reference

Documentazione completa dell’API Dodo Payments

Supporto

Per ricevere assistenza sul boilerplate:
Ultima modifica il 26 settembre 2026