Visão Geral
Assinaturas sob demanda permitem que você autorize o método de pagamento de um cliente uma vez e, em seguida, cobre valores variáveis sempre que precisar, em vez de em um cronograma fixo.Esse recurso pode precisar ser habilitado na sua conta. Entre em contato com o suporte se você não o vê no seu painel.
- Criar uma assinatura sob demanda (autorizar um mandato com preço inicial opcional)
- Acionar cobranças subsequentes com valores personalizados
- Rastrear resultados usando webhooks
Pré-requisitos
- Conta de comerciante Dodo Payments e chave API
- Segredo de webhook configurado e um endpoint para receber eventos
- Um produto de assinatura no seu catálogo
Como funciona o sob demanda
- Você cria uma assinatura com o objeto
on_demandpara autorizar um método de pagamento e, opcionalmente, coletar uma cobrança inicial. - Mais tarde, você cria cobranças contra essa assinatura com valores personalizados usando o endpoint de cobrança dedicado.
- Você escuta webhooks (por exemplo,
payment.succeeded,payment.failed) para atualizar seu sistema.
Criar uma assinatura sob demanda
Endpoint: POST /subscriptions Principais campos de solicitação (corpo):Parâmetros do Corpo da Solicitação
Parâmetros do Corpo da Solicitação
ID do produto para a assinatura.
Número de unidades. Mínimo 1.
Endereço de cobrança do cliente.
Anexe um cliente existente ou forneça os detalhes do cliente.
Se verdadeiro, cria um link de checkout hospedado para autorização de mandato e pagamento inicial opcional.
Para onde redirecionar o cliente após concluir o checkout hospedado.
Se verdadeiro, autoriza o método de pagamento sem cobrar o cliente durante a criação.
Valor da cobrança inicial (na menor unidade monetária). Se especificado, esse valor substitui o preço original do produto definido durante a criação do produto. Se omitido, o preço armazenado do produto é usado. Exemplo: para cobrar $1,00, passe
100.Substituição de moeda opcional para a cobrança inicial. Padrão é a moeda do produto.
Substituição de descrição opcional para cobrança e itens de linha.
Se verdadeiro, inclui taxas de moeda adaptativa dentro de
product_price. Se falso, as taxas são adicionadas em cima. Ignorado quando a precificação adaptativa está desativada.Criar uma assinatura sob demanda
- Node.js SDK
- Python SDK
- Go SDK
- cURL
Defina
payment_link: true, redirecione o cliente para payment_link para concluir a autorização do mandato.Success
Cobrar uma assinatura sob demanda
Após o mandato ser autorizado, crie cobranças conforme necessário. Endpoint: POST /subscriptions/{subscription_id}/charge Principais campos de solicitação (corpo):Parâmetros do corpo da solicitação de cobrança
Parâmetros do corpo da solicitação de cobrança
Valor a ser cobrado (na menor unidade monetária). Exemplo: para cobrar $25,00, passe
2500.Substituição de moeda opcional para a cobrança.
Substituição de descrição opcional para esta cobrança.
Se verdadeiro, inclui taxas de moeda adaptativa dentro de
product_price. Se falso, as taxas são adicionadas em cima.Metadados adicionais para o pagamento. Se omitido, os metadados da assinatura são usados.
- Node.js SDK
- Python SDK
- Go SDK
- cURL
Success
Tentativas de pagamento
Nosso sistema de detecção de fraudes pode bloquear padrões de retry agressivos (e pode sinalizá-los como testes de cartão potenciais). Siga uma política de retry segura.Princípios para políticas de retry seguras
- Mecanismo de backoff: Use backoff exponencial entre as tentativas.
- Limites de retry: Limite o total de tentativas (máximo de 3–4 tentativas).
- Filtragem inteligente: Tente novamente apenas em falhas recuperáveis (por exemplo, erros de rede/emissor, fundos insuficientes); nunca tente novamente em recusas definitivas.
- Prevenção de teste de cartão: Não tente novamente falhas como
DO_NOT_HONOR,STOLEN_CARD,LOST_CARD,PICKUP_CARD,FRAUDULENT,AUTHENTICATION_FAILURE. - Variar metadados (opcional): Se você mantiver seu próprio sistema de retry, diferencie as tentativas via metadados (por exemplo,
retry_attempt).
Cronograma de retry sugerido (assinaturas)
- 1ª tentativa: Imediata quando você criar a cobrança
- 2ª tentativa: Após 3 dias
- 3ª tentativa: Após mais 7 dias (10 dias no total)
- 4ª tentativa (final): Após mais 7 dias (17 dias no total)
Evite retries em explosão; alinhe ao tempo de autorização
- Ancore as tentativas ao timestamp de autorização original para evitar comportamento de “explosão” em seu portfólio.
- Exemplo: Se o cliente iniciar um teste ou mandato às 13h10 de hoje, agende as tentativas de follow-up às 13h10 nos dias subsequentes conforme seu backoff (por exemplo, +3 dias → 13h10, +7 dias → 13h10).
- Alternativamente, se você armazenar o último horário de pagamento bem-sucedido
T, agende a próxima tentativa emT + X dayspara preservar o alinhamento do horário do dia.
Fuso horário e DST: use um padrão de tempo consistente para agendamento e converta apenas para exibição para manter os intervalos.
Códigos de recusa que você não deve tentar novamente
STOLEN_CARDDO_NOT_HONORFRAUDULENTPICKUP_CARDAUTHENTICATION_FAILURELOST_CARD
Para uma lista abrangente de razões de recusa e se são corrigíveis pelo usuário, consulte a documentação de
Falhas de Transação.
Diretrizes de implementação (sem código)
- Use um agendador/fila que persista timestamps precisos; calcule a próxima tentativa no exato deslocamento de horário (por exemplo,
T + 3 daysno mesmo HH:MM). - Mantenha e faça referência ao último timestamp de pagamento bem-sucedido
Tpara calcular a próxima tentativa; não agrupe várias assinaturas no mesmo instante. - Sempre avalie a última razão de recusa; pare as tentativas para recusas definitivas na lista de exclusão acima.
- Limite tentativas simultâneas por cliente e por conta para evitar picos acidentais.
- Comunique-se proativamente: envie e-mail/SMS ao cliente para atualizar seu método de pagamento antes da próxima tentativa agendada.
- Use metadados apenas para observabilidade (por exemplo,
retry_attempt); nunca tente “evadir” sistemas de fraude/risco rotacionando campos irrelevantes.
Rastrear resultados com webhooks
Implemente o manuseio de webhooks para rastrear a jornada do cliente. Veja Implementando Webhooks.- subscription.active: Mandato autorizado e assinatura ativada
- subscription.failed: Criação falhou (por exemplo, falha de mandato)
- subscription.on_hold: Assinatura colocada em espera (por exemplo, estado não pago)
- payment.succeeded: Cobrança bem-sucedida
- payment.failed: Cobrança falhou
Testes e próximos passos
1
Criar em modo de teste
Use sua chave API de teste para criar a assinatura com
payment_link: true, depois abra o link e conclua o mandato.2
Acionar uma cobrança
Chame o endpoint de cobrança com um pequeno
product_price (por exemplo, 100) e verifique se você recebe payment.succeeded.3
Ir ao vivo
Mude para sua chave API ao vivo uma vez que você tenha validado eventos e atualizações de estado interno.
Resolução de Problemas
- 422 Solicitação Inválida: Certifique-se de que
on_demand.mandate_onlyseja fornecido na criação eproduct_priceseja fornecido para cobranças. - Erros de moeda: Se você substituir
product_currency, confirme se é suportado para sua conta e cliente. - Nenhum webhook recebido: Verifique sua URL de webhook e configuração de segredo de assinatura.