Tersediaprovider: zoom · jenis: video

Integrasi Zoom

Hubungkan Zoom ke Termilo untuk membuat link meeting otomatis. Start URL host tetap aman di server.

Lihat .md

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.

Endpoint OAuth Zoom berada di bawah sesi dashboard (login Google + cookie __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 OAuth diverifikasi
Callback menolak 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.

MethodPathCSRFKeterangan
GET/api/integrations/zoom/oauth/startMulai alur OAuth. Mengarahkan ke layar otorisasi Zoom.
GET/api/integrations/zoom/oauth/callbackCallback dari Zoom. Menukar code menjadi token, lalu menyimpannya terenkripsi.
POST/api/integrations/zoom/disconnectwajibMemutus koneksi dan menonaktifkan token tersimpan.
POST/api/integrations/zoom/health-checkwajibMemeriksa keadaan koneksi dan memperbarui status pill.
Akses Zoom tetap melalui sesi dashboard
Endpoint pengelolaan Zoom di atas dilindungi sesi dashboard. API key partner sudah live untuk route /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.

PARAMETERTIPEWAJIBKETERANGAN
location_typestringwajibJenis lokasi booking. Untuk Zoom bernilai "online".
providerstringwajibKunci provider, "zoom".
external_meeting_idstringwajibID meeting yang dikembalikan Zoom.
join_urlstringwajibTautan join untuk peserta. Tersimpan di booking dan tampil ke bisnis.
display_labelstringopsionalLabel yang tampil, mis. "Zoom Meeting".

Contoh baris booking_locations setelah meeting dibuat:

201 Createdapplication/json
{
"location_type": "online",
"provider": "zoom",
"external_meeting_id": "87654321090",
"join_url": "https://zoom.us/j/87654321090?pwd=...",
"display_label": "Zoom Meeting"
}

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.

Jangan pernah bocorkan start_url ke pelanggan
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:

connectedneeds_reauthdisabled_by_usererror

Status ini berlaku untuk Google dan Zoom. Bila koneksi needs_reauth, hubungkan ulang dari Integrasi → Zoom.

Pertanyaan umum#

Tidak. Integrasi Zoom memakai OAuth tingkat-pengguna (user-level), bukan aplikasi Server-to-Server. Setiap host menghubungkan akun Zoom-nya sendiri, dan meeting dibuat atas nama pengguna tersebut.