Saltar al contenido principal

Requisitos Previos

Para integrar la API de Dodo Payments, necesitarás:
  • Una cuenta de comerciante de Dodo Payments
  • Credenciales de API (clave de API y clave secreta de webhook) desde el panel de control
Para una guía más detallada sobre los requisitos previos, consulta esta sección.

Integración de API

Sesiones de Pago

Utiliza Checkout Sessions para vender productos de suscripción con un checkout seguro y alojado. Pasa tu producto de suscripción en product_cart y redirige a los clientes a la checkout_url devuelta.
Mixed Checkout: Puedes combinar productos de suscripción con productos de un solo pago en la misma sesión de checkout. Esto permite casos de uso como tarifas de configuración con suscripciones, paquetes de hardware con SaaS y más. Consulta la guía de Checkout Sessions para ver ejemplos.
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();

Respuesta de API

El siguiente es un ejemplo de la respuesta:
{
  "session_id": "cks_Gi6KGJ2zFJo9rq9Ukifwa",
  "checkout_url": "https://test.checkout.dodopayments.com/session/cks_Gi6KGJ2zFJo9rq9Ukifwa"
}
Redirige al cliente a checkout_url.

Webhooks

Al integrar suscripciones, recibirás webhooks para rastrear el ciclo de vida de la suscripción. Estos webhooks te ayudan a gestionar los estados de suscripción y los escenarios de pago de manera efectiva. Para configurar tu endpoint de webhook, sigue nuestra Guía de Integración Detallada.

Tipos de Eventos de Suscripción

Los siguientes eventos de webhook rastrean cambios en el estado de la suscripción:
  1. subscription.active - La suscripción se activa correctamente.
  2. subscription.updated - El objeto de suscripción se actualizó (se dispara con cualquier cambio de campo).
  3. subscription.on_hold - La suscripción se suspende debido a una renovación fallida.
  4. subscription.failed - La creación de la suscripción falló durante la creación del mandato.
  5. subscription.renewed - La suscripción se renueva para el siguiente período de facturación.
Para una gestión confiable del ciclo de vida de la suscripción, recomendamos rastrear estos eventos de suscripción.
Utiliza subscription.updated para obtener notificaciones en tiempo real sobre cualquier cambio de suscripción, manteniendo el estado de tu aplicación sincronizado sin consultar la API.

Escenarios de Pago

Flujo de Pago Exitoso Cuando un pago tiene éxito, recibirás los siguientes webhooks:
  1. subscription.active - Indica la activación de la suscripción
  2. payment.succeeded - Confirma el pago inicial:
    • Para facturación inmediata (0 días de prueba): espera entre 2 y 10 minutos
    • Para días de prueba: cuando este finalice
  3. subscription.renewed - Indica que se ha deducido el pago y la renovación para el siguiente ciclo. (Básicamente, siempre que se deduzca el pago de productos de suscripción, recibirás el webhook subscription.renewed junto con payment.succeeded)
Escenarios de Fallo de Pago
  1. Fallo de suscripción
  • subscription.failed - La creación de la suscripción falló debido a que no se pudo crear un mandato.
  • payment.failed - Indica un pago fallido.
  1. Suscripción en espera
  • subscription.on_hold - La suscripción se pone en espera debido a un pago de renovación fallido o un cargo fallido por cambio de plan.
  • Cuando una suscripción entra en espera, no se renovará automáticamente hasta que se actualice el método de pago.
Mejores prácticas: Para simplificar la implementación, recomendamos rastrear principalmente los eventos de suscripción para administrar el ciclo de vida de la suscripción.

Manejo de Suscripciones en Espera

Cuando una suscripción entra en el estado on_hold, necesitas actualizar el método de pago para reactivarla. Esta sección explica cuándo las suscripciones entran en espera y cómo gestionarlas.

Cuándo las Suscripciones se Ponen en Espera

Una suscripción se pone en espera cuando:
  • Fallo en el pago de renovación: El cargo de renovación automática falla debido a fondos insuficientes, tarjeta expirada o rechazo bancario
  • Fallo en el cargo por cambio de plan: Un cargo inmediato durante la actualización/bajada de plan falla
  • Fallo en la autorización del método de pago: El método de pago no puede ser autorizado para cargos recurrentes
Las suscripciones en estado on_hold no se renovarán automáticamente. Debes actualizar el método de pago para reactivar la suscripción.

Reactivando Suscripciones desde Espera

Para reactivar una suscripción desde el estado on_hold, usa la API Update Payment Method. Esto automáticamente:
  1. Crea un cargo por los adeudos restantes
  2. Genera una factura por el cargo
  3. Procesa el pago con el nuevo método de pago
  4. Reactiva la suscripción al estado active tras el pago exitoso
1

