$secretKey, 'response' => $captchaResponse ]; $options = [ 'http' => [ 'header' => "Content-type: application/x-www-form-urlencoded\r\n", 'method' => 'POST', 'content' => http_build_query($data) ] ]; $context = stream_context_create($options); $result = file_get_contents($verifyUrl, false, $context); $response = json_decode($result); if (!$response->success) { die("❌ Error de verificación reCAPTCHA."); } return true; } // Función auxiliar para validaciones function validarDatos($rfc, $email, $telefono) { // Validar RFC if (!preg_match('/^[A-ZÑ&]{3,4}\d{6}[A-Z0-9]{3}$/', strtoupper($rfc))) { die("❌ El RFC no tiene un formato válido."); } // Validar email if (!preg_match('/^[a-zA-Z0-9._+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/', strtolower($email))) { die("❌ No es una dirección de correo válida."); } // Validar teléfono if (!preg_match('/^\d{3}\s\d{7}$/', $telefono)) { die("❌ El número de teléfono no tiene un formato válido. Ejemplo: 123 4567890"); } } // Función auxiliar para manejar archivos function procesarArchivo($archivo) { if ($archivo['error'] !== UPLOAD_ERR_OK) { die("❌ Error al subir el archivo."); } // Validar tipo MIME real del archivo $finfo = finfo_open(FILEINFO_MIME_TYPE); $mimeType = finfo_file($finfo, $archivo['tmp_name']); finfo_close($finfo); if ($mimeType !== 'application/pdf') { die("❌ El archivo debe ser un PDF válido."); } // Validar extensión if (pathinfo($archivo['name'], PATHINFO_EXTENSION) !== 'pdf') { die("❌ Solo se permiten archivos PDF."); } // Validar tamaño (5MB máximo) if ($archivo['size'] > 5 * 1024 * 1024) { die("❌ El archivo no debe exceder 5MB."); } // Guardar archivo con nombre único $nombreArchivo = uniqid() . '_' . basename($archivo['name']); $rutaDestino = __DIR__ . '/../../storage/opiniones/' . $nombreArchivo; if (!move_uploaded_file($archivo['tmp_name'], $rutaDestino)) { die("❌ Error al guardar el archivo."); } return $nombreArchivo; } // Función auxiliar para obtener configuración function obtenerConfiguracion($conn) { $sqlConf = "SELECT TOP 1 * FROM configuracion_sistema"; $stmtConf = sqlsrv_query($conn, $sqlConf); if ($stmtConf === false) { error_log("Error al obtener configuración: " . print_r(sqlsrv_errors(), true)); return [ 'nombre_plataforma' => 'Sistema Integral para Importadores de Hidrocarburos', 'siglas' => 'SIIH', 'logo_url' => 'assets/img/logo_siih.png', 'colores_primarios' => '#003366,#0055A5' ]; } return sqlsrv_fetch_array($stmtConf, SQLSRV_FETCH_ASSOC) ?: [ 'nombre_plataforma' => 'Sistema Integral para Importadores de Hidrocarburos', 'siglas' => 'SIIH', 'logo_url' => 'assets/img/logo_siih.png', 'colores_primarios' => '#003366,#0055A5' ]; } // Función auxiliar para enviar email function enviarEmailConfirmacion($destinatario, $datosEmpresa, $esAgencia = false) { $mail = new PHPMailer(true); try { // Configuración SMTP $mail->isSMTP(); $mail->Host = 'secure.emailsrvr.com'; $mail->SMTPAuth = true; $mail->Username = 'noreply@aduanasoft.com.mx'; $mail->Password = $_ENV['SMTP_PASS']; $mail->SMTPSecure = PHPMailer::ENCRYPTION_STARTTLS; $mail->Port = 587; // Configurar remitente y destinatario $mail->setFrom('noreply@aduanasoft.com.mx', 'SIIH | AduanaSoft'); $mail->addAddress($destinatario); // Obtener configuración $conn = getConnection(); $conf = obtenerConfiguracion($conn); $nombrePlataforma = $conf['nombre_plataforma']; $siglas = $conf['siglas']; $logoUrl = $conf['logo_url']; $color2 = explode(',', $conf['colores_primarios'])[1]; // Contenido del email $mail->CharSet = 'UTF-8'; $mail->isHTML(true); $mail->Subject = 'Confirmación de solicitud de registro | SIIH'; $fechaRegistro = date('d/m/Y H:i'); $tipoRegistro = $esAgencia ? 'Agencia' : 'Empresa'; $nombreEntidad = $esAgencia ? $datosEmpresa['agencia'] : $datosEmpresa['empresa']; $mail->Body = "
Logo $siglas

