Pular para o conteúdo principal

Pré-requisitos

Para integrar a API do Dodo Payments, você precisará:
  • Uma conta de comerciante do Dodo Payments
  • Credenciais da API (chave da API e chave secreta do webhook) do painel
Para um guia mais detalhado sobre os pré-requisitos, consulte esta seção.

Integração da API

Sessões de Checkout

Use Checkout Sessions para vender produtos de assinatura com um checkout hospedado e seguro. Passe seu produto de assinatura em product_cart e redirecione os clientes para o retornado checkout_url.
Checkout Misturado: Você pode combinar produtos de assinatura com produtos avulsos na mesma sessão de checkout. Isso possibilita casos de uso como taxas de configuração com assinaturas, pacotes de hardware com SaaS e muito mais. Consulte o guia de Checkout Sessions para exemplos.
import DodoPayments from 'dodopayments';

const client = new DodoPayments({
  bearerToken: process.env.DODO_PAYMENTS_API_KEY,
  environment: 'test_mode', // defaults to 'live_mode'
});

async function main() {
  const session = await client.checkoutSessions.create({
    product_cart: [
      { product_id: 'prod_subscription_monthly', quantity: 1 }
    ],
    // Optional: configure trials for subscription products
    subscription_data: { trial_period_days: 14 },
    customer: {
      email: 'subscriber@example.com',
      name: 'Jane Doe',
    },
    return_url: 'https://example.com/success',
  });

  console.log(session.checkout_url);
}

main();

Resposta da API

O seguinte é um exemplo da resposta:
{
  "session_id": "cks_Gi6KGJ2zFJo9rq9Ukifwa",
  "checkout_url": "https://test.checkout.dodopayments.com/session/cks_Gi6KGJ2zFJo9rq9Ukifwa"
}
Redirecione o cliente para checkout_url.

Webhooks

Ao integrar assinaturas, você receberá webhooks para rastrear o ciclo de vida da assinatura. Esses webhooks ajudam você a gerenciar estados de assinatura e cenários de pagamento de forma eficaz. Para configurar seu endpoint de webhook, siga nosso Guia de Integração Detalhado.

Tipos de Eventos de Assinatura

Os seguintes eventos de webhook rastreiam mudanças de status da assinatura:
  1. subscription.active - Assinatura ativada com sucesso.
  2. subscription.updated - O objeto de assinatura foi atualizado (dispara em qualquer alteração de campo).
  3. subscription.on_hold - Assinatura é colocada em espera devido à renovação com falha.
  4. subscription.failed - A criação da assinatura falhou durante a criação do mandato.
  5. subscription.renewed - Assinatura foi renovada para o próximo ciclo de cobrança.
Para um gerenciamento confiável do ciclo de vida da assinatura, recomendamos rastrear esses eventos de assinatura.
Use subscription.updated para receber notificações em tempo real sobre quaisquer alterações de assinatura, mantendo o estado da sua aplicação sincronizado sem a necessidade de consultar a API.

Cenários de Pagamento

Fluxo de Pagamento Bem-Sucedido Quando um pagamento é bem-sucedido, você receberá os seguintes webhooks:
  1. subscription.active - Indica ativação da assinatura
  2. payment.succeeded - Confirma o pagamento inicial:
    • Para cobrança imediata (0 dias de teste): espere entre 2-10 minutos
    • Para dias de teste: assim que o período terminar
  3. subscription.renewed - Indica dedução de pagamento e renovação para o próximo ciclo. (Basicamente, sempre que o pagamento for debitado para produtos de assinatura, você receberá o webhook subscription.renewed junto com payment.succeeded)
Cenários de Falha de Pagamento
  1. Falha na Assinatura
  • subscription.failed - A criação da assinatura falhou devido à falha na criação do mandato.
  • payment.failed - Indica pagamento falhou.
  1. Assinatura em Espera
  • subscription.on_hold - A assinatura é colocada em espera devido ao pagamento de renovação falho ou falha na cobrança da alteração de plano.
  • Quando uma assinatura entra em espera, ela não será renovada automaticamente até que o método de pagamento seja atualizado.
