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.]