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

147 lines
5.5 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
/**
* Отправка заявки на вебхук 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);
}