Files
erv-clientright/public_html/server_webservice.php

529 lines
20 KiB
PHP
Raw Normal View History

2026-03-13 10:42:01 +03:00
<?php
header('Access-Control-Allow-Origin: *'); // Разрешаем доступ с любого источника
header('Access-Control-Allow-Methods: GET, POST, OPTIONS');
header('Access-Control-Allow-Headers: origin, Content-Type, X-Requested-With, XMLHttpRequest');
// Настройка логирования
$log_dir = 'formlog';
if (!is_dir($log_dir)) {
mkdir($log_dir);
}
function log_message($message) {
global $log_dir;
$date = date('Y-m-d H:i:s');
file_put_contents("$log_dir/form_log.log", "[$date] $message" . PHP_EOL, FILE_APPEND);
}
// Получаем данные из POST
$upload_urls_real = $_POST['upload_urls_real'] ?? [];
$appends = $_POST['appends'] ?? [];
$docs_names = $_POST['docs_names'] ?? [];
$docs_ticket_files_ids = $_POST['docs_ticket_files_ids'] ?? [];
$sub_dir = $_POST['sub_dir'] ?? '';
$lastname = str_replace(' ', '', $_POST['lastname'] ?? '');
// Логируем полученные данные
log_message("Полученные данные: " . json_encode($_POST));
// Подготовка тела письма
$mail_body = 'Пользователь заполнил форму! <br><br>';
foreach ($appends as $key => $itemjson) {
$item = json_decode($itemjson);
$mail_body .= $key . ' : ' . $item->field_val . '<br>';
}
// Логируем тело письма
log_message("Тело письма: $mail_body");
// Формируем данные для отправки почты
$email_data = array(
'to' => 'kfv.advokat@gmail.com',
'subject' => 'Новая заявка из системы Клиентправ/ЛексПриорити',
'body' => 'Данные заявки: ' . $mail_body,
'attachments' => $upload_urls_real
);
// Сохраняем данные для скрипта отправки почты
$email_file = 'formlog/email_data.json';
file_put_contents($email_file, json_encode($email_data, JSON_UNESCAPED_UNICODE));
// Запускаем отправку почты в фоновом режиме
exec('php send_email_2.php > /dev/null 2>/dev/null &');
// Логирование отправленных данных
log_message("Отправленные данные на CRM: " . json_encode($upload_urls_real));
// Прочая логика (например, работа с API и т.д.)
$endpointUrl = "https://crm.clientright.ru/webservice.php";
// 1) Вынимаем временный токен из ответа
$ch = curl_init();
$url = $endpointUrl . "?operation=getchallenge&username=api";
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2);
curl_setopt($ch, CURLOPT_TIMEOUT, 30); // Увеличенный таймаут
$response = curl_exec($ch);
$jsonResponse = json_decode($response, true);
$challengeToken = $jsonResponse['result']['token'];
$result['challengeToken'] = $challengeToken;
$userAccessKey = '4r9ANex8PT2IuRV';
$generatedKey = md5($challengeToken.$userAccessKey);
curl_setopt_array($ch, array(
CURLOPT_RETURNTRANSFER => 1,
CURLOPT_URL => $endpointUrl,
CURLOPT_POST => 1,
CURLOPT_POSTFIELDS => array(
'operation' => 'login',
'username' => 'api',
'accessKey' => $generatedKey
)
));
$response = curl_exec($ch);
$jsonResponse = json_decode($response, true);
$sessionId = $jsonResponse['result']['sessionName'];
log_message("Получен sessionId: " . $sessionId);
// 2) Создание клиента-физлица
$client_array = array(
'operation' => 'CreateContact',
'sessionName' => $sessionId,
);
foreach ($appends as $key => $itemjson) {
$item = json_decode($itemjson);
if ($item->ws_type == "client") {
$client_array[$item->ws_name] = $item->field_val;
if ($item->ws_name == "code") $sms = $item->field_val;
}
}
$maxAttempts = 3; // Максимальное количество попыток
$attempts = 0;
$client_id = null;
do {
$ch = curl_init();
curl_setopt_array($ch, array(
CURLOPT_RETURNTRANSFER => 1,
CURLOPT_POST => 1,
CURLOPT_URL => $endpointUrl,
CURLOPT_POSTFIELDS => $client_array
));
$response = curl_exec($ch);
// Логируем ответ от сервера
log_message("Ответ от сервера: " . $response);
// Удаляем лишние символы
$response = trim($response);
$response = preg_replace('/^\xEF\xBB\xBF/', '', $response); // Удаляем BOM
$output = json_decode($response, true);
// Убедитесь, что декодирование прошло успешно
if (json_last_error() !== JSON_ERROR_NONE) {
log_message("Ошибка декодирования JSON: " . json_last_error_msg());
break; // Выход из цикла в случае ошибки
}
// Проверяем успешность запроса
if (isset($output['success']) && $output['success'] === true) {
$client_id = $output['result'] ?? null;
log_message("Создан клиент с ID: " . ($client_id ? $client_id : 'Ошибка получения ID'));
} else {
log_message("Ошибка при создании клиента, ответ сервера: " . json_encode($output));
}
$attempts++;
} while (!$client_id && $attempts < $maxAttempts);
// Логируем ответ сервера при создании клиента
log_message("Ответ сервера при создании клиента: " . json_encode($output));
// Дополнительная логика обработки (если требуется)
// ...
// 3) Создание/обновление Контрагента-исполнитель
$contractor_array = array(
'operation' => 'CreateAccount',
'sessionName' => $sessionId,
);
foreach ($appends as $key => $itemjson) {
$item = json_decode($itemjson);
if ($item->ws_type == "contractor" && $item->field_val != "") {
$contractor_array[$item->ws_name] = $item->field_val;
}
}
// Проверяем наличие ИНН и ОГРН, если их нет, генерируем
if (empty($contractor_array['inn'])) {
// Генерация случайного ИНН, начинающегося с "00"
$contractor_array['inn'] = '00' . str_pad(mt_rand(0, 999999999), 9, '0', STR_PAD_LEFT); // Генерируем 9 цифр
log_message("ИНН отсутствовал, сгенерирован: " . $contractor_array['inn']);
}
if (empty($contractor_array['ogrn'])) {
// Генерация случайного ОГРН, начинающегося с "000"
$contractor_array['ogrn'] = '000' . str_pad(mt_rand(0, 999999999), 9, '0', STR_PAD_LEFT); // Генерируем 9 цифр
log_message("ОГРН отсутствовал, сгенерирован: " . $contractor_array['ogrn']);
}
$maxAttempts = 3; // Максимальное количество попыток
$attempts = 0;
$contractor_id = null;
do {
$ch = curl_init();
curl_setopt_array($ch, array(
CURLOPT_RETURNTRANSFER => 1,
CURLOPT_POST => 1,
CURLOPT_URL => $endpointUrl,
CURLOPT_POSTFIELDS => $contractor_array
));
$response = curl_exec($ch);
// Удаляем лишние символы и проверяем ответ
$response = trim($response);
$response = preg_replace('/^\xEF\xBB\xBF/', '', $response); // Удаляем BOM
// Логируем ответ от сервера
log_message("Ответ от сервера при создании контрагента: " . $response);
// Декодируем JSON и проверяем на ошибки
$output = json_decode($response, TRUE);
if (json_last_error() !== JSON_ERROR_NONE) {
log_message("Ошибка декодирования JSON: " . json_last_error_msg());
log_message("Неправильный JSON: " . $response); // Логируем неверный JSON
break; // Выход из цикла в случае ошибки
}
// Проверяем успешность запроса
$contractor_id = $output['result'] ?? null;
log_message("Попытка создания контрагента, попытка: " . ($attempts + 1));
if ($contractor_id) {
log_message("Создан контрагент с ID: " . $contractor_id);
} else {
log_message("Ошибка получения ID контрагента, ответ сервера: " . json_encode($output));
}
$attempts++;
} while (!$contractor_id && $attempts < $maxAttempts);
// Логируем ответ сервера при создании контрагента
log_message("Ответ сервера при создании контрагента: " . json_encode($output));
// 3.1) Агент
if ($_POST['getservice'] == "agent") {
$agent_array = array(
'operation' => 'CreateAccount',
'sessionName' => $sessionId,
);
foreach ($appends as $key => $itemjson) {
$item = json_decode($itemjson);
if ($item->ws_type == "agent" && $item->field_val != "") {
$agent_array[$item->ws_name] = $item->field_val;
}
}
$attempts = 0;
$agent_id = null;
do {
$ch = curl_init();
curl_setopt_array($ch, array(
CURLOPT_RETURNTRANSFER => 1,
CURLOPT_POST => 1,
CURLOPT_URL => $endpointUrl,
CURLOPT_POSTFIELDS => $agent_array
));
$response = curl_exec($ch);
// Удаляем лишние символы и проверяем ответ
$response = trim($response);
$response = preg_replace('/^\xEF\xBB\xBF/', '', $response); // Удаляем BOM
// Логируем ответ от сервера
log_message("Ответ от сервера при создании агента: " . $response);
// Декодируем JSON и проверяем на ошибки
$output = json_decode($response, TRUE);
if (json_last_error() !== JSON_ERROR_NONE) {
log_message("Ошибка декодирования JSON: " . json_last_error_msg());
log_message("Неправильный JSON: " . $response); // Логируем неверный JSON
break; // Выход из цикла в случае ошибки
}
// Проверяем успешность запроса
$agent_id = $output['result'] ?? null;
log_message("Попытка создания агента, попытка: " . ($attempts + 1));
if ($agent_id) {
log_message("Создан Агент с ID: " . $agent_id);
} else {
log_message("Ошибка получения ID агента, ответ сервера: " . json_encode($output));
}
$attempts++;
} while (!$agent_id && $attempts < $maxAttempts);
}
// Логируем ответ сервера при создании контрагента
log_message("Ответ сервера при создании агента: " . json_encode($output));
// 4) Проект
$project_array = array(
'operation' => 'CreateProject',
'sessionName' => $sessionId,
'contactid' => $client_id,
'offenderid' => $contractor_id,
'agentid' => $agent_id,
'sms' => $sms
);
// Пушим в массив остальные поля
foreach ($appends as $key => $itemjson) {
$item = json_decode($itemjson);
if ($item->ws_type != "contractor" && $item->ws_type != "client" && $item->ws_type != "agent" && $item->ws_type != "other") {
$project_array[$item->ws_name] = $item->field_val;
}
}
$ch = curl_init();
curl_setopt_array($ch, array(
CURLOPT_RETURNTRANSFER => 1,
CURLOPT_POST => 1,
CURLOPT_URL => $endpointUrl,
CURLOPT_POSTFIELDS => $project_array
));
$response = curl_exec($ch);
$project_id = preg_replace('/[^0-9]/', '', $response);
log_message("Создан проект с ID: " . $project_id);
// 5) Прикрепление файлов к проекту
if ($upload_urls_real) {
foreach ($upload_urls_real as $index => $upload_url) {
if ($docs_ticket_files_ids && $docs_ticket_files_ids[$index] != "simple") continue;
if ($upload_url) {
$params = array(
'operation' => 'AddPDF',
'sessionName' => $sessionId,
'crmid' => $project_id,
'file' => $upload_url,
'description' => $docs_names[$index]
);
$ch = curl_init();
curl_setopt_array($ch, array(
CURLOPT_RETURNTRANSFER => 1,
CURLOPT_POST => 1,
CURLOPT_URL => $endpointUrl,
CURLOPT_POSTFIELDS => $params
));
$response = curl_exec($ch);
$output = json_decode($response, TRUE);
log_message("Прикреплен файл к проекту: " . $response);
}
}
}
// 6) Остальные поля
$other_array = array();
foreach ($appends as $key => $itemjson) {
$item = json_decode($itemjson);
if ($item->ws_type == "other") {
$other_array[$item->ws_name] = $item->field_val;
}
}
$params = array(
'operation' => 'UpdateEntity',
'sessionName' => $sessionId,
//'crmid' => $project_id,
'crmid' => $client_id,
'element' => json_encode($other_array)
);
curl_setopt_array($ch, array(
CURLOPT_RETURNTRANSFER => 1,
CURLOPT_POST => 1,
CURLOPT_URL => $endpointUrl,
CURLOPT_POSTFIELDS => $params
));
$response = curl_exec($ch);
$output = json_decode($response, TRUE);
// Логирование обновленных полей и ответа сервера
log_message("Обновлены остальные поля: " . json_encode($other_array));
log_message("Ответ сервера при обновлении полей: " . json_encode($output));
// 6.1) Остальные поля
$other_array = array();
foreach ($appends as $key => $itemjson) {
$item = json_decode($itemjson);
if ($item->ws_type == "other") {
$other_array[$item->ws_name] = $item->field_val;
}
}
$params = array(
'operation' => 'UpdateEntity',
'sessionName' => $sessionId,
'crmid' => $project_id,
// 'crmid' => $client_id,
'element' => json_encode($other_array)
);
curl_setopt_array($ch, array(
CURLOPT_RETURNTRANSFER => 1,
CURLOPT_POST => 1,
CURLOPT_URL => $endpointUrl,
CURLOPT_POSTFIELDS => $params
));
$response = curl_exec($ch);
$output = json_decode($response, TRUE);
// Логирование обновленных полей и ответа сервера
log_message("Обновлены остальные поля: " . json_encode($other_array));
log_message("Ответ сервера при обновлении полей: " . json_encode($output));
// 7 Создание заявок
$ticket_id_array = array();
foreach ($appends as $key => $itemjson) {
$item = json_decode($itemjson);
if ($item->ws_type == "ticket") {
$params = array(
'operation' => 'CreateERVTicket',
'sessionName' => $sessionId,
'title' => $item->field_val,
'contactid' => $client_id,
'projectid' => $project_id
);
$ch = curl_init(); // Создаем новое соединение cURL для каждой заявки
curl_setopt_array($ch, array(
CURLOPT_RETURNTRANSFER => 1,
CURLOPT_POST => 1,
CURLOPT_URL => $endpointUrl,
CURLOPT_POSTFIELDS => $params
));
$response = curl_exec($ch);
if (curl_errno($ch)) {
log_message("Ошибка cURL при создании заявки: " . curl_error($ch));
continue; // Переходим к следующей заявке в случае ошибки
}
// Удаляем лишние символы и проверяем ответ
$response = trim($response);
$response = preg_replace('/^\xEF\xBB\xBF/', '', $response); // Удаляем BOM
// Логируем обработанный ответ
log_message("Ответ от сервера после удаления BOM: " . $response);
// Декодируем JSON и проверяем на ошибки
$output = json_decode($response, true, 512, JSON_UNESCAPED_UNICODE);
if (json_last_error() !== JSON_ERROR_NONE) {
log_message("Ошибка декодирования JSON: " . json_last_error_msg());
log_message("Неправильный JSON: " . $response); // Логируем неверный JSON
curl_close($ch);
continue; // Переходим к следующей заявке в случае ошибки
}
// Логируем ответ
log_message("Создана заявка: " . json_encode($output));
if (isset($output['result'])) {
$ticket_id_array[$item->ws_name] = $output['result']; // Прямое использование результата
} else {
log_message("Ошибка создания заявки: " . json_encode($output));
}
curl_close($ch); // Закрываем cURL соединение
}
}
// Логируем массив заявок
log_message("Массив ID заявок: " . json_encode($ticket_id_array));
// Удаляем из массива simple
$valueToRemove = "simple";
$docs_ticket_files_ids = array_filter($docs_ticket_files_ids, function($element) use ($valueToRemove) {
return $element !== $valueToRemove;
});
$docs_ticket_files_ids = array_values($docs_ticket_files_ids);
// Логируем обновленный массив файлов
log_message("Обновленный массив файлов после удаления 'simple': " . json_encode($docs_ticket_files_ids));
// Прикрепление файлов к заявкам
$index = 0;
foreach ($ticket_id_array as $key => $item) { // Массив ID заявок
$upload_url = $upload_urls_real[$docs_ticket_files_ids[$index]];
if ($upload_url) {
$params = array(
'operation' => 'AddPDF',
'sessionName' => $sessionId,
'crmid' => $item, // ID заявки
'file' => $upload_url,
'description' => $docs_names[$docs_ticket_files_ids[$index]]
);
// Логируем отправляемые параметры
log_message("Отправляемые параметры для прикрепления файла к заявке $item: " . json_encode($params));
$ch = curl_init();
curl_setopt_array($ch, array(
CURLOPT_RETURNTRANSFER => 1,
CURLOPT_POST => 1,
CURLOPT_URL => $endpointUrl,
CURLOPT_POSTFIELDS => $params
));
$response = curl_exec($ch);
if (curl_errno($ch)) {
log_message("Ошибка cURL при прикреплении файла: " . curl_error($ch));
} else {
log_message("Ответ от сервера при прикреплении файла к заявке $item: " . $response);
}
curl_close($ch);
$index++;
}
}
//log_message("Массив ID заявок: " . json_encode($ticket_id_array));
// Логируем ответ клиенту
$response = ['status' => 'success', 'message' => 'Данные успешно обработаны.'];
log_message("Ответ клиенту: " . json_encode($response));
echo json_encode($response);
?>