WEB модули

ВАЖНО:

Данный раздел только если вы создали веб модуль в рамках БОТТ

99% случаев вам не подойдет этот раздел и используйте документацию с публичными ключами


Веб-модули BOT-T — инструкция для разработчиков

Документация для авторов внешних веб-модулей: как подключить модуль к платформе, какие endpoint'ы реализовать на своём сервере и какие запросы отправлять в API BOT-T.


Два раздела интеграции

РазделКто инициаторБазовый URLНазначение
Административные запросыBOT-T → ваш серверURL типа модуля (web_module_type.url)Подключение, настройки, удаление, смена ключа
Запросы из APIваш модуль → BOT-Thttps://api.bot-t.comДанные бота, пользователей, баланс, магазин, рефералы

Ключи и авторизация

public_key (публичный ключ)

  • Идентификатор конкретного экземпляра модуля, привязанного к боту.
  • Генерируется BOT-T при подключении модуля (хеш от bot_id и type_id типа модуля).
  • Не секрет — можно передавать в URL страницы модуля и в публичных API-методах.
  • В ссылке на веб-страницу модуля передаётся в query вместе с bot_id:
https://ваш-хост-модуля/?bot_id=1&public_key=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

private_key (приватный ключ)

  • Секрет сервера модуля. Генерируется BOT-T (хеш от bot_id, type_id и токена бота).
  • Храните только на backend модуля. Не передавайте в браузер, мобильное приложение и публичный JS.
  • Обязателен вместе с public_key для:
    • административных запросов get, update, delete, rotatePrivateKey;
    • приватных методов API BOT-T (баланс, пользователи, Bot API, заказы и т.д.).
  • При компрометации — перевыпуск через rotatePrivateKey (см. ниже).

secret_key (секрет пользователя бота)

  • Отдельный от ключей модуля. Идентифицирует конкретного пользователя бота в контексте модуля.
  • Выдаётся в ответах API пользователя (secret_user_key в объекте пользователя) или формируется после авторизации через Telegram Web App (check-hash).
  • Нужен для операций от имени пользователя: списание/начисление баланса, создание заказа, вывод средств и т.п.
  • Передаётся в теле запроса вместе с user_id (Telegram ID пользователя).

Сводка по методам API BOT-T

Уровень доступаПоля в запросе
Публичный (только модуль)public_key (+ иногда type_id)
Приватный (сервер модуля)public_key + private_key
От имени пользователяpublic_key (+ private_key где требуется) + user_id (Telegram ID) + secret_key

Жизненный цикл модуля

sequenceDiagram
    participant LK as ЛК владельца бота
    participant BOT as BOT-T
    participant MOD as Сервер модуля

    LK->>BOT: Подключить модуль к боту
    BOT->>MOD: GET ping
    MOD-->>BOT: result=true, data=OK
    BOT->>MOD: GET create (bot_id, public_key, private_key)
    MOD-->>BOT: result=true, data=настройки
    BOT->>BOT: Сохранить ключи и настройки

    Note over LK,MOD: Эксплуатация
    MOD->>BOT: POST /v1/module/... (API)
    LK->>BOT: Изменить настройки
    BOT->>MOD: POST update
    MOD-->>BOT: result=true, data=настройки

    LK->>BOT: Удалить модуль
    BOT->>MOD: GET delete (public_key, private_key)
    MOD-->>BOT: result=true
    BOT->>BOT: Удалить запись модуля

Часть 1. Административные запросы (ваш сервер)

Реализуйте на сервере модуля. BOT-T обращается к ним автоматически.

Базовый URL — значение поля URL типа модуля в каталоге BOT-T (без изменений со стороны разработчика модуля при регистрации типа). К URL добавляется имя действия:

ДействиеМетодПример полного URL
pingGET{url}ping
createGET{url}create?bot_id=...&public_key=...&private_key=...
getGET{url}get?public_key=...&private_key=...
updatePOST{url}update?public_key=...&private_key=...
deleteGET{url}delete?public_key=...&private_key=...
rotatePrivateKeyGET{url}rotatePrivateKey?public_key=...&private_key=...&new_private_key=...

Общие требования к ответам

  • HTTP-код 200.
  • Заголовок Content-Type: application/json.
  • Тело — JSON:
{ "result": true, "data": ... }
{ "result": false, "message": "текст ошибки" }

При result: false BOT-T считает операцию неуспешной и показывает message пользователю.


GET ping

Когда вызывается: перед созданием экземпляра модуля (проверка, что сервер доступен).

Параметры: нет.

