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 Sessões de Checkout para vender produtos de assinatura com um checkout seguro e hospedado. Passe seu produto de assinatura em product_cart e redirecione os clientes para o checkout_url retornado.
Você não pode misturar produtos de assinatura com produtos de pagamento único na mesma sessão de checkout.
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: '[email protected]',
      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 - A assinatura foi ativada com sucesso.
  2. subscription.updated - O objeto de assinatura foi atualizado (dispara em qualquer alteração de campo).
  3. subscription.on_hold - A assinatura foi suspensa devido à falha na renovação.
  4. subscription.failed - A criação da assinatura falhou durante a criação do mandato.
  5. subscription.renewed - A assinatura foi renovada para o próximo período 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 mudanças na assinatura, mantendo o estado da sua aplicação em sincronia sem precisar 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 a 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: sempre que isso terminar
  3. subscription.renewed - Indica a dedução do pagamento e a renovação para o próximo ciclo. (Basicamente, sempre que o pagamento for deduzido 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 de um mandato.
  • payment.failed - Indica pagamento falhado.
  1. Assinatura Suspensa
  • subscription.on_hold - A assinatura foi suspensa devido à falha no pagamento de renovação ou na cobrança de mudança de plano.
  • Quando uma assinatura é suspensa, 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 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 suspensas e como tratá-las.

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 do estado on_hold, use a API de Atualização do Método de Pagamento. Isso automaticamente:
  1. Cria uma cobrança para as pendências 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

Tratar webhook subscription.on_hold

Quando você receber um subscription.on_hold webhook, 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

Atualizar método de pagamento

Quando o cliente estiver pronto para atualizar seu método de pagamento, chame a API de Atualização do 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 de pagamento salvos:
await client.subscriptions.updatePaymentMethod(subscriptionId, {
  type: 'existing',
  payment_method_id: 'pm_abc123'
});
3

Monitorar eventos de webhook

Após atualizar o método de pagamento, monitore estes eventos de webhook:
  1. payment.succeeded - A cobrança das pendências 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 único para o negócio
timestampstringSimO timestamp de quando o evento ocorreu (não necessariamente o mesmo que quando foi entregue)
typestringSimO tipo de evento. Veja Tipos de Eventos
dataobjectSimO payload de dados principal. 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.

Referência da API de Mudança de Plano

Para informações detalhadas sobre como mudar planos de assinatura, consulte nossa documentação da API de Mudança 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 do cliente apenas a 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 imediatamente

2. full_immediately

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

3. difference_immediately

  • Ao atualizar, o cliente é cobrado imediatamente pela diferença entre os dois valores do plano.
  • Por exemplo, se o plano atual é 30 Dólares e o cliente atualiza para 80 Dólares, ele é cobrado instantaneamente em 50 Dólares.
  • Ao rebaixar, o valor não utilizado do plano atual é adicionado como crédito interno e aplicado automaticamente às renovações futuras da assinatura.
  • Por exemplo, se o plano atual é 50 Dólares e o cliente muda 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

  • Quando você invoca esta API, o Dodo Payments inicia imediatamente uma cobrança com base na opção de prorrata selecionada
  • Se a mudança de plano for um rebaixamento e você usar prorated_immediately, os créditos serão automaticamente calculados e adicionados ao saldo de crédito da assinatura. Esses créditos são específicos para essa assinatura e serão usados apenas para compensar pagamentos recorrentes futuros da mesma assinatura
  • A opção full_immediately ignora os cálculos de crédito e cobra o valor total do novo plano
Escolha sua opção de prorrata com cuidado: Use prorated_immediately para uma cobrança justa que considere o tempo não utilizado, ou full_immediately quando você deseja 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. Entre em contato com o suporte para habilitar esse recurso.
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 sua solicitação. Isso permite que você autorize um método de pagamento sem uma cobrança imediata ou defina 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 solicitação/resposta, políticas de reintento seguras e tratamento de webhook—veja o Guia de Assinaturas Sob Demanda.