Transacción a dos tiempos
Un pago en SPIDI no es un solo evento: es un débito y, después, una acreditación. Entender esto evita el error de integración más común.
Los dos tiempos
Leg 1 — Débito
El primer paso existe para asegurar la recepción efectiva de los fondos: una única transacción de débito a la cuenta del pagador. El pagador paga, se debita el origen y la sesión pasa de pending a uno de:
paid— el pago salió bien (los fondos ya están).failed— el pago fue rechazado (solo aplica al Botón).expired— la sesión venció sin pagarse.
Se emite el webhook payment_session.paid.
Leg 2 — Acreditación
La acreditación solo puede ocurrir después de tener los fondos (leg 1) y de debitar la comisión de la transacción. Con eso hecho, el dinero se acredita a una o varias cuentas, según el acuerdo que elegiste para ese pago. Se emite el webhook payment_session.accredited.
El webhook de acreditación recibe un evento por cada transacción de crédito, uno por cada parte especificada en el acuerdo:
- Acuerdo sin split → una sola parte → un evento (
payment_session.accredited). - Acuerdo con split → una acreditación por receptor + el cierre → varias llamadas a tu mismo
webhook_urlpara esa única sesión. → Split.
El detalle que confunde a todo integrador
status nunca refleja el leg 2Tras paid, el status de la sesión se queda en paid — la acreditación no lo cambia. El leg 2 viaja solo por webhook (payment_session.accredited).
Si tu integración solo consulta GET status esperando un accredited, nunca llegará. Para saber que el dinero se acreditó, escucha el webhook.
Cómo se ve en el tiempo
crear sesión
│ status: pending
▼
LEG 1 debita ──────────► status: paid + webhook payment_session.paid
│
▼
LEG 2 acredita ─────────► status: paid (igual) + webhook payment_session.accredited
(aquí se aplica la comisión)
Por qué importa
- Confirmar el pago (leg 1): consulta
GET statuso escuchapayment_session.paid. - Confirmar que te llegó el dinero (leg 2): escucha
payment_session.accredited— no lo verás en elstatus.
Pruébalo
En el simulador puedes forzar cada tiempo por separado y ver ambos webhooks:
# leg 1 (débito)
curl -X POST https://sim-productos.abiertolab.com/control/sessions/<id>/outcome \
-H "Authorization: Bearer <token>" \
-H "Content-Type: application/json" -d '{"leg":1,"outcome":"paid"}'
# leg 2 (acreditación)
curl -X POST https://sim-productos.abiertolab.com/control/sessions/<id>/outcome \
-H "Authorization: Bearer <token>" \
-H "Content-Type: application/json" -d '{"leg":2,"outcome":"accredited"}'