Web Checkout: visión general
Contrato vigente de Web Checkout
POST /v1/checkouts requiere:
external_transaction_id: identificador de la transacción en el sistema del comercio.amount: monto.currency: moneda ISO de 3 letras, por ejemploPEN.
Campos opcionales:
payment_method: por defectoqr.payer.first_nameypayer.last_name: si el comercio conoce el nombre del pagador/cliente.timeout_seconds: vigencia solicitada por el comercio.
YUPY deriva internamente channel=web y resuelve client, counter, location, instrument y policy. Para correlación comercial del Web Checkout use external_transaction_id; source_reference no debe usarse como un segundo identificador comercial.
Hoy, cuando el comercio envía timeout_seconds, ese valor reemplaza el timeout fijo de policy para esa operación. Cuando exista el motor automático de cálculo de timeout, el valor calculado por YUPY tendrá precedencia.
{
"external_transaction_id": "TX-12345",
"amount": "125.50",
"currency": "PEN",
"payment_method": "qr",
"payer": {
"first_name": "Juan",
"last_name": "Perez"
},
"timeout_seconds": 240
}
Respuesta inmediata HTTP 201
{
"external_transaction_id": "TX-12345",
"checkout_uid": "chk_...",
"checkout_token": "cks_...",
"checkout_url": "https://api.yupy.us/v1/checkouts/browser#token=...",
"payment_order_uid": "po_...",
"status": "pending",
"amount": "125.50",
"currency": "PEN",
"payment_method": "qr",
"channel": "web",
"checkout_created_at": "2026-08-28T03:39:50Z",
"timeout_seconds": 240,
"delivery": {}
}
Esta respuesta confirma la creación del Checkout y de la Payment Order asociada. Las notificaciones posteriores de estado se documentan por separado.
Estado documental: Implementado y verificado en Producción.
Web Checkout es la experiencia Web temporal de YUPY para presentar y seguir una operación de pago sin obligar al integrador a construir la UI financiera.
Flujo general
Backend del comercio
→ autentica
→ POST /v1/checkouts
→ recibe checkout_url
Frontend
→ YupyCheckout.open(checkout_url)
YUPY
→ resuelve contexto
→ crea Payment Order
→ presenta QR
→ administra presented, timeout y estado
→ devuelve resultado terminal
Qué muestra el Browser Checkout QR
- branding YUPY;
- nombre del cliente;
- monto;
- QR desde
delivery.image_url; - cuenta, CCI y empresa cuando existen como datos seguros del instrumento;
- instrucciones;
- countdown basado en
expires_at; - estado;
- botón Ya pagué.
SDK
<script src="https://api.yupy.us/v1/checkouts/browser/sdk.js"></script>
const result = await YupyCheckout.open(checkoutUrl);
Endpoints internos del Browser
La experiencia alojada utiliza internamente:
POST /v1/checkouts/browser/context
POST /v1/checkouts/browser/presented
POST /v1/checkouts/browser/status
POST /v1/checkouts/browser/simulate-payment # solo cuando está autorizado
Estos endpoints pertenecen al Browser Checkout y no son la superficie normal de negocio del comercio. El integrador utiliza checkout_url y el SDK.
Presented
Browser registra presentación cuando el QR termina de cargar. Crear checkout no equivale a presentarlo.
Timeout
POO es autoridad. Browser recibe expires_at, muestra el countdown y al llegar a cero consulta nuevamente el estado canónico.
“Ya pagué”
En modo normal, Ya pagué registra en POO la declaración canónica PAYMENT_DECLARED y luego continúa consultando el estado real de la Payment Order. La declaración es no terminal: no marca pagado, no establece confirmed_at y no sustituye la confirmación financiera.
Payment Simulation
YUPY puede habilitar un modo de prueba para un Web Checkout cuando la credencial que lo creó estaba autorizada con payments:simulate.
Browser Context expone únicamente la capacidad segura:
{
"payment_simulation_enabled": true
}
No expone scopes, Client Secret, Bearer ni payment_order_uid como autoridad del navegador.
| Modo | Botón | Comportamiento |
|---|---|---|
| Normal | Ya pagué | Registra PAYMENT_DECLARED en POO y luego consulta /browser/status; no confirma ni fuerza un terminal. |
| Simulación autorizada | Simular pago | La experiencia alojada solicita la simulación autorizada a YUPY y recibe posteriormente el estado canónico. |
La operación Browser de simulación recibe únicamente el checkout_token. YUPY resuelve server-side la sesión y su Payment Order. El navegador no envía como autoridad payment_order_uid, client_id, counter_id, result ni un campo libre simulate=true.
Cuando la simulación está autorizada, YUPY aplica al Payment Order Orchestrator el mismo resultado terminal canónico usado por el flujo normal:
pagado
Después vuelve a consultar el estado real del POO y lo entrega al Browser/SDK. No existen estados simulated, simulation_paid, test_paid ni equivalentes.
Importante: Payment Simulation es una capacidad controlada por YUPY para pruebas. No representa conciliación bancaria real y no puede habilitarse desde el frontend.
Estados terminales
pagado
cancelado
timeout
failed
Cierre manual del modal
{
"status": "cancelled_by_user",
"terminal": false,
"source": "yupy_sdk"
}
Es cierre local de UI; no cancela la Payment Order.
Resultado SDK
{
"status": "pagado",
"terminal": true,
"source": "yupy_checkout"
}
Responsabilidades
| Componente | Responsabilidad |
|---|---|
| Comercio | Autenticarse, crear checkout, conservar su referencia, abrir checkout_url y procesar resultado. |
| YUPY Web Checkout | Resolver contexto, Browser, presented, polling, countdown, SDK bridge y UI. |
| POO | Lifecycle, timeout, concurrencia, delivery y estados terminales. |
master_data |
Counter Web, policies, instrumento, QR, cuenta y timeout configurado. |