Skip to main content
O pacote @dodopayments/tanstack fornece três handlers de requisição ao seu projeto TanStack Start. Checkout retorna URLs de checkout, CustomerPortal envia um cliente ao Customer Portal e Webhooks verifica eventos de webhook e os encaminha ao seu código. Cada handler recebe um Request padrão e retorna um Response, portanto você o chama a partir de um handler de rota do servidor.

Checkout Handler

Crie URLs de checkout com fluxos estáticos, dinâmicos e de sessões de checkout.

Customer Portal

Permita que os clientes gerenciem suas assinaturas e informações.

Webhooks

Receba e processe eventos de webhook do Dodo Payments.

Instalação

1

Install the Package

Execute este comando na raiz do seu projeto:
O pacote também precisa do zod 3.25 ou posterior, listado como uma peer dependency.
2

Set Up Environment Variables

Crie um arquivo .env na raiz do seu projeto. Crie a API key em Developer → API Keys. Adicione seu endpoint de webhook em Developer → Webhooks e copie o Signing secret para DODO_PAYMENTS_WEBHOOK_KEY:
O TanStack Start carrega arquivos .env, e as rotas do servidor leem os valores de process.env. DODO_PAYMENTS_RETURN_URL é o local para onde os clientes são enviados após o checkout. Se você não passar um ambiente, os handlers usam live_mode. Uma API key de modo de teste funciona somente com test_mode.
Nunca faça commit do arquivo .env nem de secrets no controle de versão.

Exemplos de handlers de rota

Os exemplos são rotas de servidor do TanStack Start em src/routes/api/. Cada uma define seus handlers em server.handlers dentro de createFileRoute. Versões anteriores do TanStack Start, como a 1.129, definem rotas de servidor com createServerFileRoute de @tanstack/react-start/server e uma chamada .methods(). Os handlers do Dodo Payments funcionam da mesma forma com ambas as APIs: passe a eles o request.
Use este handler para adicionar o checkout do Dodo Payments ao seu app. O handler GET disponibiliza o checkout estático. O handler POST disponibiliza sessões de checkout ou o checkout dinâmico quando você define type: "dynamic". O exemplo de checkout dinâmico pressupõe que você definiu type: "dynamic".

Handler de rota de checkout

O handler de checkout é compatível com as três formas de aceitar pagamentos com o Dodo Payments:
  • Links de pagamento estáticos: URLs compartilháveis que coletam pagamentos sem código.
  • Links de pagamento dinâmicos: links de pagamento gerados por você com informações personalizadas. Eles usam endpoints obsoletos.
  • Sessões de checkout: checkout hospedado com carrinho de produtos, informações do cliente e opções de personalização. Este é o fluxo recomendado.
Checkout aceita estas opções: O handler disponibiliza o checkout estático para requisições GET. Para requisições POST, ele cria um link de pagamento dinâmico quando type é dynamic e uma sessão de checkout caso contrário.

Query Parameters compatíveis

string
obrigatório
Identificador do produto, por exemplo ?productId=pdt_nZuwz45WAs64n3l07zpQR.
integer
padrão:"1"
Quantidade do produto.
string
Nome completo do cliente. Ignorado se firstName ou lastName for fornecido.
string
Primeiro nome do cliente.
string
Sobrenome do cliente.
string
Endereço de e-mail do cliente.
string
País do cliente, como um código ISO 3166-1 alpha-2.
string
Endereço da rua do cliente.
string
Cidade do cliente.
string
Estado ou província do cliente.
string
CEP ou código postal do cliente.
boolean
Defina como true para desativar o campo de nome completo.
boolean
Defina como true para desativar o campo de primeiro nome.
boolean
Defina como true para desativar o campo de sobrenome.
boolean
Defina como true para desativar o campo de e-mail.
boolean
Defina como true para desativar o campo de país.
boolean
Defina como true para desativar o campo de endereço.
boolean
Defina como true para desativar o campo de cidade.
boolean
Defina como true para desativar o campo de estado.
boolean
Defina como true para desativar o campo de CEP.
string
Moeda do pagamento, por exemplo USD.
boolean
padrão:"true"
Exiba ou oculte o seletor de moeda.
number
Define o valor cobrado, em unidades principais da moeda, por exemplo 12.5 para $12.50. Funciona somente com produtos Pay What You Want e é ignorado se estiver abaixo do preço mínimo do produto.
boolean
padrão:"true"
Exiba ou oculte a seção de descontos.
string
Qualquer query parameter que comece com metadata_ é enviado ao checkout como metadata, por exemplo metadata_orderId=123.
Uma flag de desativação só tem efeito quando o campo correspondente tem um valor, por exemplo email com disableEmail=true. O handler adiciona returnUrl da configuração ao link como redirect_url.
Se productId estiver ausente, o handler retorna uma resposta 400. Query parameters inválidos ou um produto que não existe na sua conta também retornam 400.

