Integrasi Zoom
Hubungkan Zoom ke Termilo untuk membuat link meeting otomatis. Start URL host tetap aman di server.
Ringkasan#
Saat host menghubungkan akun Zoom-nya, Termilo membuat satu meeting Zoom untuk setiap booking online dan menyimpan tautan join peserta di booking. Koneksi memakai OAuth tingkat-pengguna (bukan aplikasi Server-to-Server), jadi meeting dibuat atas nama host yang terhubung.
__Host-termilo_session). Permintaan yang mengubah status (disconnect, health-check) memerlukan header CSRF X-Termilo-CSRF.Menghubungkan Zoom (OAuth)#
Dari Integrasi → Zoom, klik Hubungkan. Termilo membuka alur OAuth Zoom; setelah Anda menyetujui, Zoom kembali ke callback Termilo. Termilo menukar code menjadi token, lalu menyimpannya terenkripsi di server. Scope yang diminta: meeting:write:meeting (fallback meeting:write).
# 1. Buka alur OAuth dari dashboard (sesi login + cookie __Host-termilo_session) GET /api/integrations/zoom/oauth/start # 2. Zoom mengembalikan ke callback; Termilo menukar code → token GET /api/integrations/zoom/oauth/callback?code=...&state=... # 3. (opsional) Periksa koneksi POST /api/integrations/zoom/health-check -H "X-Termilo-CSRF: <csrfToken dari GET /api/session>"
state yang tidak cocok dengan OAUTH_STATE_INVALID, dan kegagalan tukar token mengembalikan OAUTH_TOKEN_EXCHANGE_FAILED.Endpoint Zoom#
Empat endpoint mengelola koneksi Zoom. Semua berada di bawah sesi dashboard dan diselesaikan oleh Worker; tidak ada prefiks /v1 hari ini.
| Method | Path | CSRF | Keterangan |
|---|---|---|---|
| GET | /api/integrations/zoom/oauth/start | — | Mulai alur OAuth. Mengarahkan ke layar otorisasi Zoom. |
| GET | /api/integrations/zoom/oauth/callback | — | Callback dari Zoom. Menukar code menjadi token, lalu menyimpannya terenkripsi. |
| POST | /api/integrations/zoom/disconnect | wajib | Memutus koneksi dan menonaktifkan token tersimpan. |
| POST | /api/integrations/zoom/health-check | wajib | Memeriksa keadaan koneksi dan memperbarui status pill. |
/v1/* dan MCP yang didukung, tetapi tidak ada route partner untuk mengelola koneksi Zoom.Pembuatan meeting#
Setelah koneksi aktif, setiap booking online memicu satu panggilan ke Zoom: POST /users/me/meetings. Termilo memakai token Zoom yang tersimpan di server — token itu tidak pernah dikirim ke browser.
POST https://api.zoom.us/v2/users/me/meetings
Authorization: Bearer <token Zoom — server-side, terenkripsi di D1>
Content-Type: application/json
{
"topic": "Konsultasi — Termilo",
"type": 2,
"start_time": "2026-06-24T09:00:00Z",
"duration": 30,
"timezone": "Asia/Jakarta"
}Dari respons Zoom, Termilo menyimpan join_url peserta ke tabel booking_locations (tersimpan di booking dan tampil ke bisnis dan area member), sementara start_url host disimpan terenkripsi di external_meeting_references.host_start_url_encrypted dan tidak pernah ditampilkan.
Contoh baris booking_locations setelah meeting dibuat:
Token & start URL host#
Aturan universal untuk setiap integrasi: token provider dan data meeting khusus host tetap di server. Token dienkripsi AES-GCM dengan TOKEN_ENCRYPTION_KEY dan disimpan di D1 (provider_oauth_tokens.encrypted_token_payload). Token tidak pernah sampai ke browser, konfigurasi embed, KV, log, atau payload antrean.
start_url Zoom memberi kontrol host atas meeting. Bersama password meeting, nilai ini dienkripsi dan hanya boleh dipakai server-side. Bagikan hanya join_url ke peserta.Status koneksi#
Layar Integrasi menampilkan satu status pill per provider, diperbarui oleh health-check:
Status ini berlaku untuk Google dan Zoom. Bila koneksi needs_reauth, hubungkan ulang dari Integrasi → Zoom.