Halaman ini menjelaskan arsitektur webhook WhatsApp di sistem toko_kopi, termasuk endpoint masuk, cara membedakan provider Wablas dan Meta Cloud API, serta plugin channel untuk Fonnte, Twilio, Baileys, MessageBird, dan Vonage, bentuk payload, proses verifikasi, dan alur pesan sampai masuk ke chatbot.
Provider WhatsApp legacy masuk lewat satu endpoint yang sama:
https://botlelang.com/toko_kopi/public/api/whatsapp/webhook.php
Untuk konfigurasi per cabang, sistem juga mendukung URL khusus cabang:
https://botlelang.com/toko_kopi/public/api/whatsapp/webhook.php?branch=<BRANCH_ID>
URL khusus cabang paling aman dipakai untuk provider legacy seperti Wablas karena branch bisa diikat langsung dari query string.
Fonnte, Twilio, dan Vonage sekarang memakai endpoint plugin channel per cabang di /api/channel/webhook.php.
public/api/whatsapp/webhook.phpapp/WhatsAppProviders/ProviderFactory.phpapp/WhatsAppProviders/MetaCloudApiProvider.phpplugins/fonnte-whatsapp/FonnteWhatsAppChannel.phpplugins/twilio-whatsapp/TwilioWhatsAppChannel.phpplugins/baileys-whatsapp/BaileysWhatsAppChannel.phpplugins/messagebird-whatsapp/MessageBirdWhatsAppChannel.phpplugins/vonage-whatsapp/VonageWhatsAppChannel.phpapp/Services/ChatbotEngine.phpHalaman ini ditautkan dari landing page dan halaman pengaturan WhatsApp supaya tim admin bisa berpindah dari setup ke dokumentasi teknis dengan cepat.
Untuk skenario satu cabang membuka WhatsApp, Telegram, dan Discord sekaligus, lihat juga halaman arsitektur multi-channel.
Deteksi Fonnte dilakukan saat payload memiliki field sender.
Di implementasi saat ini, Fonnte tidak memakai signature verification yang ketat. Validasi utamanya adalah setting provider aktif dan API key tersedia.
Deteksi Meta dilakukan saat payload memiliki entry[0].changes.
Twilio mengirim webhook dalam format application/x-www-form-urlencoded. Field utama yang dipakai adalah From, To, Body, dan AccountSid.
Provider Twilio di project ini mengirim balasan lewat REST API Messages dan dapat memverifikasi header X-Twilio-Signature bila Auth Token diisi.
Baileys bukan provider native PHP. Ia harus berjalan sebagai service Node.js yang meneruskan pesan ke endpoint plugin channel branch ini.
Balasan dari PHP dikirim kembali ke service bridge melalui setting outbound_url plugin, lalu service Node Baileys yang meneruskannya ke WhatsApp.
MessageBird Conversations API mengirim webhook JSON saat ada pesan masuk dengan type message.created dan direction received.
Plugin channel MessageBird membaca payload type=message.created. Signature webhook diverifikasi via HMAC-SHA256 menggunakan Signing Key dari dashboard MessageBird.
Vonage Messages API mengirim webhook JSON untuk pesan WhatsApp masuk dengan field channel=whatsapp.
Vonage menggunakan Basic Auth (API Key:API Secret) untuk pengiriman pesan. Verifikasi webhook dilakukan via header X-Nexmo-Signature atau X-Vonage-Signature dengan HMAC-SHA256.
Meta membutuhkan verifikasi webhook lewat request GET dengan parameter challenge:
Sistem akan:
Untuk Meta, sistem mendukung pengecekan X-Hub-Signature-256 bila api_secret diisi.
MessageBird menggunakan HMAC-SHA256 dari gabungan timestamp, URL, dan SHA256(body) via header MessageBird-Signature. Vonage menggunakan HMAC-SHA256 dari body raw via header X-Nexmo-Signature atau X-Vonage-Signature.
Bila api_secret kosong, webhook tetap diterima agar setup lebih fleksibel saat tahap integrasi awal.
Rekomendasi production: selalu isi api_secret untuk Meta, MessageBird, dan Vonage agar request bisa diverifikasi dengan HMAC SHA-256.
Setelah payload lolos verifikasi, setiap provider diubah ke bentuk internal yang seragam seperti ini:
Format inilah yang kemudian dikirim ke engine chatbot, jadi skill order, promo, dan cart tidak perlu tahu pesan itu datang dari Fonnte atau Meta.