Saltar al contenido principal
Validez de la Sesión: Las sesiones de pago son válidas por 24 horas por defecto. Si pasas confirm=true en tu solicitud, la sesión solo será válida por 15 minutos.

Requisitos Previos

1

Cuenta de Dodo Payments

Necesitarás una cuenta de comerciante activa de Dodo Payments con acceso a la API.
2

Credenciales de API

Genera tus credenciales de API desde el panel de Dodo Payments:
3

Configuración de Productos

Crea tus productos en el panel de Dodo Payments antes de implementar sesiones de pago.

Creando Tu Primera Sesión de Pago

import DodoPayments from 'dodopayments';

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

async function createCheckoutSession() {
  try {
    const session = await client.checkoutSessions.create({
      // Products to sell - use IDs from your Dodo Payments dashboard
      product_cart: [
        {
          product_id: 'prod_123', // Replace with your actual product ID
          quantity: 1
        }
      ],
      
      // Pre-fill customer information to reduce friction
      customer: {
        email: '[email protected]',
        name: 'John Doe',
        phone_number: '+1234567890'
      },
      
      // Billing address for tax calculation and compliance
      billing_address: {
        street: '123 Main St',
        city: 'San Francisco',
        state: 'CA',
        country: 'US', // Required: ISO 3166-1 alpha-2 country code
        zipcode: '94102'
      },
      
      // Where to redirect after successful payment
      return_url: 'https://yoursite.com/checkout/success',
      
      // Custom data for your internal tracking
      metadata: {
        order_id: 'order_123',
        source: 'web_app'
      }
    });

    // Redirect your customer to this URL to complete payment
    console.log('Checkout URL:', session.checkout_url);
    console.log('Session ID:', session.session_id);
    
    return session;
    
  } catch (error) {
    console.error('Failed to create checkout session:', error);
    throw error;
  }
}

// Example usage in an Express.js route
app.post('/create-checkout', async (req, res) => {
  try {
    const session = await createCheckoutSession();
    res.json({ checkout_url: session.checkout_url });
  } catch (error) {
    res.status(500).json({ error: 'Failed to create checkout session' });
  }
});

Respuesta de la API

Todos los métodos anteriores devuelven la misma estructura de respuesta:
{
  "session_id": "cks_Gi6KGJ2zFJo9rq9Ukifwa",
  "checkout_url": "https://test.checkout.dodopayments.com/session/cks_Gi6KGJ2zFJo9rq9Ukifwa"
}
1

Obtener la URL de pago

Extrae el checkout_url de la respuesta de la API.
2

Redirigir a tu cliente

Dirige a tu cliente a la URL de pago para completar su compra.
// Redirect immediately
window.location.href = session.checkout_url;

// Or open in new window
window.open(session.checkout_url, '_blank');
Opciones de Integración Alternativas: En lugar de redirigir, puedes incrustar el proceso de pago directamente en tu página utilizando Overlay Checkout (superposición modal) o Inline Checkout (totalmente incrustado). Ambas opciones utilizan la misma URL de sesión de pago.
3

Manejar el retorno

Después del pago, los clientes son redirigidos a tu return_url con parámetros de consulta adicionales para el estado del pago.

Cuerpo de la Solicitud

Campos Requeridos

Campos esenciales necesarios para cada sesión de pago

Campos Opcionales

Configuración adicional para personalizar tu experiencia de pago

Campos Requeridos

product_cart
array
requerido
Array de productos a incluir en la sesión de pago. Cada producto debe tener un product_id válido de tu panel de Dodo Payments.
Pago Mixto: Puedes combinar productos de pago único y productos de suscripción en la misma sesión de pago. Esto permite casos de uso potentes como tarifas de configuración con suscripciones, paquetes de hardware con SaaS, y más.
Encuentra tus IDs de Producto: Puedes encontrar los IDs de producto en tu panel de Dodo Payments bajo Productos → Ver Detalles, o utilizando la API de Listar Productos.

Campos Opcionales

