Files
ticket_dev/submit.php

219 lines
9.2 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?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");