TalkFast Mini Apps — это веб-приложения, которые открываются прямо в чате с ботом. Мини-апп — обычная HTTPS-страница на вашем сервере. Приложение TalkFast показывает её в webview и передаёт через JS-мост: кто пользователь, тему оформления, кнопки и события.
initData — пользователь узнаётся по подписи ботаTalkFast.WebApp: кнопки, тема, хаптика, событияsendData() → вебхук бота событием web_app_dataУ вашего бота есть 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/"}
<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>
В чате с ботом: меню чата (⋯) → «Открыть мини-приложение». Пользователь увидит вашу страницу с вашим интерфейсом и кнопками.
При открытии приложение TalkFast формирует строку initData в формате query-string и передаёт её
через app.initData. Поля:
| Поле | Описание |
|---|---|
user | JSON: {"id":123,"first_name":"Имя","username":"login","photo_url":"https://..."} |
auth_date | Unix-время авторизации (секунды) |
query_id | Уникальный идентификатор сессии |
hash | HMAC-SHA256 подпись строки данных |
initData в пары key=value, уберите hash\n — это data_check_stringsecret = HMAC_SHA256(key="WebAppData", data=BOT_TOKEN)hash = HMAC_SHA256(data_check_string, secret) — сравните с hash из initDatafunction 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);
}
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')
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;
}
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() | Лёгкий вибро-отклик выбора |
Вызов 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.
<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} и может продолжить оплату
через свой вебхук-обработчик.
Нет. Платформа (webview + мост + подпись) встроена один раз. Ваше приложение — веб-страница, её можно обновлять в любой момент.
Откройте вашу страницу в обычном браузере — SDK работает и без моста (методы-заглушки), а
initData можно подставить тестовый, сгенерировав его вашим бот-токеном по алгоритму выше.
https://sendData — до 4 КБinitDataUnsafe без проверки подписи
на вашем сервере — иначе пользователь сможет подделать чужой id.