Telegram Mini App
Kontrak backend dan panduan implementasi frontend Telegram Mini App menggunakan Sejoli Telegram dan Sejoli API.
Halaman ini adalah kontrak implementasi frontend Telegram Mini App (TMA). Sejoli Telegram memverifikasi identitas Telegram dan menghubungkannya ke user WordPress; Sejoli API menerbitkan user-session JWT dan menyediakan data identity-bound melalui /me/*.
Prasyarat
- Sejoli Telegram aktif, berlisensi, dan Bot Token telah dikonfigurasi.
- Sejoli API aktif dan berlisensi. TMA tidak menerbitkan session tanpa plugin ini.
- Mini App dibuka dari bot Telegram sehingga
Telegram.WebApp.initDatatersedia. - Frontend hanya menggunakan HTTPS dan base URL WordPress yang telah ditentukan admin.
- Jika binding via OTP diinginkan, aktifkan pengaturan Link Account via OTP pada Sejoli Telegram.
Pembagian Tanggung Jawab
Base URL yang digunakan:
State Machine Frontend
stateDiagram-v2
[*] --> Booting
Booting --> InvalidContext: initData kosong
Booting --> NeedsLink: session needs_link
Booting --> Authenticated: session authenticated
Booting --> Failed: error backend
NeedsLink --> ProfileOnly: link_method profile
NeedsLink --> Credentials: link_method otp
Credentials --> WaitingOTP: OTP terkirim
WaitingOTP --> Authenticated: OTP valid
WaitingOTP --> Credentials: OTP kedaluwarsa atau limit percobaan
Authenticated --> Authenticated: panggil /me/*
Authenticated --> NeedsLink: unlink berhasil
Authenticated --> Booting: session invalid atau kedaluwarsa
Saat aplikasi dibuka, frontend selalu memulai dari POST /tma/session. Jangan menganggap token lama masih valid tanpa menangani response 401 dari endpoint /me/*.
1. Membuat atau Memulihkan Session
Jika akun Telegram sudah terhubung:
data dipertahankan sebagai envelope kompatibilitas. Implementasi baru dianjurkan membaca field top-level token, user, status, dan expires_in.
Jika akun belum terhubung dan OTP aktif:
Jika OTP dimatikan, response memakai:
Pada state profile, frontend harus mengarahkan user agar login ke Member Area, membuka Profile, lalu memilih Connect Telegram. Jangan tetap menampilkan form password/OTP.
2. Meminta OTP
Endpoint ini hanya tersedia secara fungsional ketika OTP diaktifkan.
Response berhasil:
OTP dikirim ke chat Telegram yang membuka Mini App, bukan ditampilkan frontend. Request dibatasi per Telegram ID dan per IP; frontend harus menghormati retry_after pada error 429.
3. Verifikasi OTP dan Binding
Response berhasil sama dengan response authenticated dari /tma/session. Simpan token, lalu gunakan sebagai Bearer token.
Satu challenge menerima maksimal lima kode yang salah. Backend menghapus challenge pada kesalahan kelima; user harus meminta OTP baru.
4. Mengambil Data User dari Sejoli API
Identitas user selalu berasal dari JWT. Jangan mengirim atau mempercayai user_id dari frontend untuk menentukan pemilik data.
Endpoint bawaan dan kontrak lengkap tersedia pada dokumentasi Sejoli API → Endpoint /me. Endpoint tambahan dapat muncul ketika snippet atau plugin lain mendaftarkannya melalui hook sejoli_api_after_register_routes.
Frontend harus memperlakukan module opsional sebagai capability:
404 rest_no_route: fitur/module tidak tersedia; sembunyikan menu terkait.401 sejoli_session_invalid_token: hapus token lokal dan ulangi bootstrap session.403: user terautentikasi tetapi tidak memiliki izin.
5. Unlink
Response:
Setelah sukses, frontend wajib menghapus token lokal dan kembali ke state needs_link. Unlink mencabut seluruh user-session JWT Sejoli API milik user tersebut, termasuk session yang diterbitkan melalui integrasi lain.
TypeScript Contract
Contoh bootstrap minimal:
Error yang Harus Ditangani
Keamanan Implementasi
- Kirim
initDatamentah; jangan parse lalu membangun ulang string sebelum request. - Backend memverifikasi HMAC,
auth_date, umur maksimum, dan Telegram user object. - Jangan gunakan
initDataUnsafesebagai bukti autentikasi. - Jangan menaruh API key atau secret server dalam environment variable frontend yang ikut masuk bundle.
- Jangan mencatat password, OTP,
initData, atau JWT ke analytics dan error-reporting publik. - Simpan JWT sesingkat yang diperlukan dan hapus setelah unlink atau response session invalid.
- Terapkan Content Security Policy dan batasi origin deployment frontend.
- Webhook Secret adalah urusan Telegram Bot API → backend dan tidak pernah dikirim ke Mini App.
Cloudflare dan Rate Limit IP
Secara default backend hanya memakai REMOTE_ADDR. Jika origin benar-benar hanya dapat dicapai melalui Cloudflare, admin/developer dapat mengaktifkan penggunaan CF-Connecting-IP:
Resolver juga dapat disesuaikan melalui filter sejoli_telegram_tma_client_ip, tetapi hasil akhirnya harus berupa IPv4 atau IPv6 yang valid.
Checklist Sebelum Rilis
- Buka Mini App dari bot dan pastikan
/tma/sessionmemvalidasiinitDataasli. - Uji state akun terhubung, akun belum terhubung dengan OTP, dan mode Profile-only.
- Uji kredensial salah, OTP salah lima kali, cooldown, dan expiry.
- Uji bot yang belum pernah ditekan Start.
- Uji
/me, endpoint admin dengan member biasa, dan module/me/*opsional yang tidak aktif. - Uji unlink, lalu pastikan token lama menerima
401. - Pastikan bundle frontend tidak mengandung Bot Token, Webhook Secret, API key, atau signing secret.
- Pastikan error log/analytics tidak merekam password, OTP,
initData, atau JWT.
Last updated Aug 15, 2026