219 lines
9.2 KiB
PHP
219 lines
9.2 KiB
PHP
|
|
<?php
|
|||
|
|
header('Content-Type: application/json; charset=utf-8');
|
|||
|
|
header('Access-Control-Allow-Origin: *');
|
|||
|
|
header('Access-Control-Allow-Methods: POST, OPTIONS');
|
|||
|
|
header('Access-Control-Allow-Headers: Content-Type');
|
|||
|
|
|
|||
|
|
// Обработка preflight запроса
|
|||
|
|
if ($_SERVER['REQUEST_METHOD'] === 'OPTIONS') {
|
|||
|
|
http_response_code(200);
|
|||
|
|
exit;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// Логирование для отладки
|
|||
|
|
$log_file = __DIR__ . '/logs/submit.log';
|
|||
|
|
$log_dir = dirname($log_file);
|
|||
|
|
if (!is_dir($log_dir)) {
|
|||
|
|
mkdir($log_dir, 0755, true);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
function log_message($message) {
|
|||
|
|
global $log_file;
|
|||
|
|
$timestamp = date('Y-m-d H:i:s');
|
|||
|
|
file_put_contents($log_file, "[$timestamp] $message\n", FILE_APPEND);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
log_message("=== Начало обработки формы ===");
|
|||
|
|
|
|||
|
|
try {
|
|||
|
|
// URL вебхука n8n
|
|||
|
|
$webhook_url = 'https://n8n.clientright.pro/webhook/aviaticketold';
|
|||
|
|
|
|||
|
|
// Получаем данные из POST
|
|||
|
|
$form_data = [];
|
|||
|
|
|
|||
|
|
// Обрабатываем поля формы из appends[]
|
|||
|
|
if (isset($_POST['appends']) && is_array($_POST['appends'])) {
|
|||
|
|
foreach ($_POST['appends'] as $append_json) {
|
|||
|
|
$append = json_decode($append_json, true);
|
|||
|
|
if ($append && isset($append['ws_name'])) {
|
|||
|
|
$form_data[$append['ws_name']] = $append['field_val'];
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// Добавляем дополнительные поля
|
|||
|
|
if (isset($_POST['lastname'])) {
|
|||
|
|
$form_data['lastname'] = $_POST['lastname'];
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if (isset($_POST['sub_dir'])) {
|
|||
|
|
$form_data['sub_dir'] = $_POST['sub_dir'];
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// Маппинг технических имен полей на понятные названия
|
|||
|
|
// Используем name атрибуты из формы
|
|||
|
|
$field_names_map = [
|
|||
|
|
'polis' => 'polis', // Полис
|
|||
|
|
'file_15_18' => 'legal_representative_docs', // Документы законного представителя несовершеннолетнего
|
|||
|
|
'delay_docs' => 'supporting_documents', // Подтверждающие документы (посадочный талон, билет)
|
|||
|
|
'cancel_confirmation' => 'cancellation_confirmation', // Подтверждение уведомления об отмене рейса
|
|||
|
|
'other_docs' => 'identity_document' // Документ удостоверяющий личность (страница с фото)
|
|||
|
|
];
|
|||
|
|
|
|||
|
|
// Также маппинг для crmname (если используется)
|
|||
|
|
$crmname_map = [
|
|||
|
|
'cf_1885' => 'polis', // Номер полиса -> полис
|
|||
|
|
// Добавим другие по мере необходимости
|
|||
|
|
];
|
|||
|
|
|
|||
|
|
// Группируем файлы по полям с понятными названиями
|
|||
|
|
$files_by_field = [];
|
|||
|
|
|
|||
|
|
// Обрабатываем загруженные файлы напрямую из $_FILES
|
|||
|
|
// Файлы приходят в формате: field_name-0, field_name-1 и т.д.
|
|||
|
|
if (!empty($_FILES)) {
|
|||
|
|
foreach ($_FILES as $field_name => $file_data) {
|
|||
|
|
// Проверяем, что это файл (не массив файлов)
|
|||
|
|
if (is_array($file_data['tmp_name'])) {
|
|||
|
|
continue;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// Пропускаем пустые файлы
|
|||
|
|
if (empty($file_data['tmp_name']) || !is_uploaded_file($file_data['tmp_name'])) {
|
|||
|
|
continue;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// Извлекаем имя поля и индекс из field_name-0
|
|||
|
|
if (strpos($field_name, '-') !== false) {
|
|||
|
|
$parts = explode('-', $field_name);
|
|||
|
|
$actual_field_name = $parts[0];
|
|||
|
|
$file_index = (int)end($parts);
|
|||
|
|
} else {
|
|||
|
|
$actual_field_name = $field_name;
|
|||
|
|
$file_index = 0;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// Преобразуем техническое имя в понятное
|
|||
|
|
$readable_field_name = $field_names_map[$actual_field_name] ?? $actual_field_name;
|
|||
|
|
$field_description = $field_descriptions[$readable_field_name] ?? $readable_field_name;
|
|||
|
|
|
|||
|
|
// Группируем файлы по полям
|
|||
|
|
if (!isset($files_by_field[$readable_field_name])) {
|
|||
|
|
$files_by_field[$readable_field_name] = [
|
|||
|
|
'original_field' => $actual_field_name, // Сохраняем оригинальное имя для справки
|
|||
|
|
'description' => $field_description, // Понятное описание
|
|||
|
|
'files' => []
|
|||
|
|
];
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
$files_by_field[$readable_field_name]['files'][] = [
|
|||
|
|
'index' => $file_index,
|
|||
|
|
'name' => $file_data['name'],
|
|||
|
|
'size' => $file_data['size'],
|
|||
|
|
'type' => $file_data['type'],
|
|||
|
|
'tmp_name' => $file_data['tmp_name']
|
|||
|
|
];
|
|||
|
|
|
|||
|
|
log_message("Обработан файл: {$file_data['name']} ({$file_data['size']} байт) для поля '$field_description' ($readable_field_name, оригинал: $actual_field_name)");
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// Формируем данные для отправки (multipart/form-data)
|
|||
|
|
$post_data = [];
|
|||
|
|
|
|||
|
|
// Добавляем данные формы как JSON
|
|||
|
|
$post_data['form_data'] = json_encode($form_data, JSON_UNESCAPED_UNICODE);
|
|||
|
|
|
|||
|
|
// Добавляем метаданные
|
|||
|
|
$post_data['timestamp'] = date('Y-m-d H:i:s');
|
|||
|
|
$post_data['ip'] = $_SERVER['REMOTE_ADDR'] ?? '';
|
|||
|
|
$post_data['user_agent'] = $_SERVER['HTTP_USER_AGENT'] ?? '';
|
|||
|
|
|
|||
|
|
// Добавляем файлы, сгруппированные по полям
|
|||
|
|
// Формат: files[field_name][0], files[field_name][1] и т.д.
|
|||
|
|
foreach ($files_by_field as $field_name => $files) {
|
|||
|
|
foreach ($files as $index => $file_info) {
|
|||
|
|
$file_key = "files[{$field_name}][{$index}]";
|
|||
|
|
$post_data[$file_key] = new CURLFile(
|
|||
|
|
$file_info['tmp_name'],
|
|||
|
|
$file_info['type'],
|
|||
|
|
$file_info['name']
|
|||
|
|
);
|
|||
|
|
}
|
|||
|
|
// Добавляем метаданные для поля (количество файлов, общий размер)
|
|||
|
|
$post_data["files_meta[{$field_name}][count]"] = count($files);
|
|||
|
|
$post_data["files_meta[{$field_name}][total_size]"] = array_sum(array_column($files, 'size'));
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// Логируем структуру (без файлов)
|
|||
|
|
$log_data = [
|
|||
|
|
'form_data' => $form_data,
|
|||
|
|
'files_structure' => array_map(function($field_data) {
|
|||
|
|
return [
|
|||
|
|
'description' => $field_data['description'],
|
|||
|
|
'original_field' => $field_data['original_field'],
|
|||
|
|
'files_count' => count($field_data['files']),
|
|||
|
|
'files' => array_map(function($f) {
|
|||
|
|
return ['name' => $f['name'], 'size' => $f['size'], 'type' => $f['type']];
|
|||
|
|
}, $field_data['files'])
|
|||
|
|
];
|
|||
|
|
}, $files_by_field),
|
|||
|
|
'timestamp' => $post_data['timestamp']
|
|||
|
|
];
|
|||
|
|
log_message("Данные для отправки: " . json_encode($log_data, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT));
|
|||
|
|
|
|||
|
|
// Отправляем на вебхук n8n как multipart/form-data
|
|||
|
|
$ch = curl_init($webhook_url);
|
|||
|
|
curl_setopt($ch, CURLOPT_POST, true);
|
|||
|
|
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
|
|||
|
|
curl_setopt($ch, CURLOPT_POSTFIELDS, $post_data);
|
|||
|
|
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
|
|||
|
|
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
|
|||
|
|
curl_setopt($ch, CURLOPT_TIMEOUT, 120); // Увеличен таймаут для больших файлов
|
|||
|
|
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 10);
|
|||
|
|
|
|||
|
|
$response = curl_exec($ch);
|
|||
|
|
$http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
|
|||
|
|
$curl_error = curl_error($ch);
|
|||
|
|
curl_close($ch);
|
|||
|
|
|
|||
|
|
log_message("HTTP код ответа: $http_code");
|
|||
|
|
log_message("Ответ от n8n: " . $response);
|
|||
|
|
|
|||
|
|
if ($curl_error) {
|
|||
|
|
log_message("Ошибка CURL: $curl_error");
|
|||
|
|
throw new Exception("Ошибка отправки данных: $curl_error");
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if ($http_code >= 200 && $http_code < 300) {
|
|||
|
|
// Успешный ответ
|
|||
|
|
$response_data = json_decode($response, true);
|
|||
|
|
if ($response_data === null) {
|
|||
|
|
$response_data = $response; // Если ответ не JSON
|
|||
|
|
}
|
|||
|
|
log_message("Успешная отправка");
|
|||
|
|
|
|||
|
|
echo json_encode([
|
|||
|
|
'success' => true,
|
|||
|
|
'message' => 'Данные успешно отправлены',
|
|||
|
|
'response' => $response_data
|
|||
|
|
], JSON_UNESCAPED_UNICODE);
|
|||
|
|
} else {
|
|||
|
|
log_message("Ошибка HTTP: $http_code");
|
|||
|
|
throw new Exception("Ошибка сервера: HTTP $http_code");
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
} catch (Exception $e) {
|
|||
|
|
log_message("Исключение: " . $e->getMessage());
|
|||
|
|
|
|||
|
|
http_response_code(500);
|
|||
|
|
echo json_encode([
|
|||
|
|
'success' => false,
|
|||
|
|
'message' => 'Ошибка обработки запроса',
|
|||
|
|
'error' => $e->getMessage()
|
|||
|
|
], JSON_UNESCAPED_UNICODE);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
log_message("=== Конец обработки формы ===\n");
|