Skip to main content
Las sesiones de pago crean una URL de checkout hospedada por Quentli. Úsalas para cobrar un importe puntual, varios conceptos o facturas existentes desde tu integración.
Si el cobro representa un adeudo que debes programar y gestionar con recordatorios o reintentos automáticos, sigue Sincroniza facturas en Quentli.
Crea la sesión desde tu servidor. Nunca expongas tu API key de Quentli en el navegador o una aplicación móvil.

¿Cuándo usar una sesión de pago?

  • Para enviar un link de checkout de un cobro puntual.
  • Para cobrar varios conceptos en una misma sesión.
  • Para mostrar una sesión que paga facturas existentes.
Si solo necesitas guardar un método de pago sin cobrar ahora, usa una sesión de inscripción.

1. Crea una sesión de pago

Envía un cliente y elige exactamente una de estas tres formas de definir el cobro. No combines invoiceIds con importes o conceptos.
Usa amount, currency y description para crear un cobro único con un solo concepto.
POST /v1/payment-sessions
Los importes se expresan en centavos. Todos los elementos de items y todas las facturas de una sesión deben usar la misma moneda. La sesión toma el saldo pendiente actual de las facturas al crearla.

Ejemplo desde el servidor

2. Muestra el checkout al cliente

La respuesta incluye la url del checkout, el objeto paymentSession y las credenciales temporales session. Estas credenciales se usan con @quentli/js para mostrar el checkout dentro de tu aplicación.
Respuesta

Opción 1: Customer Portal

Con CUSTOMER_PORTAL, el modo predeterminado, redirige al cliente a la URL hospedada por Quentli:
También puedes usar el SDK para la redirección:

Opción 2: Popup con @quentli/js

Usa displayMode: "EMBEDDED" al crear la sesión y abre el checkout en un popup. El cliente permanece en tu aplicación y recibes callbacks al completar, cancelar o fallar el flujo.

Opción 3: Iframe con @quentli/js

Usa displayMode: "CUSTOM" para incrustar el checkout en un contenedor de tu página:
Para los modos popup e iframe, entrega url y session desde tu backend a tu frontend. No guardes las credenciales de session; son temporales. Llama a quentli.destroy() cuando desmontes el componente o termines de usar la instancia.
Para CUSTOMER_PORTAL, normalmente solo necesitas url. Para popup e iframe, session contiene los tokens que requiere el SDK.

3. Confirma el resultado

No marques el cobro como pagado solo porque el cliente llegue a returnUrl o se invoque onComplete. Procesa el webhook PAYMENT_COMPLETED y conserva su eventId de forma idempotente. También puedes consultar la sesión sin API key; el endpoint devuelve null cuando no existe:
Una sesión puede estar PENDING, FINALIZED, CANCELED o EXPIRED.

Resolución del cliente

Quentli busca o crea el cliente usando estos campos, en este orden:
  • externalId: identificador único de tu sistema, guardado como username en Quentli.
  • phoneNumber: teléfono en formato E.164.
  • email: correo electrónico del cliente.
Si no existe ningún cliente con esos datos, Quentli crea uno nuevo. externalId tiene prioridad cuando encuentra un cliente. Usa meta para guardar identificadores externos tanto en el cliente como en la sesión. No envíes meta y el campo deprecado metadata en la misma solicitud.

Usa forceUpdate con cuidado

Usa forceUpdate: true solo cuando tu sistema sea la fuente de verdad de los datos de contacto. Si otro cliente de la misma organización tiene el email o phoneNumber enviado, Quentli mueve ese dato al cliente resuelto. Sin forceUpdate, Quentli no mueve correos ni teléfonos entre clientes y la solicitud falla ante una coincidencia que podría sobrescribir datos por accidente.
forceUpdate puede mover un correo o teléfono de un cliente a otro dentro de la misma organización.