Chatbot WhatsApp yang resmi dibangun di atas WhatsApp Business Platform (Cloud API) dari Meta: pesan masuk dikirim ke webhook aplikasimu, aplikasimu memproses isinya, lalu membalas lewat API. Dengan Laravel, alurnya cukup satu route webhook, satu controller, dan satu service untuk mengirim pesan. Hindari library tidak resmi yang meniru WhatsApp Web, karena nomor bisa diblokir dan melanggar ketentuan layanan.

Memilih Jalur API

  • Cloud API langsung dari Meta: daftar lewat Meta for Developers, butuh akun Meta Business yang terverifikasi untuk skala produksi.
  • Lewat BSP (Business Solution Provider): penyedia resmi yang membantu proses pendaftaran, dashboard, dan dukungan lokal. Cocok kalau tidak ingin mengurus semuanya sendiri.

Biaya mengikuti skema harga WhatsApp Business yang berlaku untuk kategori pesan dan negara tujuan. Cek halaman harga resmi karena skema ini pernah berubah.

Aturan Penting Sebelum Coding

  • Jendela layanan 24 jam. Setelah pelanggan mengirim pesan, kamu bisa membalas dengan pesan bebas selama 24 jam. Di luar jendela itu, hanya boleh mengirim template yang sudah disetujui.
  • Opt-in. Kirim pesan proaktif hanya ke pelanggan yang setuju dihubungi lewat WhatsApp.
  • Kebijakan konten. Ada kategori bisnis dan jenis pesan yang dibatasi. Baca kebijakan WhatsApp Business sebelum meluncurkan.

Langkah 1: Route Webhook

// routes/web.php (atau api.php), kecualikan dari CSRF
Route::get('/webhooks/whatsapp', [WhatsAppWebhookController::class, 'verify']);
Route::post('/webhooks/whatsapp', [WhatsAppWebhookController::class, 'receive']);

Langkah 2: Verifikasi Webhook

Saat mendaftarkan URL webhook, Meta mengirim request GET berisi token yang harus dicocokkan:

public function verify(Request $request): Response
{
    abort_unless($request->query('hub_verify_token') === config('services.whatsapp.verify_token'), 403);

    return response($request->query('hub_challenge'));
}

Langkah 3: Terima Pesan dan Cek Tanda Tangan

public function receive(Request $request): Response
{
    $signature = 'sha256='.hash_hmac('sha256', $request->getContent(), config('services.whatsapp.app_secret'));
    abort_unless(hash_equals($signature, (string) $request->header('X-Hub-Signature-256')), 401);

    $message = data_get($request->all(), 'entry.0.changes.0.value.messages.0');

    if ($message) {
        HandleIncomingWhatsApp::dispatch($message);   // proses di queue
    }

    return response('OK');   // balas cepat agar Meta tidak mengulang kiriman
}

Pengecekan tanda tangan memastikan request benar-benar dari Meta. Proses di queue membuat webhook membalas cepat; Meta akan mengirim ulang webhook yang tidak dijawab tepat waktu.

Langkah 4: Kirim Balasan

class WhatsAppClient
{
    public function sendText(string $to, string $body): void
    {
        Http::withToken(config('services.whatsapp.token'))
            ->post('https://graph.facebook.com/'.config('services.whatsapp.version').'/'.config('services.whatsapp.phone_id').'/messages', [
                'messaging_product' => 'whatsapp',
                'to' => $to,
                'type' => 'text',
                'text' => ['body' => $body],
            ])
            ->throw();
    }
}

Simpan versi Graph API di konfigurasi agar mudah diperbarui saat Meta merilis versi baru.

Langkah 5: Alur Menu Chatbot WhatsApp

class HandleIncomingWhatsApp implements ShouldQueue
{
    public function __construct(public array $message) {}

    public function handle(WhatsAppClient $client): void
    {
        $from = $this->message['from'];
        $text = Str::lower(trim(data_get($this->message, 'text.body', '')));

        $reply = match (true) {
            in_array($text, ['menu', 'halo', 'hi']) => "Halo Kak! Ketik:\n1 Cek pesanan\n2 Jam buka\n3 Bicara dengan admin",
            $text === '1' => 'Silakan kirim nomor pesanan, contoh: INV-1024',
            Str::startsWith($text, 'inv-') => $this->orderStatus($text),
            $text === '2' => 'Kami buka Senin-Sabtu, 08.00-17.00 WIB.',
            $text === '3' => 'Baik, admin akan membalas secepatnya.',
            default => 'Maaf, belum paham. Ketik "menu" untuk melihat pilihan.',
        };

        $client->sendText($from, $reply);
    }
}

Untuk alur yang lebih rumit, simpan status percakapan per nomor (misalnya "menunggu nomor pesanan") di database atau cache. WhatsApp juga mendukung pesan interaktif dengan tombol dan daftar pilihan, yang lebih nyaman daripada mengetik angka.

Menambahkan AI dengan Aman

Jawaban bebas dari AI bisa ditambahkan untuk pertanyaan umum, dengan syarat AI hanya menjawab dari data toko dan punya jalur serah ke admin. Pola menyusun konteksnya ada di context engineering, termasuk contoh asisten balas chat pelanggan.

Kesalahan yang Sering Terjadi

  • Memakai library tidak resmi yang menjalankan WhatsApp Web, dengan risiko nomor diblokir.
  • Memproses pesan langsung di webhook sehingga lambat, timeout, dan pesan diproses ganda.
  • Tidak menangani pesan duplikat. Simpan ID pesan yang sudah diproses dan abaikan pengulangan.
  • Tidak ada jalan keluar ke manusia, sehingga pelanggan terjebak di menu.

Langkah Berikutnya

Untuk sekadar membuat tautan chat langsung ke nomor toko di website atau bio media sosial, tidak perlu API; gunakan Generator Link WhatsApp. Kalau chatbot ini bagian dari strategi digital UMKM, baca juga AI untuk bisnis kecil.