Integrasi WhatsApp
Integrasi WhatsApp
Panduan ini menjelaskan cara menghubungkan nomor WhatsApp Business melalui Meta WhatsApp Cloud API ke OmniStream menggunakan alur manual. Setelah selesai, pesan masuk ke nomor tersebut akan muncul di inbox OmniStream, dan balasan keluar akan dikirim kembali melalui Cloud API.
Peran: Hanya Admin yang dapat membuka halaman Integrations. Rute frontend:
/integrations
Prasyarat
- Meta App di developers.facebook.com dengan produk WhatsApp aktif.
- WhatsApp Business Account (WABA) yang terhubung ke Meta App.
- Nomor telepon yang telah ditambahkan ke WABA dan memiliki
phone_number_id. - Permanent access token dengan izin
whatsapp_business_messagingdanwhatsapp_business_management. - Akses ke server OmniStream Anda pada URL publik (misalnya
https://omnistream.example.com) agar Meta dapat memanggil webhook.
Variabel lingkungan yang dibutuhkan
Nilai berikut berasal dari .env.example dan juga dapat dikelola melalui UI Integrations (kecuali META_APP_SECRET dan META_VERIFY_TOKEN yang selalu dibaca dari .env):
| Variabel | Asal | Kegunaan |
|---|---|---|
META_APP_SECRET | Meta App Dashboard → Settings → Basic | Memverifikasi tanda tangan X-Hub-Signature-256 pada webhook |
META_VERIFY_TOKEN | Anda yang menentukan | Nilai sembarang untuk handshake verifikasi webhook Meta |
META_ACCESS_TOKEN | Meta App Dashboard → WhatsApp → API Setup | Token bearer untuk mengirim pesan ke Cloud API |
META_PHONE_NUMBER_ID | Meta App Dashboard → WhatsApp → API Setup | ID numerik nomor WhatsApp yang dipakai |
META_API_URL | default https://graph.facebook.com/v21.0 | Endpoint Graph API Meta |
Lihat .env.example di akar repo untuk nilai fallback lengkap.
Langkah-langkah
1. Dapatkan kredensial Meta
- Masuk ke developers.facebook.com.
- Pilih app Anda, lalu buka App Settings → Basic.
- Salin App Secret; simpan sebagai
META_APP_SECRETdi.envserver OmniStream. - Buka WhatsApp → API Setup dan salin:
- Temporary access token (untuk uji coba) atau buat System User untuk permanent token.
- Phone number ID dari nomor yang akan dipakai.
- Tentukan
META_VERIFY_TOKENsendiri. Nilai ini harus cocok antara.envdan Meta App Dashboard.
2. Isi .env di server
Code
Restart webhook-ingestor dan message-sender satu kali setelah mengubah .env. Perubahan via UI Integrations setelah itu tidak memerlukan restart (hot-reload 30 detik).
3. Konfigurasi webhook di Meta App Dashboard
- Di Meta App → WhatsApp → Configuration → Webhook, klik Edit.
- Masukkan Callback URL:
https://<host-omnistream>/webhook/whatsapp- Di development lokal, OmniStream mengekspos
webhook-ingestorpada port 3001; Anda perlu tunnel (misalnya ngrok) agar Meta dapat menjangkaunya.
- Di development lokal, OmniStream mengekspos
- Masukkan Verify Token: nilai yang sama dengan
META_VERIFY_TOKENdi.env. - Klik Verify and Save. Meta akan mengirim
GET /webhook/whatsappdenganhub.mode=subscribe; OmniStream akan membalashub.challengejika token cocok. - Pada bagian Webhook fields, langganan ke event
messages.
4. Tambahkan integrasi di UI OmniStream
- Masuk sebagai admin dan buka Integrations (
/integrations). - Klik + Add Integration, pilih channel WhatsApp.
- Masukkan
phone_number_id,access_token, dan setelan opsional lain (misalnyadivision_idjika memakai divisi). - Klik Save. Baris baru muncul pada tabel
integrationsdenganis_active = true. - Tunggu sampai 30 detik agar
message-senderdanwebhook-ingestormemuat ulang konfigurasi (hot-reload).
5. Kirim pesan uji
- Dari perangkat lain, kirim pesan WhatsApp ke nomor yang baru saja dikonfigurasi.
- Buka Inbox di OmniStream; percakapan baru akan muncul dalam beberapa detik.
- Balas dari Inbox. Pesan akan dikirim kembali melalui Graph API menggunakan
META_ACCESS_TOKEN. - Jika pesan uji tidak muncul, periksa log
webhook-ingestor— kegagalan HMAC paling sering disebabkan olehMETA_APP_SECRETyang tidak cocok antara Meta dan.env.
Multi-tenant dan atribusi akun
webhook-ingestor menangani payload WhatsApp multi-tenant dengan benar: setiap entry[].changes[] diemit sebagai event Kafka terpisah dan dipetakan ke integration_account_id berdasarkan value.metadata.phone_number_id. Jadi satu request dari Meta yang berisi pesan untuk beberapa nomor akan terbagi rapi ke integrasi masing-masing tanpa bocor ke tenant lain.
Troubleshooting
- Webhook verification gagal (
HTTP 401) — periksaMETA_VERIFY_TOKENdi.envidentik dengan yang dimasukkan di Meta App Dashboard. - Semua payload masuk ditolak
InvalidSignature—META_APP_SECRETtidak cocok. Token ini tidak bisa di-hot-reload; perlu restart proseswebhook-ingestorsetelah mengubah.env. - Pesan keluar ditolak
(#190) Invalid OAuth access token—META_ACCESS_TOKENkedaluwarsa. Buat token permanen lewat System User, lalu perbarui lewat UI Integrations. - Nomor tidak dikenali — pastikan
phone_number_idpada integration_account sesuai dengan yang ada dimetadata.phone_number_idMeta.
WhatsApp Embedded Signup
Ditangguhkan di v1
OmniStream memiliki draf awal untuk alur WhatsApp Embedded Signup yang memungkinkan admin mendaftarkan nomor tanpa keluar aplikasi (commit 6f5f4dd). Namun dokumentasi dan hardening lengkap belum termasuk di v1. Untuk v1, gunakan alur manual pada halaman ini.
Detail deferral dan jadwal v1.1 tercatat pada docs-site/SCOPE.md Bagian 2.1 baris 4 dan 4 (Backend follow-up BE4). Jangan mengandalkan alur Embedded Signup sampai banner ini dihapus.
Hubungan dengan API Reference
Endpoint REST untuk mengelola integrasi WhatsApp tersedia di bawah tag Integrations pada API Reference, termasuk PUT /api/integrations/whatsapp untuk upsert dan GET /api/integrations/whatsapp untuk inspeksi (config di-mask).