Crea experiencias de pago seguras y alojadas que manejan el flujo completo de pagos tanto para compras únicas como para suscripciones con control total de personalización.
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.
import DodoPayments from 'dodopayments';// Initialize the Dodo Payments clientconst 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: 'customer@example.com', 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 routeapp.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' }); }});
Copiar
import osfrom dodopayments import DodoPayments# Initialize the Dodo Payments clientclient = DodoPayments( bearer_token=os.environ.get("DODO_PAYMENTS_API_KEY"), # This is the default and can be omitted environment="test_mode", # defaults to "live_mode")def create_checkout_session(): """ Create a checkout session for a single product with customer data pre-filled. Returns the session object containing checkout_url for customer redirection. """ try: session = client.checkout_sessions.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 checkout friction customer={ "email": "customer@example.com", "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 print(f"Checkout URL: {session.checkout_url}") print(f"Session ID: {session.session_id}") return session except Exception as error: print(f"Failed to create checkout session: {error}") raise error# Example usage in a Flask routefrom flask import Flask, jsonify, requestapp = Flask(__name__)@app.route('/create-checkout', methods=['POST'])def create_checkout(): try: session = create_checkout_session() return jsonify({"checkout_url": session.checkout_url}) except Exception as error: return jsonify({"error": "Failed to create checkout session"}), 500
Copiar
// Direct API call using fetch - useful for any JavaScript environmentasync function createCheckoutSession() { try { const response = await fetch('https://test.dodopayments.com/checkouts', { method: 'POST', headers: { 'Content-Type': 'application/json', 'Authorization': `Bearer ${process.env.DODO_PAYMENTS_API_KEY}` }, body: JSON.stringify({ // 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 checkout friction customer: { email: 'customer@example.com', 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' } }) }); if (!response.ok) { throw new Error(`HTTP error! status: ${response.status}`); } const session = await response.json(); // 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: Redirect user to checkoutcreateCheckoutSession().then(session => { window.location.href = session.checkout_url;});
Dirige a tu cliente a la URL de pago para completar su compra.
Copiar
// Redirect immediatelywindow.location.href = session.checkout_url;// Or open in new windowwindow.open(session.checkout_url, '_blank');
Opciones de Integración Alternativas: En lugar de redirigir, puedes incrustar el pago directamente en tu página usando 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.
Array de productos a incluir en la sesión de pago. Cada producto debe tener un válido product_id 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 poderosos como tarifas de configuración con suscripciones, paquetes de hardware con SaaS, y más.
Mostrar Propiedades del Artículo del Carrito de Productos
Monto que el cliente paga si pay_what_you_want está habilitado. Si está deshabilitado, este campo será ignorado.Formato: Representado en la denominación más baja de la moneda (por ejemplo, centavos para USD). Por ejemplo, para cobrar $1.00, pasa 100.
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.
Número de teléfono del cliente en formato internacional. Requerido para algunos métodos de pago y prevención de fraude.Formato: Incluye el código de país, por ejemplo, "+1234567890" para números de EE. UU.
Dirección completa incluyendo número de casa, nombre de la calle y número de apartamento/unidad si aplica.Ejemplo: "123 Main St, Apt 4B" o "456 Oak Avenue"
Código de país ISO de dos letras (ISO 3166-1 alpha-2). Este campo siempre es requerido cuando se proporciona la dirección de facturación.Ejemplos: "US" (Estados Unidos), "CA" (Canadá), "GB" (Reino Unido), "DE" (Alemania)
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, apple_pay, google_pay, amazon_pay, klarna, affirm, afterpay_clearpay, 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.
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.
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.
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.
Precio del producto para el cargo inicial al cliente. Si no se especifica, se usará el precio almacenado del producto.Formato: Representado en la denominación más baja de la moneda (por ejemplo, centavos para USD). Por ejemplo, para cobrar $1.00, pasa 100.
Si las tarifas de moneda adaptativa deben incluirse en el precio del producto (verdadero) o añadirse por encima (falso). Ignorado si la fijación de precios adaptativa no está habilitada.
La sobrescritura de 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.
11. Uso de Métodos de Pago Existentes para Checkout Instantáneo
Utilice un método de pago guardado del cliente para crear una sesión de checkout que procese de inmediato, omitiendo la recolección del método de pago:
Copiar
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 utilizar payment_method_id, confirm debe establecerse en true y se debe proporcionar un customer_id existente. El método de pago será validado para 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.
Generar enlaces de pago acortados y compartibles con slugs personalizados:
Copiar
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: 'customer@example.com', name: 'John Doe' }});// The checkout_url will be a shortened, cleaner linkconsole.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 del cliente que las URLs largas.
Utilice redirect_immediately: true cuando tenga una página de éxito personalizada que proporcione 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 checkout integrados.
Cuando redirect_immediately está habilitado, los clientes son redirigidos a su return_url inmediatamente después de completar el pago, omitiendo por completo la página de éxito predeterminada.
Antes de crear una sesión de checkout, puede previsualizar el desglose de precios, incluidos impuestos, descuentos y totales. Esto es útil para mostrar precios precisos a los clientes antes de que procedan al checkout.
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 Checkout, esto ya no es necesario. Simplemente puede proporcionar la información que tenga, y nosotros nos encargaremos del resto. Por ejemplo:
Si solo conoce el país de facturación del cliente, solo proporcione eso.
El flujo de checkout recogerá automáticamente los detalles faltantes antes de llevar al cliente a la página de pago.
Por otro lado, si ya tiene toda la información requerida y desea ir directamente a la página de pago, puede pasar el conjunto completo de datos e incluir confirm=true en el cuerpo de su solicitud.