Melhor prática: Para simplificar a implementação, recomendamos rastrear principalmente os eventos de assinatura para gerenciar o ciclo de vida da assinatura.

Tratando Assinaturas Suspensas

Quando uma assinatura entra no estado on_hold, você precisa atualizar o método de pagamento para reativá-la. Esta seção explica quando as assinaturas são colocadas em espera e como lidar com elas.

Quando as Assinaturas São Suspensas

Uma assinatura é suspensa quando:
  • O pagamento de renovação falha: A cobrança automática de renovação falha devido a fundos insuficientes, cartão expirado ou recusa do banco
  • A cobrança de mudança de plano falha: Uma cobrança imediata durante a atualização/diminuição do plano falha
  • A autorização do método de pagamento falha: O método de pagamento não pode ser autorizado para cobranças recorrentes
Assinaturas no estado on_hold não serão renovadas automaticamente. Você deve atualizar o método de pagamento para reativar a assinatura.

Reativando Assinaturas Suspensas

Para reativar uma assinatura a partir do estado on_hold, use a API de Atualização de Método de Pagamento. Isso automaticamente:
  1. Cria uma cobrança pelos valores restantes
  2. Gera uma fatura para a cobrança
  3. Processa o pagamento usando o novo método de pagamento
  4. Reativa a assinatura para o estado active após o pagamento bem-sucedido
1

Handle subscription.on_hold webhook

Quando você receber um webhook subscription.on_hold, atualize o estado da sua aplicação e notifique o cliente:
// Webhook handler
app.post('/webhooks/dodo', async (req, res) => {
  const event = req.body;
  
  if (event.type === 'subscription.on_hold') {
    const subscription = event.data;
    
    // Update subscription status in your database
    await updateSubscriptionStatus(subscription.subscription_id, 'on_hold');
    
    // Notify customer to update payment method
    await sendEmailToCustomer(subscription.customer_id, {
      subject: 'Payment Required - Subscription On Hold',
      message: 'Your subscription is on hold. Please update your payment method to continue service.'
    });
  }
  
  res.json({ received: true });
});
2

Update payment method

Quando o cliente estiver pronto para atualizar o método de pagamento, chame a API de Atualização de Método de Pagamento:
// Update with new payment method
const response = await client.subscriptions.updatePaymentMethod(subscriptionId, {
  type: 'new',
  return_url: 'https://example.com/return'
});

// For on_hold subscriptions, a charge is automatically created
if (response.payment_id) {
  console.log('Charge created for remaining dues:', response.payment_id);
  // Redirect customer to response.payment_link to complete payment
}
Você também pode usar um ID de método de pagamento existente se o cliente tiver métodos salvos:
await client.subscriptions.updatePaymentMethod(subscriptionId, {
  type: 'existing',
  payment_method_id: 'pm_abc123'
});
3

Monitor webhook events

Após atualizar o método de pagamento, monitore estes eventos de webhook:
  1. payment.succeeded - A cobrança pelos valores restantes foi bem-sucedida
  2. subscription.active - A assinatura foi reativada
if (event.type === 'payment.succeeded') {
  const payment = event.data;
  
  // Check if this payment is for an on_hold subscription
  if (payment.subscription_id) {
    // Wait for subscription.active webhook to confirm reactivation
  }
}

if (event.type === 'subscription.active') {
  const subscription = event.data;
  
  // Update subscription status in your database
  await updateSubscriptionStatus(subscription.subscription_id, 'active');
  
  // Restore customer access
  await restoreCustomerAccess(subscription.customer_id);
  
  // Notify customer of successful reactivation
  await sendEmailToCustomer(subscription.customer_id, {
    subject: 'Subscription Reactivated',
    message: 'Your subscription has been reactivated successfully.'
  });
}

