El callback GET que Zonapagos dispara hacia tu URL de retorno no está firmado. Un atacante que conozca tu URL y un str_id_pago válido podría hacer un GET falso pretendiendo ser Zonapagos:
GET https://micomercio.com/retorno?id_comercio=31416&id_pago=ORDEN-001
Si tu código confía en el callback como fuente de verdad, podrías entregar un producto sin que el pago haya existido.
Siempre verifica con /VerificacionPago desde tu backend. Nunca confíes en el callback como fuente de verdad.
app.get("/pago/retorno", async (req, res) => { const { id_comercio, id_pago } = req.query; // 1. Validar id_comercio if (Number(id_comercio) !== Number(process.env.ZP_ID_COMERCIO)) { return res.status(403).send("Forbidden"); } // 2. SIEMPRE verificar contra Zonapagos (no confiar en el callback) const estado = await verificarConZonapagos(id_pago); // 3. Decidir según lo que dice Zonapagos, NO lo que dice el callback return responderSegunEstado(res, estado);});
IP allowlist (opcional, requiere coordinación con Zonapagos)
[Pendiente con TI: Zonapagos debería publicar el rango de IPs desde donde origina los callbacks, para que los comercios puedan restringir por IP. Actualmente no hay documentación pública de esos rangos.]