Success URL: verificar status server-side
Cuando la persona termina, SPIDI la redirige a tu success_url. Es tentador marcar el pedido como pagado ahí mismo. No lo hagas.
Llegar a success_url solo dice que la persona volvió a tu sitio. No prueba que el pago se completó: alguien podría abrir esa URL directamente, o volver sin haber pagado. Confirma siempre desde tu backend.
Las dos formas correctas de confirmar
1. Consultar el status (pull)
Desde tu backend (no desde el navegador), consulta el estado real:
curl https://sim-productos.abiertolab.com/api/v1/ext/payment-sessions/status/<session_id> \
-H "Authorization: Bearer <token>" # -> { "data": { "status": "paid" } }
Marca el pedido como pagado solo si status es paid.
2. Escuchar el webhook (push)
Procesa el aviso payment_session.paid que SPIDI envía a tu webhook_url (firmado). Es la vía más fiable y no depende de que la persona vuelva. → Manejar notificaciones.
Lo ideal es combinar ambas: el webhook te avisa en cuanto ocurre; el
GET statuste sirve de respaldo (al volver asuccess_url, o como reconciliación periódica).
Patrón recomendado (en tu success_url)
// handler de tu success_url — en el SERVIDOR
app.get("/pago-exitoso", async (req, res) => {
const r = await fetch(`${SPIDI}/api/v1/ext/payment-sessions/status/${req.query.session_id}`,
{ headers: { Authorization: `Bearer ${TOKEN}` } });
const { data } = await r.json();
if (data.status === "paid") marcarPedidoPagado(req.query.session_id);
else mostrarPendiente(); // no asumas pago
});
Recordatorio: el dinero confirmado es el leg 2
paid confirma el débito. Que te llegue el dinero es la acreditación (leg 2), que solo conoces por el webhook payment_session.accredited. → Transacción a dos tiempos.