Formato da resposta

O checkout estático retorna uma resposta JSON com a URL de checkout. No modo de teste, a URL usa test.checkout.dodopayments.com:
  • Envie os parâmetros como um corpo JSON em uma requisição POST.
  • Compatível com pagamentos únicos e recorrentes. O handler recupera o produto e cria uma assinatura se o produto for recorrente; caso contrário, cria um pagamento único.
  • O corpo precisa de billing (com street, city, state, country e zipcode) e customer, além de product_id ou product_cart. As assinaturas precisam de product_id.
  • Para cada campo de corpo compatível, consulte:
O checkout dinâmico funciona como proxy dos endpoints obsoletos POST /payments e POST /subscriptions. Ele continua funcionando para integrações existentes, mas novas integrações devem usar sessões de checkout.

Formato da resposta

O checkout dinâmico retorna uma resposta JSON com o link de pagamento como URL de checkout:
As sessões de checkout criam um checkout hospedado para compras únicas e assinaturas, com controle total da personalização. product_cart é o único campo obrigatório e precisa de pelo menos um produto. Se o corpo não tiver return_url, o handler usa returnUrl da configuração.Cada checkout_url funciona uma vez e expira após 24 horas ou após 15 minutos quando você passa confirm: true. Uma sessão criada com payment_method_id não retorna checkout_url, portanto o handler responde com 400.Para obter mais detalhes e consultar todos os campos compatíveis, veja o Guia de integração de sessões de checkout.

Formato da resposta

As sessões de checkout retornam uma resposta JSON com a URL de checkout:

Handler de rota do Customer Portal

O handler de rota do Customer Portal cria uma sessão do Customer Portal para o cliente informado e redireciona o navegador para ela. CustomerPortal aceita as mesmas opções bearerToken e environment que Checkout.
O handler não verifica quem está fazendo a chamada. Qualquer pessoa que o solicite com um ID de cliente obtém o portal desse cliente. Proteja a rota com sua própria autenticação e passe somente o ID de cliente do usuário autenticado.

Query Parameters

string
obrigatório
O ID do cliente para a sessão do portal, por exemplo ?customer_id=cus_123.
boolean
Se definido como true, o Dodo Payments também envia o link do portal por e-mail ao cliente.
O handler retorna 400 se customer_id estiver ausente e 500 se a sessão do portal não puder ser criada.

Handler de rota de webhook

O handler de rota de webhook verifica cada requisição com o secret do webhook, passado como webhookKey, antes de executar seu código:
  • Método: somente requisições POST são compatíveis. Outros métodos retornam 405.
  • Verificação de assinatura: verifica os headers webhook-id, webhook-timestamp e webhook-signature com webhookKey, seguindo a especificação Standard Webhooks. Retorna 401 se a verificação falhar.
  • Validação do payload: valida o payload com Zod. Retorna 400 para um payload inválido.
  • Tratamento de erros:
    • 401: assinatura inválida
    • 400: payload inválido
    • 500: erro interno durante a verificação
  • Roteamento de eventos: chama onPayload para cada evento, depois o handler correspondente ao tipo do evento, e retorna 200.
O adaptor não captura erros lançados nos seus handlers. Eles são propagados para o TanStack Start e a requisição falha.

Handlers de eventos de webhook compatíveis

Cada handler é opcional e assíncrono, e recebe o payload verificado correspondente ao seu tipo de evento:
Para saber o que cada evento significa, consulte o Guia de eventos de webhook.

Prompt para LLM

Copie este prompt no seu assistente de codificação com IA para que ele adicione o adaptor ao seu projeto. Para também fornecer ao seu agente a documentação e as skills do Dodo Payments, instale o Agent Plugin.
Última modificação em 26 de setembro de 2026