Configura estos campos para personalizar la experiencia de pago y agregar lógica comercial a tu flujo de pago.
customer
object
Información del cliente. Puedes adjuntar un cliente existente usando su ID o crear un nuevo registro de cliente durante el pago.
Adjunta un cliente existente a la sesión de pago usando su ID.
billing_address
object
Información de la dirección de facturación para un cálculo preciso de impuestos, prevención de fraude y cumplimiento normativo.
Cuando confirm está configurado en true, todos los campos de dirección de facturación se vuelven obligatorios para la creación exitosa de la sesión.
allowed_payment_method_types
array
Controla qué métodos de pago están disponibles para los clientes durante el pago. Esto ayuda a optimizar para mercados específicos o requisitos comerciales.Opciones Disponibles: credit, debit, upi_collect, upi_intent, apple_pay, google_pay, amazon_pay, klarna, affirm, afterpay_clearpay, sepa, ach, cashapp, multibanco, bancontact_card, eps, ideal, przelewy24, paypal
Crítico: Siempre incluye credit y debit como opciones de respaldo para prevenir fallos en el pago cuando los métodos de pago preferidos no están disponibles.
Ejemplo:
["apple_pay", "google_pay", "credit", "debit"]
billing_currency
string
Sobrescribir la selección de moneda predeterminada con una moneda de facturación fija. Usa códigos de moneda ISO 4217.Monedas Soportadas: USD, EUR, GBP, CAD, AUD, INR, y másEjemplo: "USD" para Dólares Estadounidenses, "EUR" para Euros
Este campo solo es efectivo cuando la fijación de precios adaptativa está habilitada. Si la fijación de precios adaptativa está deshabilitada, se usará la moneda predeterminada del producto.
show_saved_payment_methods
boolean
predeterminado:"false"
Mostrar métodos de pago previamente guardados para clientes recurrentes, mejorando la velocidad de pago y la experiencia del usuario.
return_url
string
URL para redirigir a los clientes después de un pago exitoso o cancelación.
confirm
boolean
predeterminado:"false"
Si es verdadero, finaliza todos los detalles de la sesión de inmediato. La API generará un error si falta información requerida.
discount_code
string
Aplica un código de descuento a la sesión de pago.
metadata
object
Pares clave-valor personalizados para almacenar información adicional sobre la sesión.
force_3ds
boolean
Sobrescribir el comportamiento predeterminado de 3DS del comerciante para esta sesión.
minimal_address
boolean
predeterminado:"false"
Habilitar el modo de recopilación de dirección mínima. Cuando está habilitado, el pago solo recopila:
  • País: Siempre requerido para la determinación de impuestos
  • Código ZIP/Postales: Solo en regiones donde es necesario para el cálculo de impuestos sobre ventas, IVA o GST
Esto reduce significativamente la fricción en el pago al eliminar campos de formulario innecesarios.
Habilita la dirección mínima para completar el pago más rápido. La recopilación de dirección completa sigue estando disponible para empresas que requieren detalles de facturación completos.
customization
object
Personaliza la apariencia y el comportamiento de la interfaz de pago.
feature_flags
object
Configura características y comportamientos específicos para la sesión de pago.
subscription_data
object
Configuración adicional para sesiones de pago que contienen productos de suscripción.

Ejemplos de Uso

Aquí hay 10 ejemplos completos que muestran diferentes configuraciones de sesiones de pago para varios escenarios comerciales:

1. Pago Simple de Producto Único

const session = await client.checkoutSessions.create({
  product_cart: [
    {
      product_id: 'prod_ebook_guide',
      quantity: 1
    }
  ],
  customer: {
    email: '[email protected]',
    name: 'John Doe'
  },
  return_url: 'https://yoursite.com/success'
});

2. Carrito de Múltiples Productos

const session = await client.checkoutSessions.create({
  product_cart: [
    {
      product_id: 'prod_laptop',
      quantity: 1
    },
    {
      product_id: 'prod_mouse',
      quantity: 2
    },
    {
      product_id: 'prod_warranty',
      quantity: 1
    }
  ],
  customer: {
    email: '[email protected]',
    name: 'John Doe',
    phone_number: '+1234567890'
  },
  billing_address: {
    street: '123 Tech Street',
    city: 'San Francisco',
    state: 'CA',
    country: 'US',
    zipcode: '94102'
  },
  return_url: 'https://electronics-store.com/order-confirmation'
});

3. Suscripción con Período de Prueba

const session = await client.checkoutSessions.create({
  product_cart: [
    {
      product_id: 'prod_monthly_plan',
      quantity: 1
    }
  ],
  subscription_data: {
    trial_period_days: 14
  },
  customer: {
    email: '[email protected]',
    name: 'Jane Smith'
  },
  return_url: 'https://saas-app.com/onboarding',
  metadata: {
    plan_type: 'professional',
    referral_source: 'google_ads'
  }
});

4. Pago Pre-confirmado