Успешный ответ: в поле data должна быть строка OK (именно так, без пробелов и лишних символов).

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

GET create

Когда вызывается: один раз при подключении модуля к боту.

Query-параметры:

ПараметрОписание
bot_idID бота в BOT-T
public_keyПубличный ключ, сгенерированный BOT-T
private_keyПриватный ключ, сгенерированный BOT-T

Задача модуля: создать запись экземпляра (привязка bot_id + ключи) и вернуть начальные настройки в data.

Обязательные поля в data:

ПолеОписание
idID экземпляра на стороне модуля
versionВерсия схемы настроек (целое число)
bot_idДолжен совпадать с переданным
public_keyДолжен совпадать с переданным
private_keyДолжен совпадать с переданным

Дополнительно можно вернуть произвольные поля конфигурации (например balance, category_id). BOT-T сохранит их без bot_id, public_key, private_key.

Пример успешного ответа:

{
  "result": true,
  "data": {
    "id": 1,
    "version": 1,
    "bot_id": 42,
    "public_key": "a1b2c3...",
    "private_key": "f0e1d2...",
    "balance": 0
  }
}

GET get

Когда вызывается: синхронизация настроек из ЛК («получить с сервера»).

Query-параметры: public_key, private_key.

Ответ: объект настроек в том же формате, что при create (с обязательными полями id, version, bot_id, public_key, private_key).


POST update

Когда вызывается: сохранение настроек из ЛК.

Query-параметры: public_key, private_key.

Тело: application/x-www-form-urlencoded — пары «ключ → значение» настроек (без bot_id, public_key, private_key в теле).

Ответ: полный актуальный объект настроек в data.


GET delete

Когда вызывается: удаление модуля из бота в ЛК.

Query-параметры: public_key, private_key.

Задача модуля: удалить данные экземпляра на своей стороне.

Ответ: достаточно { "result": true }. Поле data необязательно.


GET rotatePrivateKey

Когда вызывается: перевыпуск приватного ключа из админки BOT-T.

Query-параметры:

ПараметрОписание
public_keyТекущий публичный ключ
private_keyТекущий приватный ключ
new_private_keyНовый ключ (сгенерирован BOT-T)

Задача модуля: атомарно заменить private_key в своей БД.

Ответ:

{ "result": true }

Часть 2. Запросы из API (BOT-T)

Базовый URL: https://api.bot-t.com

Метод: все перечисленные endpoint'ы — POST.

Заголовки:

Content-Type: application/json

Допускается также application/x-www-form-urlencoded для части методов (см. Swagger).

Формат ответа:

{ "result": true, "data": ... }
{ "result": false, "message": "текст ошибки" }

Лимит: 120 запросов в минуту с одного IP.


Сводная таблица endpoint'ов

URLАвторизацияНазначение
POST /v1/module/bot/get-by-public-keytype_id, public_keyДанные бота по публичному ключу модуля
POST /v1/module/bot/check-hashbot_id, userDataПроверка Telegram Web App / Login и получение пользователя
POST /v1/module/user/check-secretключи модуля + id (tg), secret_keyПроверка secret_key пользователя
POST /v1/module/user/getключи модуля + id (telegram_id)Пользователь бота по Telegram ID
POST /v1/module/user/get-creatorpublic_key, private_keyПользователь-создатель бота
POST /v1/module/user/add-balanceключи + user_id, secret_key, amount, commentНачисление баланса
POST /v1/module/user/subtract-balanceключи + user_id, secret_key, amount, commentСписание баланса
POST /v1/module/user/send-requestключи + user_tg_id, method, paramsВызов метода Telegram Bot API
POST /v1/module/shop/order-createключи + user_id, secret_key, amount, count, category_id, productСоздание заказа магазина
POST /v1/module/shop/send-requestключи + order_id, method, paramsBot API для чата заказа
POST /v1/module/replenishment/create-conclusionpublic_key + user_id, secret_key, amountЗаявка на вывод баланса
POST /v1/module/referral/get-by-public-keytype_id, public_keyНастройки реферальной системы
POST /v1/module/referral/withdrawal-historypublic_key + user_id, secret_key, limit, offsetИстория заявок на вывод

Бот

POST /v1/module/bot/get-by-public-key

Получить информацию о боте, к которому привязан модуль.

ПолеТипОбяз.Описание
type_idintegerдаID типа модуля в каталоге BOT-T
public_keystringдаПубличный ключ экземпляра

POST /v1/module/bot/check-hash

Авторизация пользователя через данные Telegram (Web App, Login Widget).

