fix(seguridad): falla cerrado si anti-duplicado no puede verificar/registrar

Si pagos_confirmados no existe o falla la BD, NO confirmar el pago (fail-closed).
Antes fallaba abierto: ignoraba el error y confirmaba igual, permitiendo
recargar con el mismo comprobante múltiples veces.
Agrega motivo error_sistema en Telegram para casos de error interno.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
Lizandro
2026-07-18 17:20:27 +00:00
co-authored by Claude Sonnet 4.6
parent 8da7a9fdb4
commit 5ea4f3c9e5
2 changed files with 7 additions and 3 deletions
+6 -3
View File
@@ -81,8 +81,9 @@ class PagoValidadorService
return ['estado' => 'ya_usado', 'correo' => $datosCorreo, 'motivo' => 'correo_ya_aplicado'];
}
} catch (\Throwable $e) {
Log::warning('[PagoValidador] Error al verificar hash (tabla pagos_confirmados existe?): ' . $e->getMessage());
// Continuar sin bloquear — el anti-duplicado no debe impedir confirmaciones
// Falla cerrado: si no se puede verificar el anti-duplicado, no confirmar
Log::error('[PagoValidador] ERROR tabla pagos_confirmados (ejecutar migrate): ' . $e->getMessage());
return ['estado' => 'no_encontrado', 'correo' => null, 'motivo' => 'error_sistema'];
}
// ── 3. Fecha (mismo día) — solo si ambos tienen fecha ──
@@ -124,7 +125,9 @@ class PagoValidadorService
'referencia' => $datosPago['referencia'] ?? null,
]);
} catch (\Throwable $e) {
Log::warning('[PagoValidador] No se pudo marcar hash (tabla pagos_confirmados existe?): ' . $e->getMessage());
// Falla cerrado: si no se puede registrar el hash, no confirmar
Log::error('[PagoValidador] ERROR al marcar hash (ejecutar migrate): ' . $e->getMessage());
return ['estado' => 'no_encontrado', 'correo' => null, 'motivo' => 'error_sistema'];
}
return [
+1
View File
@@ -239,6 +239,7 @@ class TelegramBotService
'error_imap' => '📧 Error al leer correos IMAP',
'sin_correos' => '📧 Sin correos recientes en bandeja',
'sin_coincidencia' => '📧 Ningún correo coincide con este monto/fecha',
'error_sistema' => '⚙️ Error interno — un asesor revisará manualmente',
default => '📧 No se pudo verificar',
};
$texto .= "\nEstado: *⚠️ No confirmado*\n_{$motivo}_\n\nUn asesor revisará tu pago.";