Cuando confirm está configurado en true, el cliente será llevado directamente a la página de pago, omitiendo cualquier paso de confirmación.
const session = await client.checkoutSessions.create({
  product_cart: [
    {
      product_id: 'prod_premium_course',
      quantity: 1
    }
  ],
  customer: {
    email: '[email protected]',
    name: 'Alex Johnson',
    phone_number: '+1555123456'
  },
  billing_address: {
    street: '456 University Ave',
    city: 'Boston',
    state: 'MA',
    country: 'US',
    zipcode: '02134'
  },
  confirm: true,
  return_url: 'https://learning-platform.com/course-access',
  metadata: {
    course_category: 'programming',
    enrollment_date: '2024-01-15'
  }
});

5. Pago con Sobrescritura de Moneda

La sobrescritura billing_currency solo tiene efecto cuando la moneda adaptativa está habilitada en la configuración de tu cuenta. Si la moneda adaptativa está deshabilitada, este parámetro no tendrá efecto.
const session = await client.checkoutSessions.create({
  product_cart: [
    {
      product_id: 'prod_consulting_service',
      quantity: 1
    }
  ],
  customer: {
    email: '[email protected]',
    name: 'Oliver Williams'
  },
  billing_address: {
    street: '789 Business Park',
    city: 'London',
    state: 'England',
    country: 'GB',
    zipcode: 'SW1A 1AA'
  },
  billing_currency: 'GBP',
  feature_flags: {
    allow_currency_selection: true,
    allow_tax_id: true
  },
  return_url: 'https://consulting-firm.com/service-confirmation'
});

6. Métodos de Pago Guardados para Clientes Recurrentes

const session = await client.checkoutSessions.create({
  product_cart: [
    {
      product_id: 'prod_monthly_subscription',
      quantity: 1
    }
  ],
  customer: {
    email: '[email protected]',
    name: 'Robert Johnson',
    phone_number: '+1555987654'
  },
  show_saved_payment_methods: true,
  feature_flags: {
    allow_phone_number_collection: true,
    always_create_new_customer: false
  },
  return_url: 'https://subscription-service.com/welcome-back',
  metadata: {
    customer_tier: 'premium',
    account_age: 'returning'
  }
});

7. Pago B2B con Recopilación de ID Fiscal

const session = await client.checkoutSessions.create({
  product_cart: [
    {
      product_id: 'prod_enterprise_license',
      quantity: 5
    }
  ],
  customer: {
    email: '[email protected]',
    name: 'Sarah Davis',
    phone_number: '+1800555000'
  },
  billing_address: {
    street: '1000 Corporate Blvd',
    city: 'New York',
    state: 'NY',
    country: 'US',
    zipcode: '10001'
  },
  feature_flags: {
    allow_tax_id: true,
    allow_phone_number_collection: true,
    always_create_new_customer: false
  },
  return_url: 'https://enterprise-software.com/license-delivery',
  metadata: {
    customer_type: 'enterprise',
    contract_id: 'ENT-2024-001',
    sales_rep: '[email protected]'
  }
});

8. Pago con Tema Oscuro y Código de Descuento

const session = await client.checkoutSessions.create({
  product_cart: [
    {
      product_id: 'prod_gaming_chair',
      quantity: 1
    }
  ],
  discount_code: 'BLACKFRIDAY2024',
  customization: {
    theme: 'dark',
    show_order_details: true,
    show_on_demand_tag: false
  },
  feature_flags: {
    allow_discount_code: true
  },
  customer: {
    email: '[email protected]',
    name: 'Mike Chen'
  },
  return_url: 'https://gaming-store.com/order-complete'
});

9. Métodos de Pago Regionales (UPI para India)

const session = await client.checkoutSessions.create({
  product_cart: [
    {
      product_id: 'prod_online_course_hindi',
      quantity: 1
    }
  ],
  allowed_payment_method_types: [
    'upi_collect',
    'upi_intent',
    'credit',
    'debit'
  ],
  customer: {
    email: '[email protected]',
    name: 'Priya Sharma',
    phone_number: '+919876543210'
  },
  billing_address: {
    street: 'MG Road',
    city: 'Bangalore',
    state: 'Karnataka',
    country: 'IN',
    zipcode: '560001'
  },
  billing_currency: 'INR',
  return_url: 'https://education-platform.in/course-access',
  metadata: {
    region: 'south_india',
    language: 'hindi'
  }
});

10. Pago BNPL (Compra Ahora, Paga Después)