ПолеТипОбяз.Описание
bot_idintegerдаID бота
userDatastringдаСтрока query-параметров от Telegram (с hash)
bot_clone_idintegerнетID клона бота, если используется

Ответ: объект пользователя бота (BotUserDto), включая secret_user_key для последующих запросов.


Пользователи

POST /v1/module/user/get

ПолеТипОбяз.Описание
idintegerдаTelegram ID пользователя
public_keystringда
private_keystringда

POST /v1/module/user/check-secret

Проверка, что переданный secret_key соответствует пользователю.

ПолеТипОбяз.Описание
idintegerдаTelegram ID
secret_keystringда
public_keystringда
private_keystringда

POST /v1/module/user/get-creator

Данные владельца/создателя бота. Только ключи модуля.

POST /v1/module/user/add-balance / subtract-balance

ПолеТипОбяз.Описание
public_keystringда
private_keystringда
user_idintegerдаTelegram ID
secret_keystringда
amountnumberдаСумма в минимальных единицах (копейки)
commentstringнетКомментарий к операции

Ответ: обновлённый BotUserDto (поле money — в копейках).

POST /v1/module/user/send-request

Прокси к Telegram Bot API от имени бота модуля.

ПолеТипОбяз.Описание
public_keystringда
private_keystringда
user_tg_idintegerдаTelegram ID получателя
methodstringдаИмя метода Bot API (например sendMessage)
paramsobjectдаПараметры метода; chat_id подставится автоматически

Ответ: { "response": { ... } } — ответ Telegram.


Магазин

POST /v1/module/shop/order-create

ПолеТипОбяз.Описание
public_keystringда
private_keystringда
user_idintegerдаTelegram ID
secret_keystringда
amountnumberдаСумма заказа
countintegerдаКоличество
category_idintegerдаID категории/товара
productstringдаНазвание/описание товара

POST /v1/module/shop/send-request

ПолеТипОбяз.Описание
public_keystringда
private_keystringда
order_idintegerдаID заказа
methodstringдаМетод Bot API
paramsobjectдаПараметры метода

Вывод средств и рефералы

POST /v1/module/replenishment/create-conclusion

Создание заявки на вывод. Только public_key (без private_key).

ПолеТипОбяз.Описание
public_keystringда
user_idintegerдаTelegram ID
secret_keystringда
amountintegerдаСумма списания в копейках

Требуется включённая в боте система выводов с обратной связью (feedback).

POST /v1/module/referral/get-by-public-key

ПолеТипОбяз.Описание
type_idintegerда
public_keystringда

Ответ: referral_id, is_active, bonus_source, levels[] с процентами.

POST /v1/module/referral/withdrawal-history

ПолеТипОбяз.Описание
public_keystringда
user_idintegerдаTelegram ID
secret_keystringда
limitintegerнетПо умолчанию 20, макс. 100
offsetintegerнетПагинация

Объект пользователя бота (BotUserDto)

Ключевые поля для интеграции:

ПолеОписание
idID пользователя в контексте бота
user.telegram_idTelegram ID
moneyБаланс в копейках (делить на 100 для отображения)
secret_user_keyСекрет для запросов от имени пользователя (secret_key в API)
statusСтатус пользователя (активен, бан и т.д.)

Рекомендации по безопасности

  1. private_key — только на сервере модуля, никогда в frontend.
  2. secret_key пользователя — не логировать, передавать по HTTPS.
  3. Запросы к API BOT-T с балансом и заказами выполняйте только с backend модуля.
  4. При ошибках административных запросов возвращайте понятный message — он показывается владельцу бота в ЛК.
  5. Endpoint ping должен быть максимально лёгким и не требовать авторизации.

Типичные ошибки

СитуацияЧто проверить
Модуль не подключаетсяping возвращает data: "OK", URL типа модуля доступен с серверов BOT-T
«public_key not found» / «private_key not found»Поля переданы в теле POST (JSON)
«secret key not valid»secret_key соответствует Telegram ID и боту; пользователь есть в боте
create отклонёнВ ответе data совпадают bot_id, public_key, private_key с query
429 / лимитНе более 120 запросов/мин к /v1/module/* с одного IP

Чек-лист перед публикацией типа модуля

  • Реализованы ping, create, get, update, delete, rotatePrivateKey
  • Все административные ответы — JSON, HTTP 200, поле result
  • create возвращает обязательные поля настроек
  • Ключи модуля хранятся на backend, не утекают в клиент
  • Авторизация пользователя через check-hash или check-secret
  • Запросы к API BOT-T идут с сервера по HTTPS
  • Обработаны ошибки result: false и показ сообщений пользователю