Skip to main content

GitHub Repository

Código-fonte do boilerplate do FastAPI e do Dodo Payments.

Visão Geral

O boilerplate do FastAPI é um backend Python com o Dodo Payments já conectado. Ele tem endpoints que criam sessões de checkout e sessões do Customer Portal, um endpoint de webhook que verifica assinaturas e uma página de preços renderizada a partir de templates Jinja2.
Este boilerplate usa FastAPI com os handlers de rota async, Pydantic para validação e configurações e o SDK Python dodopayments. Os handlers chamam o cliente síncrono DodoPayments. Para evitar o bloqueio do event loop, altere para AsyncDodoPayments e await suas chamadas.

Recursos

O boilerplate inclui:
  • Configuração rápida: passe do clone a um servidor em execução em cerca de cinco minutos.
  • Handlers assíncronos: os handlers de rota são funções async def do FastAPI.
  • Sessões de checkout: um endpoint de checkout pré-configurado que usa o SDK Python.
  • Processamento de webhooks: um endpoint de webhook que verifica cada assinatura com o método unwrap do SDK.
  • Customer Portal: um endpoint que cria sessões do Customer Portal.
  • Segurança de tipos: os modelos Pydantic validam os corpos das solicitações, e o código usa type hints.
  • Configuração do ambiente: pydantic-settings carrega e valida a configuração de .env.

Pré-requisitos

Antes de começar, você precisa de:
  • Python 3.9 ou posterior, exigido pelo SDK dodopayments. Recomenda-se Python 3.11 ou posterior.
  • pip ou uv para gerenciamento de pacotes.
  • Uma conta do Dodo Payments, para criar uma chave de API e um segredo de assinatura de webhook no dashboard.

Início rápido

1

Clone the Repository

2

Create Virtual Environment

Configure um ambiente Python isolado:
Ou use uv para um gerenciamento mais rápido de dependências:
3

Install Dependencies

Ou com uv:
4

Get API Credentials

Cadastre-se no Dodo Payments e obtenha suas credenciais no dashboard:
Crie ambos enquanto o seletor Live Mode na barra lateral estiver desativado. Uma chave de modo de teste funciona somente com DODO_PAYMENTS_ENVIRONMENT=test_mode, e os pagamentos no modo de teste não movimentam dinheiro real.
5

Configure Environment Variables

Copie o arquivo de exemplo para criar um arquivo .env no diretório raiz:
Defina os valores com suas credenciais do Dodo Payments:
.env
As quatro variáveis são obrigatórias. app/core/config.py as carrega com pydantic-settings, e o app não inicia se alguma estiver ausente ou vazia. DODO_PAYMENTS_RETURN_URL é o local para onde o checkout envia o cliente após o pagamento.
Não faça commit do arquivo .env no controle de versão. O arquivo .gitignore do repositório já o exclui.
6

Add Your Products

Substitua os produtos de exemplo em app/lib/products.py pelos seus próprios produtos. Defina cada product_id como o ID de um produto em Products no seu dashboard. A página de preços exibe esses produtos.
7

Run the Development Server

Abra http://localhost:8000/docs para ver a documentação interativa da API.
O Swagger UI lista os endpoints /api/checkout/, /api/webhook/ e /api/customer-portal/, prontos para teste.
A URL raiz, http://localhost:8000, exibe a página de preços.
app/main.py chama templates.TemplateResponse("index.html", {"request": request, ...}), uma assinatura que o Starlette 1.x não aceita mais, portanto a página de preços retorna um erro 500 em uma instalação nova. Para corrigir isso, altere a chamada para templates.TemplateResponse(request, "index.html", {"products": products}).

Estrutura do projeto

Endpoints da API

app/main.py monta cada router sob um prefixo /api: Cada caminho termina com uma barra. O FastAPI responde a uma solicitação para o caminho sem a barra com um redirecionamento 307; portanto, use o caminho exato, especialmente na sua URL de webhook.

Exemplos de código

Estes exemplos foram condensados a partir dos arquivos em app/api/.

Criando uma sessão de checkout

app/api/checkout.py cria uma sessão de checkout e retorna seu checkout_url. O corpo da solicitação recebe um product_id, um quantity opcional e um objeto customer opcional com name e email:

Processando webhooks

