Форма сайта → тикет
Посетитель заполняет форму на сайте — в Дескусе появляется тикет с его почтой и вопросом. Ключ API живёт на сервере сайта, в браузер он не попадает.
Без кода
Сайт на Tilda, WordPress или 1С-Битрикс, простая HTML-форма — подключаются без программирования: Сайт на Tilda, WordPress или 1С-Битрикс и Мессенджеры, формы и приём по API. Рецепт ниже — для своей формы, когда нужна своя логика.
Что понадобится
Ключ API с правом
tickets:writeот сотрудника, который может создавать тикеты (как выпустить).Обработчик формы на вашем сервере — он примет поля и отправит запрос в Дескус.
PHP
<?php
// form.php — сюда отправляет форма: <form method="post" action="/form.php">
$payload = [
'subject' => 'Заявка с сайта: ' . mb_substr(trim($_POST['topic'] ?? 'вопрос'), 0, 150),
'message' => trim($_POST['message'] ?? ''),
'client' => [
'name' => trim($_POST['name'] ?? ''),
'email' => trim($_POST['email'] ?? ''),
'phone' => trim($_POST['phone'] ?? ''),
],
];
$ch = curl_init('https://app.deskus.ru/api/v1/tickets');
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_TIMEOUT => 15,
CURLOPT_HTTPHEADER => [
'Authorization: Bearer ' . getenv('DESKUS_KEY'),
'Content-Type: application/json',
// один ключ на одну отправку формы: повтор не создаст второй тикет
'Idempotency-Key: form-' . ($_POST['form_id'] ?? bin2hex(random_bytes(8))),
],
CURLOPT_POSTFIELDS => json_encode($payload, JSON_UNESCAPED_UNICODE),
]);
$response = json_decode(curl_exec($ch), true);
$status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
if ($status === 201) {
header('Location: /spasibo');
} else {
error_log('Дескус: ' . ($response['error']['message'] ?? $status) . ' ' . ($response['error']['request_id'] ?? ''));
header('Location: /oshibka');
}Node.js
app.post("/form", express.urlencoded({ extended: false }), async (req, res) => {
const response = await fetch("https://app.deskus.ru/api/v1/tickets", {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.DESKUS_KEY}`,
"Content-Type": "application/json",
"Idempotency-Key": `form-${req.body.form_id}`,
},
body: JSON.stringify({
message: req.body.message,
client: { name: req.body.name, email: req.body.email, phone: req.body.phone },
}),
});
res.redirect(response.status === 201 ? "/spasibo" : "/oshibka");
});Полезно знать
form_id— скрытое поле со случайным значением, которое форма получает при открытии. Двойной клик по «Отправить» тогда не создаст два тикета (идемпотентность).Ответ сотрудника уйдёт клиенту письмом, если он оставил почту. Без почты и телефона ответить будет некуда.
Согласие на обработку персональных данных собирайте на форме сами — по 152-ФЗ отвечает владелец сайта.