const session = await client.checkoutSessions.create({
  product_cart: [
    {
      product_id: 'prod_luxury_watch',
      quantity: 1
    }
  ],
  allowed_payment_method_types: [
    'klarna',
    'affirm',
    'afterpay_clearpay',
    'credit',
    'debit'
  ],
  customer: {
    email: '[email protected]',
    name: 'Emma Thompson',
    phone_number: '+1234567890'
  },
  billing_address: {
    street: '555 Fashion Ave',
    city: 'Los Angeles',
    state: 'CA',
    country: 'US',
    zipcode: '90210'
  },
  feature_flags: {
    allow_phone_number_collection: true
  },
  return_url: 'https://luxury-store.com/purchase-confirmation',
  metadata: {
    product_category: 'luxury',
    price_range: 'high_value'
  }
});

11. Usando Métodos de Pago Existentes para Pago Instantáneo

Utiliza el método de pago guardado de un cliente para crear una sesión de pago que se procese de inmediato, omitiendo la recolección del método de pago:
const session = await client.checkoutSessions.create({
  product_cart: [
    {
      product_id: 'prod_premium_plan',
      quantity: 1
    }
  ],
  customer: {
    customer_id: 'cus_123'  // Required when using payment_method_id
  },
  payment_method_id: 'pm_abc123',  // Use customer's saved payment method
  confirm: true,  // Required when using payment_method_id
  return_url: 'https://yourapp.com/success'
});
Al usar payment_method_id, confirm debe configurarse en true y debe proporcionarse un customer_id existente. El método de pago será validado para verificar su elegibilidad con la moneda del pago.
El método de pago debe pertenecer al cliente y ser compatible con la moneda del pago. Esto permite compras con un solo clic para clientes recurrentes.

12. Enlaces Cortos para URLs de Pago Más Limpias

Genera enlaces de pago acortados y compartibles con slugs personalizados:
const session = await client.checkoutSessions.create({
  product_cart: [
    {
      product_id: 'prod_monthly_subscription',
      quantity: 1
    }
  ],
  short_link: true,  // Generate a shortened payment link
  return_url: 'https://yourapp.com/success',
  customer: {
    email: '[email protected]',
    name: 'John Doe'
  }
});

// The checkout_url will be a shortened, cleaner link
console.log(session.checkout_url);  // e.g., https://checkout.dodopayments.com/buy/abc123
Los enlaces cortos son perfectos para compartir por SMS, correo electrónico o redes sociales. Son más fáciles de recordar y generan más confianza en los clientes que las URLs largas.

13. Omitir Página de Éxito de Pago con Redirección Inmediata

Redirige a los clientes inmediatamente después de completar el pago, omitiendo la página de éxito predeterminada:
const session = await client.checkoutSessions.create({
  product_cart: [
    {
      product_id: 'prod_digital_product',
      quantity: 1
    }
  ],
  feature_flags: {
    redirect_immediately: true  // Skip success page, redirect immediately
  },
  return_url: 'https://yourapp.com/success',
  customer: {
    email: '[email protected]',
    name: 'Jane Smith'
  }
});
Usa redirect_immediately: true cuando tengas una página de éxito personalizada que ofrezca una mejor experiencia de usuario que la página de éxito de pago predeterminada. Esto es especialmente útil para aplicaciones móviles y flujos de pago incrustados.
Cuando redirect_immediately está habilitado, los clientes son redirigidos a tu return_url inmediatamente después de completar el pago, omitiendo completamente la página de éxito predeterminada.

Pasando de Enlaces Dinámicos a Sesiones de Pago

Diferencias Clave

Anteriormente, al crear un enlace de pago con Enlaces Dinámicos, se requería proporcionar la dirección de facturación completa del cliente. Con las Sesiones de Pago, esto ya no es necesario. Simplemente puedes pasar la información que tengas, y nosotros nos encargaremos del resto. Por ejemplo:
  • Si solo conoces el país de facturación del cliente, solo proporciona eso.
  • El flujo de pago recogerá automáticamente los detalles faltantes antes de llevar al cliente a la página de pago.
  • Por otro lado, si ya tienes toda la información requerida y deseas saltar directamente a la página de pago, puedes pasar el conjunto de datos completo e incluir confirm=true en el cuerpo de tu solicitud.

Proceso de Migración

Migrar de Enlaces Dinámicos a Sesiones de Pago es sencillo:
1

Actualiza tu integración

Actualiza tu integración para usar el nuevo método de API o SDK.
2

Ajusta la carga útil de la solicitud

Ajusta la carga útil de la solicitud de acuerdo con el formato de las Sesiones de Pago.
3

¡Eso es todo!

Sí. No se necesita manejo adicional ni pasos de migración especiales de tu parte.