Saltar al contenido principal

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.

La redirección no es una confirmación de pago

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.

Success URL: verifica el status 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 status te sirve de respaldo (al volver a success_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.