Handle subscription.on_hold webhook

Cuando recibas un webhook subscription.on_hold, actualiza el estado de tu aplicación y notifica al 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

Cuando el cliente esté listo para actualizar su método de pago, llama a la API Update Payment Method:
// 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
}
También puedes usar un ID de método de pago existente si el cliente tiene métodos guardados:
await client.subscriptions.updatePaymentMethod(subscriptionId, {
  type: 'existing',
  payment_method_id: 'pm_abc123'
});
3

Monitor webhook events

Después de actualizar el método de pago, monitorea estos eventos de webhook:
  1. payment.succeeded - El cargo por los adeudos restantes fue exitoso
  2. subscription.active - La suscripción ha sido reactivada
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.'
  });
}

Ejemplo de carga útil de evento de suscripción


PropiedadTipoRequeridoDescripción
business_idstringYesEl identificador único para la empresa
timestampstringYesLa marca de tiempo de cuándo ocurrió el evento (no necesariamente coincide con cuándo se entregó)
typestringYesEl tipo de evento. Consulta Tipos de evento
dataobjectYesLa carga principal de datos. Consulta Objeto de datos

Cambio de Planes de Suscripción

Puedes actualizar o degradar un plan de suscripción utilizando el endpoint de API de cambio de plan. Esto te permite modificar el producto de la suscripción, la cantidad y manejar la prorrata.

Change Plan API Reference

Para obtener información detallada sobre cómo cambiar planes de suscripción, consulta nuestra documentación de la API Change Plan.

Opciones de Prorrata

Al cambiar planes de suscripción, tienes dos opciones para manejar el cargo inmediato:

1. prorated_immediately

  • Calcula el importe prorrateado según el tiempo restante en el ciclo de facturación actual
  • Cobra al cliente solo por la diferencia entre el plan antiguo y el nuevo
  • Durante un período de prueba, esto cambia inmediatamente al usuario al nuevo plan, cobrando al cliente de inmediato

2. full_immediately

  • Cobra al cliente el importe total de la suscripción del nuevo plan
  • Ignora cualquier tiempo restante o crédito del plan anterior
  • Útil cuando quieres reiniciar el ciclo de facturación o cobrar el importe completo sin importar el prorrateo

3. difference_immediately

  • Al actualizar, se cobra inmediatamente al cliente la diferencia entre las dos cantidades del plan.
  • Por ejemplo, si el plan actual cuesta 30 dólares y el cliente actualiza a uno de 80 dólares, se le cobra $50 instantáneamente.
  • Al degradar, el importe no usado del plan actual se añade como crédito interno y se aplica automáticamente a futuras renovaciones de la suscripción.
  • Por ejemplo, si el plan actual cuesta 50 dólares y el cliente cambia a un plan de 20 dólares, los $30 restantes se acreditan y se usan para el siguiente ciclo de facturación.

Comportamiento

  • Cuando invocas esta API, Dodo Payments inicia inmediatamente un cargo basado en la opción de prorrateo seleccionada
  • Si el cambio de plan es una degradación y usas prorated_immediately, los créditos se calculan automáticamente y se añaden al saldo de crédito de la suscripción. Estos créditos son específicos de esa suscripción y solo se utilizarán para compensar futuros pagos recurrentes de la misma suscripción
  • La opción full_immediately evita los cálculos de crédito y cobra el importe completo del nuevo plan
Elige tu opción de prorrateo con cuidado: Usa prorated_immediately para una facturación justa que tenga en cuenta el tiempo no utilizado, o full_immediately cuando quieras cobrar el importe completo del nuevo plan sin importar el ciclo de facturación actual.

Procesamiento de Cargos

  • El cargo inmediato iniciado al cambiar de plan generalmente completa el procesamiento en menos de 2 minutos
  • Si este cargo inmediato falla por cualquier motivo, la suscripción se coloca automáticamente en espera hasta que se resuelva el problema

Suscripciones Bajo Demanda

Las suscripciones bajo demanda te permiten cobrar a los clientes de forma flexible, no solo con un calendario fijo. Esta función está disponible para todas las cuentas.
Para crear una suscripción bajo demanda: Para crear una suscripción bajo demanda, utiliza el endpoint de la API POST /subscriptions e incluye el campo on_demand en el cuerpo de la solicitud. Esto te permite autorizar un método de pago sin un cargo inmediato o establecer un precio inicial personalizado. Para cobrar una suscripción bajo demanda: Para cargos posteriores, utiliza el endpoint POST /subscriptions/charge y especifica el monto a cobrar al cliente por esa transacción.
Para una guía completa paso a paso, incluyendo ejemplos de solicitud/respuesta, políticas de reintento seguras y manejo de webhooks, consulta la Guía de suscripciones bajo demanda.