From 5ea4f3c9e5a8bf184c9c199562a6fb711303ff3f Mon Sep 17 00:00:00 2001 From: Lizandro Date: Sat, 18 Jul 2026 17:20:27 +0000 Subject: [PATCH] fix(seguridad): falla cerrado si anti-duplicado no puede verificar/registrar MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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 --- app/Services/PagoValidadorService.php | 9 ++++++--- app/Services/TelegramBotService.php | 1 + 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/app/Services/PagoValidadorService.php b/app/Services/PagoValidadorService.php index 2a9fa12..3e04e5a 100755 --- a/app/Services/PagoValidadorService.php +++ b/app/Services/PagoValidadorService.php @@ -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 [ diff --git a/app/Services/TelegramBotService.php b/app/Services/TelegramBotService.php index d87ca13..634d36e 100755 --- a/app/Services/TelegramBotService.php +++ b/app/Services/TelegramBotService.php @@ -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.";