Exemplo de payload de evento de Assinatura


PropriedadeTipoObrigatórioDescrição
business_idstringSimO identificador exclusivo do negócio
timestampstringSimO carimbo de data/hora de quando o evento ocorreu (não necessariamente o mesmo de quando foi entregue)
typestringSimO tipo do evento. Veja Tipos de Evento
dataobjectSimA carga principal de dados. Veja Objeto de Dados

Mudando Planos de Assinatura

Você pode atualizar ou rebaixar um plano de assinatura usando o endpoint da API de mudança de plano. Isso permite que você modifique o produto da assinatura, a quantidade e gerencie a prorrata.

Change Plan API Reference

Para obter informações detalhadas sobre alteração de planos de assinatura, consulte nossa documentação da API de Alteração de Plano.

Opções de Prorrata

Ao mudar planos de assinatura, você tem duas opções para gerenciar a cobrança imediata:

1. prorated_immediately

  • Calcula o valor proporcional com base no tempo restante no ciclo de cobrança atual
  • Cobra o cliente apenas pela diferença entre o plano antigo e o novo
  • Durante um período de teste, isso mudará imediatamente o usuário para o novo plano, cobrando o cliente na hora

2. full_immediately

  • Cobra o cliente o valor total da nova assinatura
  • Ignora qualquer tempo restante ou créditos do plano anterior
  • Útil quando você deseja redefinir o ciclo de cobrança ou cobrar o valor integral independentemente da prorrata

3. difference_immediately

  • Ao fazer um upgrade, o cliente é cobrado imediatamente pela diferença entre os valores dos dois planos.
  • Por exemplo, se o plano atual custa 30 dólares e o cliente fazer upgrade para 80 dólares, ele será cobrado instantaneamente em 50 dólares.
  • Ao fazer downgrade, o valor não utilizado do plano atual é adicionado como crédito interno e automaticamente aplicado às futuras renovações da assinatura.
  • Por exemplo, se o plano atual custa 50 dólares e o cliente mudar para um plano de 20 dólares, os 30 dólares restantes são creditados e usados para o próximo ciclo de cobrança.

Comportamento

  • Ao invocar esta API, a Dodo Payments inicia imediatamente uma cobrança com base na opção de prorrata selecionada
  • Se a mudança de plano for um downgrade e você utilizar prorated_immediately, os créditos serão calculados automaticamente e adicionados ao saldo de créditos da assinatura. Esses créditos são específicos daquela assinatura e serão usados apenas para compensar futuros pagamentos recorrentes da mesma assinatura
  • A opção full_immediately ignora os cálculos de crédito e cobra o valor completo do novo plano
Escolha sua opção de prorrata com cuidado: use prorated_immediately para cobrança justa que leva em conta o tempo não utilizado, ou full_immediately quando você quiser cobrar o valor total do novo plano independentemente do ciclo de cobrança atual.

Processamento de Cobrança

  • A cobrança imediata iniciada na mudança de plano geralmente é processada em menos de 2 minutos
  • Se essa cobrança imediata falhar por qualquer motivo, a assinatura é automaticamente suspensa até que o problema seja resolvido

Assinaturas Sob Demanda

Assinaturas sob demanda permitem que você cobre os clientes de forma flexível, não apenas em um cronograma fixo. Este recurso está disponível para todas as contas.
Para criar uma assinatura sob demanda: Para criar uma assinatura sob demanda, use o endpoint da API POST /subscriptions e inclua o campo on_demand no corpo da requisição. Isso permite autorizar um método de pagamento sem cobrança imediata ou definir um preço inicial personalizado. Para cobrar uma assinatura sob demanda: Para cobranças subsequentes, use o endpoint POST /subscriptions/charge e especifique o valor a ser cobrado do cliente por essa transação.
Para um guia completo, passo a passo — incluindo exemplos de requisição/resposta, políticas de retentativa seguras e tratamento de webhooks — consulte o Guia de Assinaturas Sob Demanda.