Files
erv-clientright/public_html/server_webservice.php
2026-03-13 10:42:01 +03:00

529 lines
20 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('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);
?>