TalkFast · Документация
Mini Apps — мини-приложения

Обзор

TalkFast Mini Apps — это веб-приложения, которые открываются прямо в чате с ботом. Мини-апп — обычная HTTPS-страница на вашем сервере. Приложение TalkFast показывает её в webview и передаёт через JS-мост: кто пользователь, тему оформления, кнопки и события.

Быстрый старт

1. Создайте бота и задайте URL приложения

У вашего бота есть API-токен. Вызовите метод bot_set_webapp:

curl -X POST 'https://talkfast.ru/api.php' \
  -d 'action=bot_set_webapp' \
  -d 'token=ВАШ_ТОКЕН_БОТА' \
  -d 'url=https://example.com/myapp/'

Ответ: {"status":"success","url":"https://example.com/myapp/"}

2. Подключите SDK на своей странице

<script src="https://talkfast.ru/talkfast-webapp.js"></script>
<script>
  const app = window.TalkFast.WebApp;
  app.ready();
  app.expand();
  console.log('Пользователь:', app.initDataUnsafe.user);
</script>

3. Откройте в приложении

В чате с ботом: меню чата (⋯) → «Открыть мини-приложение». Пользователь увидит вашу страницу с вашим интерфейсом и кнопками.

Авторизация: initData

При открытии приложение TalkFast формирует строку initData в формате query-string и передаёт её через app.initData. Поля:

ПолеОписание
userJSON: {"id":123,"first_name":"Имя","username":"login","photo_url":"https://..."}
auth_dateUnix-время авторизации (секунды)
query_idУникальный идентификатор сессии
hashHMAC-SHA256 подпись строки данных

Проверка подписи на вашем сервере

  1. Разберите initData в пары key=value, уберите hash
  2. Отсортируйте пары по имени ключа, склейте через \n — это data_check_string
  3. secret = HMAC_SHA256(key="WebAppData", data=BOT_TOKEN)
  4. hash = HMAC_SHA256(data_check_string, secret) — сравните с hash из initData

PHP

function verifyInitData(string $initData, string $botToken): ?array {
    parse_str($initData, $d);
    if (empty($d['hash'])) return null;
    $hash = $d['hash']; unset($d['hash']);
    ksort($d);
    $pairs = [];
    foreach ($d as $k => $v) { $pairs[] = "$k=$v"; }
    $check = implode("\n", $pairs);
    $secret = hash_hmac('sha256', $botToken, 'WebAppData', true);
    $expected = hash_hmac('sha256', $check, $secret);
    if (!hash_equals($expected, $hash)) return null;
    if (time() - (int)$d['auth_date'] > 86400) return null; // initData живёт сутки
    return json_decode($d['user'] ?? '{}', true);
}

Python

import hmac, hashlib, time
from urllib.parse import parse_qsl

def verify_init_data(init_data: str, bot_token: str):
    d = dict(parse_qsl(init_data))
    received = d.pop('hash', '')
    pairs = sorted(f"{k}={v}" for k, v in d.items())
    check = "\n".join(pairs)
    secret = hmac.new(b"WebAppData", bot_token.encode(), hashlib.sha256).digest()
    expected = hmac.new(secret, check.encode(), hashlib.sha256).hexdigest()
    if not hmac.compare_digest(expected, received):
        return None
    if time.time() - int(d.get('auth_date', 0)) > 86400:
        return None
    return d.get('user')

JavaScript (Node.js)

const crypto = require('crypto');

function verifyInitData(initData, botToken) {
  const d = Object.fromEntries(new URLSearchParams(initData));
  const received = d.hash || '';
  delete d.hash;
  const check = Object.keys(d).sort().map(k => `${k}=${d[k]}`).join('\n');
  const secret = crypto.createHmac('sha256', 'WebAppData').update(botToken).digest();
  const expected = crypto.createHmac('sha256', secret).update(check).digest('hex');
  return crypto.timingSafeEqual(Buffer.from(expected), Buffer.from(received)) ? d.user : null;
}

SDK API — TalkFast.WebApp

Метод / свойствоОписание
initData / initDataUnsafeПодписанная строка и разобранные данные (пользователь, auth_date)
themeParamsЦвета приложения TalkFast (bg_color, button_color, …) — используйте для нативного вида
ready()Сообщить клиенту, что интерфейс готов
expand()Развернуть на весь экран
close()Закрыть мини-приложение
sendData(data)Отправить данные боту (до 4 КБ) и закрыть приложение
openLink(url)Открыть внешнюю ссылку в браузере устройства
showAlert(msg, cb)Показать уведомление
showConfirm(msg, cb)Показать подтверждение
MainButton.setText(t)Текст нижней кнопки
MainButton.show() / hide()Показать/скрыть нижнюю кнопку
MainButton.onClick(fn)Обработчик нажатия нижней кнопки
HapticFeedback.impactOccurred(style)Вибро-отклик (light/medium/heavy)
HapticFeedback.notificationOccurred(type)Вибро-уведомление (success/warning/error)
HapticFeedback.selectionChanged()Лёгкий вибро-отклик выбора

sendData и вебхук бота

Вызов app.sendData('...') отправляет данные вашему боту. На URL вебхука бота приходит POST:

{
  "update_id": 1791990000,
  "message": {
    "message_id": 0,
    "from": { "username": "ivan" },
    "chat": { "id": "ivan" },
    "date": 1791990000,
    "web_app_data": {
      "data": "order:42",
      "button_text": "Открыть"
    }
  }
}

Заголовок X-TalkFast-Secret содержит секрет вебхука бота (как и для остальных событий) — проверяйте его, чтобы убедиться, что запрос пришёл от TalkFast.

Пример: мини-магазин за 20 строк

<script src="https://talkfast.ru/talkfast-webapp.js"></script>
<div id="app">
  <h2>Магазин</h2>
  <button onclick="buy(1)">100 монет — 100₽</button>
  <button onclick="buy(2)">500 монет — 450₽</button>
</div>
<script>
  const app = window.TalkFast.WebApp;
  app.ready();
  app.MainButton.setText('Оплатить').show().onClick(() => buy(1));

  function buy(packId) {
    // можно подписать заказ на своём сервере через initData-пользователя
    app.sendData(JSON.stringify({ action: 'buy', pack: packId }));
  }
</script>

Бот получит web_app_data.data = {"action":"buy","pack":1} и может продолжить оплату через свой вебхук-обработчик.

FAQ

Нужно ли обновлять приложение TalkFast под каждое мини-приложение?

Нет. Платформа (webview + мост + подпись) встроена один раз. Ваше приложение — веб-страница, её можно обновлять в любой момент.

Как проверить локально?

Откройте вашу страницу в обычном браузере — SDK работает и без моста (методы-заглушки), а initData можно подставить тестовый, сгенерировав его вашим бот-токеном по алгоритму выше.

Есть ли ограничения?

Безопасность. Никогда не доверяйте данным из initDataUnsafe без проверки подписи на вашем сервере — иначе пользователь сможет подделать чужой id.

© 2026 TalkFast · Bot API · Главная