Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

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

Эта страница проходит через минимальное полезное Mini App: инициализация SDK, получение инстанса WebApp, сигнал готовности, чтение данных запуска и показ MainButton.

1. Инициализация SDK и получение инстанса

init_sdk() разбирает initData и themeParams из Telegram.WebApp и сохраняет их в глобальном контексте. После этого получите живой хендл WebApp.

Есть два аксессора:

  • TelegramWebApp::instance() возвращает Option<TelegramWebApp> (None, если код запущен не внутри Telegram) — удобно для graceful degradation.
  • TelegramWebApp::try_instance() возвращает Result<TelegramWebApp, JsValue> — удобно внутри функций, использующих ?.
use telegram_webapp_sdk::{core::init::init_sdk, webapp::TelegramWebApp};
use wasm_bindgen::prelude::*;

#[wasm_bindgen]
pub fn main() -> Result<(), JsValue> {
    init_sdk()?;

    let app = TelegramWebApp::try_instance()?;
    app.ready()?;   // сообщаем Telegram, что интерфейс инициализирован
    app.expand()?;  // разворачиваем Mini App на полную высоту

    Ok(())
}

Если нужен запуск без паники, используйте try_init_sdk() — он возвращает Ok(false), когда Telegram недоступен:

use telegram_webapp_sdk::core::init::try_init_sdk;

match try_init_sdk() {
    Ok(true) => { /* запущено внутри Telegram */ }
    Ok(false) => { /* обычный браузер — используем фолбэк */ }
    Err(e) => eprintln!("ошибка инициализации: {e}")
}

2. Чтение init data и пользователя

Разобранные данные запуска лежат в глобальном TelegramContext. Доступ — через геттер на основе замыкания:

use telegram_webapp_sdk::core::context::TelegramContext;

TelegramContext::get(|ctx| {
    if let Some(user) = &ctx.init_data.user {
        web_sys::console::log_1(&format!("Привет, {}", user.first_name).into());
    }
    let _ = ctx.init_data.auth_date;
    let _ = ctx.init_data.start_param.as_deref();
});

Для серверной проверки подписи возьмите сырую URL-кодированную строку и отправьте её на бэкенд (проверяйте там, с токеном бота — никогда на клиенте):

use telegram_webapp_sdk::TelegramWebApp;

let raw_init_data = TelegramWebApp::get_raw_init_data()?;
// POST /auth  { "init_data": raw_init_data }
Ok::<(), Box<dyn std::error::Error>>(())

3. Минимальный MainButton

Задайте подпись, покажите кнопку и зарегистрируйте колбэк клика. Колбэк возвращает EventHandle, который позже можно передать в remove_main_button_callback.

use telegram_webapp_sdk::webapp::TelegramWebApp;

fn run() -> Result<(), wasm_bindgen::JsValue> {
let app = TelegramWebApp::try_instance()?;

app.set_main_button_text("Отправить заказ")?;
app.set_main_button_color("#2481cc")?;
app.enable_main_button()?;
app.show_main_button()?;

let handle = app.set_main_button_callback(|| {
    if let Some(app) = TelegramWebApp::instance() {
        let _ = app.send_data("order-confirmed");
    }
})?;

// позже, когда кнопка больше не нужна:
app.remove_main_button_callback(handle)?;
app.hide_main_button()?;
Ok(())
}

Что дальше