ДескусДескус · Документация
Все разделыРецепты

Форма сайта → тикет

Посетитель заполняет форму на сайте — в Дескусе появляется тикет с его почтой и вопросом. Ключ 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-ФЗ отвечает владелец сайта.

Не нашли ответ? Напишите нам
Поддержка ответит в рабочее время.
Вы сотрудник «Дескус»?Изменить статью в Дескусе