$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 = "
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.");
}
}
?>