feat: validación exacta de hora + remitente obligatorio + nombres guardados
- Hora exacta: tolerancia 0 (timestamp comprobante = timestamp email) - Remitente bloquea: si el email trae el nombre del remitente y no coincide, rechaza - Nuevo paso antes de mostrar datos bancarios: bot pide nombre completo del titular - Nombres aceptados se guardan en solicitudes_recarga.nombre_remitente - Próxima recarga: muestra botones con nombres anteriores confirmados o ingresa uno nuevo - Funciona igual en Telegram y web chat Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Sonnet 4.6
parent
b66b828ded
commit
bb311e7dcd
@@ -82,12 +82,11 @@ class PagoValidadorService
|
||||
}
|
||||
}
|
||||
|
||||
// ── 3. Hora (±2 min) — la hora del comprobante y del correo deben ser la misma
|
||||
// El correo puede demorar en llegar al inbox, pero el timestamp interno registra
|
||||
// el momento exacto de la transacción, igual que el comprobante.
|
||||
// ── 3. Hora exacta — el timestamp del comprobante y del correo deben coincidir
|
||||
// El correo llega tarde al inbox pero su contenido registra la hora exacta de la transacción.
|
||||
if ($horaIA && ($datosCorreo['hora'] ?? '')) {
|
||||
if (! $this->horaProxima($horaIA, $datosCorreo['hora'], 2)) {
|
||||
Log::info("[PagoValidador] Correo #{$i}: hora fuera de rango (ia={$horaIA} correo={$datosCorreo['hora']})");
|
||||
if (! $this->horaProxima($horaIA, $datosCorreo['hora'], 0)) {
|
||||
Log::info("[PagoValidador] Correo #{$i}: hora no coincide (ia={$horaIA} correo={$datosCorreo['hora']})");
|
||||
continue;
|
||||
}
|
||||
}
|
||||
@@ -117,10 +116,16 @@ class PagoValidadorService
|
||||
return ['estado' => 'no_encontrado', 'correo' => null, 'motivo' => 'error_sistema'];
|
||||
}
|
||||
|
||||
// ── 6. Remitente (informativo, no bloquea) ──────────────
|
||||
$coincideRemitente = $this->remitenteCoincide($datosCorreo['remitente'] ?? '', $nombreUsuario ?? '');
|
||||
// ── 6. Remitente (bloquea si el correo trae el campo y no coincide) ──
|
||||
$remitenteCorreo = $datosCorreo['remitente'] ?? '';
|
||||
if ($remitenteCorreo && $nombreUsuario) {
|
||||
if (! $this->remitenteCoincide($remitenteCorreo, $nombreUsuario)) {
|
||||
Log::info("[PagoValidador] Correo #{$i}: remitente no coincide (correo={$remitenteCorreo} usuario={$nombreUsuario})");
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
Log::info("[PagoValidador] Correo #{$i}: CONFIRMADO (remitente_coincide=" . ($coincideRemitente ? 'SI' : 'NO') . ")");
|
||||
Log::info("[PagoValidador] Correo #{$i}: CONFIRMADO (remitente={$remitenteCorreo})");
|
||||
|
||||
try {
|
||||
PagoConfirmado::marcar($emailHash, [
|
||||
@@ -137,9 +142,8 @@ class PagoValidadorService
|
||||
}
|
||||
|
||||
return [
|
||||
'estado' => 'confirmado',
|
||||
'correo' => $datosCorreo,
|
||||
'coincide_remitente' => $coincideRemitente,
|
||||
'estado' => 'confirmado',
|
||||
'correo' => $datosCorreo,
|
||||
];
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user