app/api/webhook.py verifica a assinatura com o método unwrap do SDK e, em seguida, toma uma decisão com base no tipo de evento:

Integração com o Customer Portal

app/api/portal.py cria uma sessão do Customer Portal para um ID de cliente e retorna o link do portal como url:
A página de preços em app/templates/index.html envia um ID de cliente definido diretamente no código (cus_001) para este endpoint, e um nome e e-mail definidos diretamente no código para o endpoint de checkout. Substitua-os pelos valores do usuário conectado.

Eventos de webhook

O handler em app/api/webhook.py toma uma decisão com base nestes eventos: Para processar outro evento, adicione uma ramificação para o tipo correspondente, como refund.succeeded para um reembolso processado com sucesso. Para ver todos os tipos de evento, consulte o Guia de eventos de webhook. Adicione sua lógica de negócio dentro do handler de webhook para:
  • Atualizar as permissões dos usuários no seu banco de dados
  • Enviar e-mails de confirmação
  • Provisionar acesso a produtos digitais
  • Rastrear análises e métricas

Testando webhooks localmente

O Dodo Payments não consegue acessar localhost. Para desenvolvimento local, use uma ferramenta como o ngrok para expor seu servidor local:
Adicione a URL HTTPS do ngrok, seguida de /api/webhook/, como um endpoint no seu Dashboard do Dodo Payments:
Copie o segredo de assinatura do endpoint para DODO_PAYMENTS_WEBHOOK_KEY em .env e reinicie o servidor. O aplicativo lê .env somente na inicialização.

Implantação

Docker

O repositório não inclui um Dockerfile. Para executar o aplicativo em um container, adicione este Dockerfile à raiz do repositório:
COPY . . copia todos os arquivos no contexto de build, incluindo .env. Para manter suas chaves fora da imagem, adicione um arquivo .dockerignore que liste .env. Em seguida, crie a imagem e execute-a com seu arquivo de ambiente:

Considerações para produção

Antes de implantar em produção:
  • Altere DODO_PAYMENTS_ENVIRONMENT para live_mode.
  • Use uma chave de API do modo live obtida no dashboard.
  • Adicione um endpoint de webhook para seu domínio de produção e defina DODO_PAYMENTS_WEBHOOK_KEY como o segredo de assinatura correspondente.
  • Defina DODO_PAYMENTS_RETURN_URL como sua URL de produção.
  • Ative HTTPS para todos os endpoints.

Solução de problemas

Certifique-se de que seu ambiente virtual esteja ativado e que as dependências estejam instaladas:
app/main.py fornece arquivos estáticos de app/static, mas o repositório não inclui esse diretório. Crie-o com mkdir app/static e inicie o servidor novamente.
Verifique estas causas comuns:
  • O ID do produto não existe no seu dashboard do Dodo Payments.
  • A chave de API ou DODO_PAYMENTS_ENVIRONMENT em .env está incorreta. Uma chave do modo de teste funciona somente com test_mode.
O endpoint retorna o erro do SDK em uma resposta 400. Verifique os logs do FastAPI para obter mensagens de erro detalhadas.
Para testes locais, use o ngrok para expor seu servidor:
No seu dashboard do Dodo, adicione um endpoint com a URL do ngrok seguida de /api/webhook/, incluindo a barra final. Copie o segredo de assinatura desse endpoint para DODO_PAYMENTS_WEBHOOK_KEY no arquivo .env.
  • Certifique-se de que DODO_PAYMENTS_WEBHOOK_KEY em .env corresponda ao segredo de assinatura do endpoint.
  • Verifique a assinatura em relação ao corpo bruto da solicitação antes de analisá-lo como JSON.
  • Passe os três headers webhook-id, webhook-timestamp e webhook-signature para client.webhooks.unwrap(). A assinatura do Standard Webhooks abrange id.timestamp.body, não apenas o corpo.

Saiba mais

Python SDK

Documentação completa do Python SDK com suporte assíncrono

Webhooks Documentation

Saiba mais sobre todos os eventos de webhook e as práticas recomendadas

Checkout Sessions

Aprofunde-se na configuração da sessão de checkout

API Reference

Documentação completa da API do Dodo Payments

Suporte

Para obter ajuda com o boilerplate:
Última modificação em 28 de setembro de 2026