Обратная связь - Отправка запроса API

Исходящая интеграция API: сообщение с обратной связью

Документация описывает, что BOT-T отправляет во внешние системы, когда пользователь полностью заполнил форму обратной связи (заявка завершена).

Это не API для заполнения формы клиентом


Когда срабатывает

  1. Пользователь ответил на все обязательные вопросы формы.
  2. Статус заявки переводится в завершённый (finishAnswer).
  3. Для каждой записи feedback_api, привязанной к этой форме, выполняется стратегия по типу интеграции.

Доступные типы интеграций (на момент документа):

type (api_type.id)НазваниеИсходящее действие
1Google ТаблицаЗапись строки через Google Sheets API
3Свой API (Custom)HTTP POST на URL владельца

HTTP-запрос

ПараметрЗначение
МетодPOST
URLПоле public_key в настройках интеграции (в ЛК — публичный ключ; фактически полный URL вашего webhook, например https://api.bot-t.com/feedback/hook)
Телоapplication/x-www-form-urlencoded (Guzzle form_params)
ПроксиСистемный прокси BOT-T (как в ApiRequestService) — при необходимости учитывайте на стороне firewall

Данные тела формируются из объекта FeedbackAnswerDto приведением (array) $answerDto — в POST попадают публичные scalar-поля верхнего уровня. Вложенные объекты (user, status, items, adminAnswer) в form-urlencoded не раскладываются в JSON; для интеграции ориентируйтесь прежде всего на:

ПолеТипОписание
idintID заявки (ответа)
feedback_idintID формы обратной связи
answerstringСводный текст заявки — все вопросы и ответы в читаемом виде
created_timestringВремя начала (Y-m-d H:i, часовой пояс бота)
notice_timestring|nullВремя напоминания
deleted_timestringВремя автоудаления заявки
datastring|nullJSON-строка спец. данных (например order_id для форм доставки)
bot_idint|nullID бота

Поле answer — основной источник для CRM/скриптов: там уже собран текст по всем полям формы.

Пример логики тела (упрощённо):

id=5001
&feedback_id=120
&answer=Вопрос%3A+Имя%0AОтвет%3A+Иван
&created_time=23-05-26+15%3A32
&deleted_time=24-05-26+15%3A32
&data=%7B%22order_id%22%3A%22123132%22%7D
&bot_id=42

Если нужна полная структура по каждому вопросу (items, файлы, select), её следует получать отдельно через API заявок ЛК (v1/bot/messagenew/feedback/answer/*) по id заявки — исходящий Custom webhook на это не рассчитан.

Ожидаемый ответ вашего сервера

Ответ должен быть HTTP 200 и JSON:

Успех:

{
  "result": true,
  "data": { }
}

Опциональные поля в data:

ПолеТипПоведение BOT-T
messagestringТекст отправляется пользователю в Telegram (parse_mode: HTML)
is_repeatboolЕсли true — заявка удаляется, пользователю снова отправляется стартовое сообщение формы (повторное заполнение)

Ошибка:

{
  "result": false,
  "message": "Описание ошибки"
}

При result: false или исключении текст из message (или текста ошибки) записывается в заявку как служебное сообщение (read), администратор видит ошибку в ЛК.

Валидация ответа: core/services/common/ApiRequestService.php (sendPostNew).


Тип «Google Таблица»

Реализация: core/services/common/ApiType/strategy/GoogleTableApiTypeStrategy.php.

Это не HTTP на ваш сервер, а запись в Google Sheets через официальный API.

Настройки в ЛК

ПолеНазначение
public_keyID таблицы (spreadsheet id)
private_keyJSON service account (учётные данные Google)
private_key_2Зарезервировано в форме обновления

Формат записи

  1. При первой записи в диапазон A1:F выставляется строка заголовков:
    ID:, FEEDBACK_ID:, ANSWER:, CLIENT_TELEGRAM_ID:, CLIENT_FIRST_NAME:, CLIENT_USERNAME:

  2. Новая заявка добавляется в следующую свободную строку (колонки A–F):

КолонкаЗначение
Aid заявки
Bfeedback_id
Canswer (сводный текст)
Duser.telegram_id
Euser.first_name
Fuser.username

Лимит: 1000 строк данных; при превышении запись пропускается, владельцу бота уходит уведомление в админ-панель.


Настройка интеграций через API ЛК

Базовый URL: v1/bot/messagenew/feedback/api/

Авторизация: как у остального API редактора (bot_id, token бота в query, тело JSON).

Основные методы

ActionНазначение
indexСписок интеграций формы
accessДоступные типы для добавления
countКоличество интеграций
createСоздать (message_id, type = id api_type)
updateОбновить ключи (id, public_key, private_key, private_key_2)
deleteУдалить (id или массив id)

Ответ index / create / updateFeedbackApiDto

{
  "id": 10,
  "type": {
    "id": 3,
    "name": "Свой API",
    "image": "...",
    "description": "..."
  },
  "setting": {
    "id": 55,
    "public_key": "https://api.bot-t.com/hook",
    "private_key": "secret_or_json",
    "private_key_2": ""
  }
}

Для Custom в public_key указывается URL webhook, в private_key / private_key_2 — дополнительные секреты по необходимости (в Custom-стратегии в запросе используется только URL из public_key).


Полная структура заявки (справочно)

Если вы строите свой обработчик и забираете данные не только из form POST, полная модель заявки — FeedbackAnswerDto (api/modules/v1/dto/bot/message/feedback/answer/FeedbackAnswerDto.php):

ПолеОписание
items[]Ответы по каждому вопросу (input / select / file / crossroad)
userUserDto: id, telegram_id, username, first_name, last_name, link, type
statusid: 0 — в процессе, 1 — не прочитан, 2 — прочитан, 3 — отвечен; title — подпись
adminAnswerСообщение-ответ администратора (MessageDto), если есть

Типы вопросов в items[].type: INPUT = 1, FILE = 2, SELECT = 3, CROSSROAD


Схема завершения заявки

sequenceDiagram
    participant User as Пользователь
    participant Bot as BOT-T
    participant Hook as Ваш API / Google Sheets

    User->>Bot: Последний ответ формы
    Bot->>Bot: finishAnswer()
    loop Каждая интеграция feedback_api
        alt Custom (type=3)
            Bot->>Hook: POST form_params (FeedbackAnswerDto)
            Hook-->>Bot: JSON result/data
        else Google Table (type=1)
            Bot->>Hook: Google Sheets API append row
        end
    end
    Bot->>User: end_message (если настроено)