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: '[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 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": "[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 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: '[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' } }) }); 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;});
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.
Importante: Los carritos de productos múltiples solo pueden contener productos de pago único. No puedes mezclar productos de suscripción con productos de pago único en la misma sesión de pago.
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 corresponde.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, 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.
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.
Anulación opcional de la descripción del producto para facturación y artículos de línea. Si no se especifica, se usará la descripción almacenada del producto.
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 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.
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, simplemente proporciona eso.
El flujo de pago recopilará automáticamente los detalles faltantes antes de mover 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.