@dodopayments/tanstack proporciona a tu proyecto de TanStack Start tres controladores de solicitudes. Checkout devuelve URL de checkout, CustomerPortal dirige al cliente a Customer Portal y Webhooks verifica los eventos de webhook y los envía a tu código. Cada controlador acepta un Request estándar y devuelve un Response, por lo que puedes llamarlo desde un controlador de rutas del servidor.
Checkout Handler
Crea URL de checkout con flujos estáticos, dinámicos y de sesiones de checkout.
Customer Portal
Permite que los clientes gestionen sus suscripciones y datos.
Webhooks
Recibe y procesa eventos de webhook de Dodo Payments.
Instalación
1
Install the Package
Ejecuta este comando en la raíz de tu proyecto:El paquete también necesita
zod 3.25 o posterior, que aparece como dependencia peer.2
Set Up Environment Variables
Crea un archivo TanStack Start carga archivos
.env en la raíz de tu proyecto. Crea la API key en Developer → API Keys. Añade el endpoint de webhook en Developer → Webhooks y copia su Signing secret en DODO_PAYMENTS_WEBHOOK_KEY:.env, y las rutas del servidor leen los valores desde process.env. DODO_PAYMENTS_RETURN_URL es la página a la que llegan los clientes después del checkout. Si no pasas un entorno, los controladores usan live_mode. Una API key del modo de prueba solo funciona con test_mode.Ejemplos de controladores de rutas
Los ejemplos son rutas del servidor de TanStack Start en
src/routes/api/. Cada una define sus controladores en server.handlers dentro de createFileRoute. Las versiones anteriores de TanStack Start, como la 1.129, definen las rutas del servidor con createServerFileRoute de @tanstack/react-start/server y una llamada a .methods(). Los controladores de Dodo Payments funcionan de la misma manera con ambas API: pásales el request.- Checkout Handler
- Customer Portal Handler
- Webhook Handler
Usa este controlador para añadir el checkout de Dodo Payments a tu aplicación. El controlador
GET proporciona checkout estático. El controlador POST proporciona sesiones de checkout o checkout dinámico cuando estableces type: "dynamic". El ejemplo de checkout dinámico presupone que estableces type: "dynamic".Controlador de rutas de checkout
El controlador de checkout admite las tres formas de aceptar pagos con Dodo Payments:- Enlaces de pago estáticos: URL que se pueden compartir y que recaudan pagos sin código.
- Enlaces de pago dinámicos: Enlaces de pago que generas con datos personalizados. Usan endpoints obsoletos.
- Sesiones de checkout: Checkout alojado con un carrito de productos, datos del cliente y opciones de personalización. Este es el flujo recomendado.
Checkout acepta estas opciones:
El controlador proporciona checkout estático para solicitudes
GET. Para solicitudes POST, crea un enlace de pago dinámico cuando type es dynamic y, en caso contrario, crea una sesión de checkout.
Static Checkout (GET)
Static Checkout (GET)
Parámetros de consulta compatibles
string
requerido
Identificador del producto, por ejemplo
?productId=pdt_nZuwz45WAs64n3l07zpQR.integer
predeterminado:"1"
Cantidad del producto.
string
Nombre completo del cliente. Se ignora si se proporciona
firstName o lastName.string
Nombre del cliente.
string
Apellidos del cliente.
string
Dirección de correo electrónico del cliente.
string
País del cliente, como código ISO 3166-1 alpha-2.
string
Dirección postal del cliente.
string
Ciudad del cliente.
string
Estado o provincia del cliente.
string
Código postal del cliente.
boolean
Establécelo en
true para deshabilitar el campo de nombre completo.boolean
Establécelo en
true para deshabilitar el campo de nombre.boolean
Establécelo en
true para deshabilitar el campo de apellidos.boolean
Establécelo en
true para deshabilitar el campo de correo electrónico.boolean
Establécelo en
true para deshabilitar el campo de país.boolean
Establécelo en
true para deshabilitar el campo de dirección.boolean
Establécelo en
true para deshabilitar el campo de ciudad.boolean
Establécelo en
true para deshabilitar el campo de estado.boolean
Establécelo en
true para deshabilitar el campo de código postal.string
Moneda del pago, por ejemplo
USD.boolean
predeterminado:"true"
Muestra u oculta el selector de moneda.
number
Fija el importe cobrado, en unidades principales de la moneda, por ejemplo
12.5 para $12.50. Solo funciona con productos Pay What You Want y se ignora si está por debajo del precio mínimo del producto.boolean
predeterminado:"true"
Muestra u oculta la sección de descuentos.
string
Cualquier parámetro de consulta que empiece por
metadata_ se pasa al checkout como metadata, por ejemplo metadata_orderId=123.email con disableEmail=true. El controlador añade returnUrl de su configuración al enlace como redirect_url.Formato de respuesta
El checkout estático devuelve una respuesta JSON con la URL de checkout. En el modo de prueba, la URL usatest.checkout.dodopayments.com:Dynamic Checkout (POST)
Dynamic Checkout (POST)
- Envía los parámetros como cuerpo JSON en una solicitud POST.
- Admite pagos únicos y recurrentes. El controlador recupera el producto y, después, crea una suscripción si el producto es recurrente o un pago único en caso contrario.
- El cuerpo necesita
billing(constreet,city,state,countryyzipcode) ycustomer, además deproduct_idoproduct_cart. Las suscripciones necesitanproduct_id. - Para consultar todos los campos compatibles del cuerpo, visita:
Formato de respuesta
El checkout dinámico devuelve una respuesta JSON con el enlace de pago como URL de checkout:Checkout Sessions (POST)
Checkout Sessions (POST)
Las sesiones de checkout crean un checkout alojado para compras únicas y suscripciones, con control total sobre la personalización.
product_cart es el único campo obligatorio y necesita al menos un producto. Si el cuerpo no contiene return_url, el controlador usa returnUrl de su configuración.Cada checkout_url funciona una vez y caduca después de 24 horas o después de 15 minutos cuando pasas confirm: true. Una sesión creada con payment_method_id no devuelve checkout_url, por lo que el controlador responde con 400.Para obtener más información y consultar todos los campos compatibles, visita la Guía de integración de Checkout Sessions.Formato de respuesta
Las sesiones de checkout devuelven una respuesta JSON con la URL de checkout:Controlador de rutas de Customer Portal
El controlador de rutas de Customer Portal crea una sesión de Customer Portal para el cliente que indiques y redirige el navegador a ella.CustomerPortal acepta las mismas opciones bearerToken y environment que Checkout.
Parámetros de consulta
string
requerido
El ID de cliente de la sesión del portal, por ejemplo
?customer_id=cus_123.boolean
Si se establece en
true, Dodo Payments también envía por correo electrónico el enlace del portal al cliente.customer_id y 500 si no se puede crear la sesión del portal.
Controlador de rutas de webhook
El controlador de rutas de webhook verifica cada solicitud con tu secreto de webhook, que se pasa comowebhookKey, antes de ejecutar tu código:
- Método: Solo se admiten solicitudes POST. Los demás métodos devuelven 405.
- Verificación de firma: Verifica los encabezados
webhook-id,webhook-timestampywebhook-signatureconwebhookKey, siguiendo la especificación Standard Webhooks. Devuelve 401 si la verificación falla. - Validación de payload: Valida el payload con Zod. Devuelve 400 si el payload no es válido.
- Gestión de errores:
- 401: Firma no válida
- 400: Payload no válido
- 500: Error interno durante la verificación
- Enrutamiento de eventos: Llama a
onPayloadpara cada evento, después al controlador correspondiente al tipo de evento y devuelve 200.