Principios
Loguea lo suficiente para reconstruir qué pasó con cualquier transacción.
Nunca loguees credenciales (str_clave, str_pwd_Comercio).
Usa logs estructurados (JSON) para poder filtrar y buscar.
Incluye str_id_pago en cada log relacionado con una transacción.
Retén logs por al menos 1 año (requerimiento para auditorías financieras).
Campos obligatorios por log
Cada log de una transacción debe incluir:
Campo Descripción str_id_pagoID del pago en tu comercio. int_id_comercioTu comercio (si manejas multi-comercio). timestampISO 8601 con timezone. levelinfo / warn / error. eventAcción específica (inicio_pago_ok, verificacion_exitosa, etc.). request_idUUID que correlacione tu request con logs en downstream.
Eventos a loguear
En InicioPago
// Antes del request
logger . info ( "zonapagos.inicio_pago.request" , {
str_id_pago: body . InformacionPago . str_id_pago ,
monto: body . InformacionPago . flt_total_con_iva ,
email: maskEmail ( body . InformacionPago . str_email ),
codigo_servicio: body . AdicionalesConfiguracion . find ( c => c . int_codigo === 50 )?. str_valor
// NO loguear str_clave
});
// Respuesta exitosa
logger . info ( "zonapagos.inicio_pago.ok" , {
str_id_pago ,
int_codigo: data . int_codigo ,
url_rut: extraerRutDeUrl ( data . str_url ), // Solo el token, no la URL completa
duracion_ms: Date . now () - inicioMs
});
// Respuesta con error
logger . warn ( "zonapagos.inicio_pago.error" , {
str_id_pago ,
int_codigo: data . int_codigo ,
str_descripcion_error: data . str_descripcion_error ,
duracion_ms: Date . now () - inicioMs
});
En VerificacionPago
logger . info ( "zonapagos.verificacion.response" , {
str_id_pago ,
int_estado: data . int_estado ,
int_error: data . int_error ,
int_cantidad_pagos: data . int_cantidad_pagos ,
int_estado_pago: ultimo ?. int_estado_pago ,
int_id_forma_pago: ultimo ?. int_id_forma_pago ,
str_codigo_transaccion: ultimo ?. str_codigo_transaccion , // CUS para PSE
duracion_ms
});
En callback del usuario
logger . info ( "zonapagos.callback_recibido" , {
str_id_pago: req . query . id_pago ,
id_comercio: req . query . id_comercio ,
ip_origen: req . ip ,
user_agent: req . headers [ "user-agent" ]
});
En la sonda
logger . info ( "sonda.iteracion.inicio" , { pagos_a_procesar: pendientes . length });
logger . info ( "sonda.pago.consultado" , { str_id_pago , estado_previo , estado_actual });
logger . info ( "sonda.pago.resuelto" , { str_id_pago , estado_final });
logger . info ( "sonda.iteracion.fin" , { duracion_ms , exitosos , errores });
Funciones de sanitización
function maskEmail ( email ) {
if ( ! email ) return null ;
const [ user , domain ] = email . split ( "@" );
return user . slice ( 0 , 2 ) + "***@" + domain ;
}
function maskDocumento ( doc ) {
if ( ! doc || doc . length < 4 ) return "***" ;
return "***" + doc . slice ( - 4 );
}
function extraerRutDeUrl ( url ) {
try {
const u = new URL ( url );
return u . searchParams . get ( "rut" )?. slice ( 0 , 8 ) + "..." ;
} catch { return null ; }
}
function sanitizarRequestBody ( body ) {
// Remover credenciales antes de loguear el body completo
const copia = JSON . parse ( JSON . stringify ( body ));
if ( copia . InformacionSeguridad ) {
copia . InformacionSeguridad . str_clave = "***" ;
}
if ( copia . str_pwd_Comercio ) copia . str_pwd_Comercio = "***" ;
return copia ;
}
Queries útiles
Con logs estructurados (ej. en Datadog, Splunk, ELK), queries típicas:
service:"mi-comercio" event:"zonapagos.inicio_pago.error"
# → ver todos los errores recientes
service:"mi-comercio" str_id_pago:"ORDEN-001"
# → seguir la vida completa de un pago
service:"mi-comercio" event:"sonda.*" @duracion_ms:>10000
# → sondas lentas (>10s)
service:"mi-comercio" event:"zonapagos.verificacion.response" @int_estado_pago:999
# → pagos que quedaron en 999
Alertas basadas en logs
zonapagos.inicio_pago.error > 10 en 5 min → algo se rompió.
sonda.iteracion.inicio no visto en >30 min → el cron murió.
zonapagos.verificacion.response con int_estado: 2 > 5 en 5 min → credenciales rotas.
Ningún zonapagos.callback_recibido en 1 hora si normalmente hay tráfico → posible problema en la URL de retorno o DNS.
Cumplimiento y auditoría
Para auditorías de PSE / SuperFinanciera: retén al menos 1 año de logs con eventos de pago. Algunas auditorías piden hasta 5 años para transacciones financieras. Confirma con tu área legal.
Ver también
Checklist producción Incluye ítem de verificación de logging.