Confirmación de Registro

¡Hola!

Tu solicitud de registro ha sido recibida exitosamente en $nombrePlataforma.


📋 $tipoRegistro: " . htmlspecialchars($nombreEntidad) . "

📞 Teléfono: " . htmlspecialchars($datosEmpresa['telefono']) . "

🕓 Fecha de registro: $fechaRegistro


Un administrador revisará tu información y te notificará por este medio cuando tu solicitud sea aprobada.

Por favor, mantente atento a tu correo (y revisa también tu carpeta de spam o promociones).

Este es un mensaje automático enviado por el sistema de registro de importadores.

© " . date('Y') . " $siglas · $nombrePlataforma
"; $mail->send(); return true; } catch (Exception $e) { error_log("Error al enviar correo: {$mail->ErrorInfo}"); return false; } } function enviarSoliImportador() { try { // Validar reCAPTCHA validarRecaptcha($_POST['g-recaptcha-response'] ?? ''); $conn = getConnection(); // Sanitizar y obtener datos $empresa = trim($_POST['company_name'] ?? ''); $rfc = trim($_POST['rfc'] ?? ''); $email = trim($_POST['email'] ?? ''); $telefono = trim($_POST['phone'] ?? ''); // Validar datos validarDatos($rfc, $email, $telefono); // Procesar archivo $nombreArchivo = procesarArchivo($_FILES['opinion_file']); // Encriptar datos sensibles $empresaEncriptada = encrypt($empresa); $rfcEncriptado = encrypt(strtoupper($rfc)); // Insertar en base de datos $sql = "INSERT INTO solicitudes_importadores (company_name, rfc, email, phone, opinion_file, request_status, request_date) VALUES (?, ?, ?, ?, ?, 'pending', GETDATE()) "; $params = [$empresaEncriptada, $rfcEncriptado, $email, $telefono, $nombreArchivo]; $stmt = sqlsrv_query($conn, $sql, $params); if ($stmt === false) { error_log("Error en BD: " . print_r(sqlsrv_errors(), true)); die("❌ Error al procesar la solicitud."); } // Enviar email de confirmación $datosEmpresa = [ 'empresa' => $empresa, 'telefono' => $telefono ]; enviarEmailConfirmacion($email, $datosEmpresa, false); include __DIR__ . '/../../views/registro/gracias.php'; } catch (Exception $e) { error_log("Error en enviarSoliImportador: " . $e->getMessage()); die("❌ Error interno del servidor."); } } function enviarSoliAgencia() { try { // Validar reCAPTCHA validarRecaptcha($_POST['g-recaptcha-response'] ?? ''); $conn = getConnection(); // Sanitizar y obtener datos $agencia = trim($_POST['nombre_agencia'] ?? ''); $rfc = trim($_POST['rfc_agencia'] ?? ''); $correo = trim($_POST['correo'] ?? ''); $telefono = trim($_POST['telefono'] ?? ''); $direccion = trim($_POST['direccion'] ?? ''); $admin = trim($_POST['nombre_admin'] ?? ''); $admin_correo = trim($_POST['correo_admin'] ?? ''); // Validar datos principales validarDatos($rfc, $correo, $telefono); // Validar correo del administrador if (!preg_match('/^[a-zA-Z0-9._+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/', strtolower($admin_correo))) { die("❌ El correo del administrador no es válido."); } // Procesar archivo $nombreArchivo = procesarArchivo($_FILES['opinion_file']); // Encriptar datos sensibles $agenciaEncriptada = encrypt($agencia); $rfcEncriptado = encrypt(strtoupper($rfc)); $adminEncriptado = encrypt($admin); // Insertar en base de datos $sql = "INSERT INTO solicitudes_agencias (agencia_name, rfc, email, phone, direccion, opinion_file, admin_name, admin_email, request_status, request_date) VALUES (?, ?, ?, ?, ?, ?, ?, ?, 'pending', GETDATE()) "; $params = [$agenciaEncriptada, $rfcEncriptado, $correo, $telefono, $direccion, $nombreArchivo, $adminEncriptado, $admin_correo]; $stmt = sqlsrv_query($conn, $sql, $params); if ($stmt === false) { error_log("Error en BD: " . print_r(sqlsrv_errors(), true)); die("❌ Error al procesar la solicitud."); } // Enviar email de confirmación $datosAgencia = [ 'agencia' => $agencia, 'telefono' => $telefono ]; enviarEmailConfirmacion($correo, $datosAgencia, true); include __DIR__ . '/../../views/registro/gracias.php'; } catch (Exception $e) { error_log("Error en enviarSoliAgencia: " . $e->getMessage()); die("❌ Error interno del servidor."); } } ?>