147 lines
5.5 KiB
PHP
147 lines
5.5 KiB
PHP
<?php
|
||
/**
|
||
* Отправка заявки на вебхук n8n (oldform_combine) из готового набора данных.
|
||
* Используется когда данные пришли не из формы (например, из другой системы/тикета).
|
||
*
|
||
* Приём данных:
|
||
* - POST body: JSON (Content-Type: application/json) — объект с полями заявки (cf_*, firstname, lastname и т.д.)
|
||
* - или POST form: поле "data" или "form_data" — строка JSON
|
||
*
|
||
* Файлы: можно добавить позже через multipart (поля files[имя_поля][0], ...).
|
||
*/
|
||
|
||
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');
|
||
|
||
if ($_SERVER['REQUEST_METHOD'] === 'OPTIONS') {
|
||
http_response_code(200);
|
||
exit;
|
||
}
|
||
|
||
$webhook_url = 'https://n8n.clientright.pro/webhook/oldform_combine';
|
||
|
||
// Служебные ключи, которые можно не передавать в n8n (опционально оставляем для отладки)
|
||
$technical_keys = ['__vtrftk', 'publicid', 'urlencodeenable', 'name'];
|
||
|
||
$raw_input = null;
|
||
if (isset($_SERVER['CONTENT_TYPE']) && strpos($_SERVER['CONTENT_TYPE'], 'application/json') !== false) {
|
||
$raw_input = file_get_contents('php://input');
|
||
} elseif (!empty($_POST['data'])) {
|
||
$raw_input = $_POST['data'];
|
||
} elseif (!empty($_POST['form_data'])) {
|
||
$raw_input = $_POST['form_data'];
|
||
}
|
||
|
||
if ($raw_input === null || $raw_input === '') {
|
||
http_response_code(400);
|
||
echo json_encode([
|
||
'success' => false,
|
||
'message' => 'Передайте JSON: body с Content-Type: application/json или поле data/form_data',
|
||
'example' => ['firstname' => 'Имя', 'lastname' => 'Фамилия', 'cf_1740' => 'E0050-...', '...' => '...']
|
||
], JSON_UNESCAPED_UNICODE);
|
||
exit;
|
||
}
|
||
|
||
$form_data = json_decode($raw_input, true);
|
||
if (!is_array($form_data)) {
|
||
http_response_code(400);
|
||
echo json_encode([
|
||
'success' => false,
|
||
'message' => 'Невалидный JSON',
|
||
'error' => json_last_error_msg()
|
||
], JSON_UNESCAPED_UNICODE);
|
||
exit;
|
||
}
|
||
|
||
// По желанию убираем только чисто технические ключи (name="websiteticket" и т.д. можно оставить или убрать)
|
||
$form_data_clean = $form_data;
|
||
foreach ($technical_keys as $key) {
|
||
unset($form_data_clean[$key]);
|
||
}
|
||
|
||
// Сборка payload как в submit.php: form_data (JSON) + метаданные
|
||
$post_data = [
|
||
'form_data' => json_encode($form_data_clean, JSON_UNESCAPED_UNICODE),
|
||
'timestamp' => date('Y-m-d H:i:s'),
|
||
'ip' => $_SERVER['REMOTE_ADDR'] ?? '',
|
||
'user_agent' => $_SERVER['HTTP_USER_AGENT'] ?? '',
|
||
];
|
||
|
||
// Файлы: если в будущем будут — добавлять сюда по тому же формату, что в submit.php:
|
||
// $post_data["files[имя_поля][0]"] = new CURLFile(...);
|
||
if (!empty($_FILES)) {
|
||
foreach ($_FILES as $field_name => $file_data) {
|
||
if (is_array($file_data['tmp_name'])) {
|
||
foreach ($file_data['tmp_name'] as $i => $tmp) {
|
||
if (!empty($tmp) && is_uploaded_file($tmp)) {
|
||
$post_data["files[{$field_name}][{$i}]"] = new CURLFile(
|
||
$tmp,
|
||
$file_data['type'][$i] ?? 'application/octet-stream',
|
||
$file_data['name'][$i] ?? 'file'
|
||
);
|
||
}
|
||
}
|
||
} else {
|
||
if (!empty($file_data['tmp_name']) && is_uploaded_file($file_data['tmp_name'])) {
|
||
$post_data["files[{$field_name}][0]"] = new CURLFile(
|
||
$file_data['tmp_name'],
|
||
$file_data['type'] ?? 'application/octet-stream',
|
||
$file_data['name'] ?? 'file'
|
||
);
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
$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, 30);
|
||
curl_setopt($ch, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1);
|
||
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Expect:']);
|
||
|
||
$response = curl_exec($ch);
|
||
$http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
|
||
$curl_error = curl_error($ch);
|
||
$curl_errno = curl_errno($ch);
|
||
curl_close($ch);
|
||
|
||
if ($curl_errno && $http_code === 0) {
|
||
http_response_code(502);
|
||
echo json_encode([
|
||
'success' => false,
|
||
'message' => 'Ошибка отправки на вебхук',
|
||
'error' => $curl_error,
|
||
'code' => $curl_errno
|
||
], JSON_UNESCAPED_UNICODE);
|
||
exit;
|
||
}
|
||
|
||
$response_data = json_decode($response, true);
|
||
if ($response_data === null) {
|
||
$response_data = $response;
|
||
}
|
||
|
||
if ($http_code >= 200 && $http_code < 300) {
|
||
echo json_encode([
|
||
'success' => true,
|
||
'message' => 'Данные отправлены на вебхук',
|
||
'http_code' => $http_code,
|
||
'response' => $response_data
|
||
], JSON_UNESCAPED_UNICODE);
|
||
} else {
|
||
http_response_code($http_code ?: 502);
|
||
echo json_encode([
|
||
'success' => false,
|
||
'message' => 'Вебхук вернул ошибку',
|
||
'http_code' => $http_code,
|
||
'response' => $response_data
|
||
], JSON_UNESCAPED_UNICODE);
|
||
}
|