Tutorial

Cara Integrasi WA Gateway di PHP Native & Laravel: Panduan Lengkap dengan Contoh Kode

Integrasi WhatsApp Gateway di PHP dan Laravel
Integrasi WhatsApp Gateway di PHP dan Laravel

Ingin aplikasi PHP atau Laravel Anda bisa mengirim pesan WhatsApp secara otomatis? Mulai dari notifikasi pesanan, kode OTP, hingga reminder — semuanya bisa dilakukan dengan mudah menggunakan wagate.id, platform WhatsApp Gateway lokal buatan Indonesia.

Di artikel ini, kita akan membahas langkah demi langkah cara mengintegrasikan wagate.id ke dalam aplikasi PHP murni (native) maupun proyek berbasis Laravel. Tidak perlu akun WhatsApp Business API Meta yang rumit — cukup nomor WA biasa dan koneksi internet.

💡 wagate.id menyediakan REST API yang sederhana, dokumentasi lengkap, dan harga terjangkau mulai dari Rp 25.000/bulan per perangkat. Coba gratis 7 hari — tanpa kartu kredit.

Persiapan Awal: Daftar & Siapkan API Key

Sebelum menulis kode, selesaikan tiga langkah berikut di dashboard wagate.id:

  1. Daftar akun di wagate.id/register — proses hanya 1 menit
  2. Hubungkan perangkat WhatsApp: Perangkat WA → Tambah Perangkat → scan QR dengan HP Anda
  3. Buat API Key: menu API Keys → Tambah → salin key-nya (format: wgk_live_xxxxxxxx)
  4. Catat Device ID perangkat Anda dari halaman detail perangkat

Setelah empat langkah di atas selesai, Anda sudah siap menulis kode integrasi.


Bagian 1: Integrasi di PHP Native (Tanpa Framework)

Jika Anda menggunakan PHP murni (tanpa framework), kita akan memanfaatkan cURL yang sudah tersedia di hampir semua hosting shared maupun VPS.

Fungsi Helper Kirim Pesan

Buat file whatsapp.php dan isi dengan kode berikut:

<?php
// whatsapp.php — Helper kirim pesan WA via wagate.id

define('WA_API_KEY',   'wgk_live_GANTI_DENGAN_API_KEY_ANDA');
define('WA_DEVICE_ID', 'GANTI_DENGAN_DEVICE_ID_ANDA');
define('WA_API_URL',   'https://wagate.id/api/send');

/**
 * Kirim pesan WhatsApp ke satu nomor.
 *
 * @param  string $phone   Nomor tujuan format internasional (628xxx, tanpa +)
 * @param  string $message Teks pesan
 * @return array           ['success' => bool, 'data' => array, 'error' => string|null]
 */
function kirimPesanWA(string $phone, string $message): array
{
    $payload = json_encode([
        'device_id' => WA_DEVICE_ID,
        'phone'     => $phone,
        'message'   => $message,
    ]);

    $ch = curl_init(WA_API_URL);
    curl_setopt_array($ch, [
        CURLOPT_RETURNTRANSFER => true,
        CURLOPT_POST           => true,
        CURLOPT_POSTFIELDS     => $payload,
        CURLOPT_HTTPHEADER     => [
            'Content-Type: application/json',
            'X-Api-Key: ' . WA_API_KEY,
            'Accept: application/json',
        ],
        CURLOPT_TIMEOUT        => 15,
        CURLOPT_SSL_VERIFYPEER => true,
    ]);

    $response = curl_exec($ch);
    $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
    $curlErr  = curl_error($ch);
    curl_close($ch);

    if ($curlErr) {
        return ['success' => false, 'data' => [], 'error' => "cURL error: {$curlErr}"];
    }

    $data = json_decode($response, true) ?? [];

    return [
        'success' => $httpCode === 200 && ($data['success'] ?? false),
        'data'    => $data,
        'error'   => $httpCode !== 200 ? ($data['message'] ?? 'HTTP ' . $httpCode) : null,
    ];
}

Contoh Penggunaan: Notifikasi Pesanan

<?php
require_once 'whatsapp.php';

// Simulasi data pesanan dari database
$nomorPelanggan = '6281234567890';
$nomorPesanan   = 'ORD-' . strtoupper(uniqid());
$totalBayar     = 'Rp 150.000';

$pesan = "Halo! 👋 Pesanan Anda berhasil dibuat.\n\n"
       . "📦 No. Pesanan : {$nomorPesanan}\n"
       . "💰 Total       : {$totalBayar}\n"
       . "⏳ Status      : Menunggu Pembayaran\n\n"
       . "Silakan selesaikan pembayaran dalam 1x24 jam.\n"
       . "Info lebih lanjut: https://toko-anda.com/pesanan/{$nomorPesanan}";

$hasil = kirimPesanWA($nomorPelanggan, $pesan);

if ($hasil['success']) {
    echo "✅ Notifikasi berhasil dikirim!";
} else {
    echo "❌ Gagal: " . $hasil['error'];
}

Contoh Penggunaan: Kirim Kode OTP

<?php
require_once 'whatsapp.php';

function kirimOTP(string $phone): string
{
    // Generate OTP 6 digit
    $otp = str_pad(random_int(0, 999999), 6, '0', STR_PAD_LEFT);

    // Simpan OTP ke session/database dengan expiry 5 menit
    $_SESSION['otp']        = $otp;
    $_SESSION['otp_phone']  = $phone;
    $_SESSION['otp_expire'] = time() + 300;

    $pesan = "🔐 Kode OTP Anda: *{$otp}*\n\n"
           . "Berlaku selama 5 menit.\n"
           . "Jangan berikan kode ini kepada siapapun!";

    kirimPesanWA($phone, $pesan);

    return $otp;
}

// Panggil saat user klik "Kirim OTP"
session_start();
kirimOTP('6281234567890');

Menangani Webhook (Pesan Masuk)

Agar aplikasi Anda bisa menerima balasan dari pelanggan secara real-time, buat file webhook.php:

<?php
// webhook.php — Terima pesan masuk dari wagate.id

// Pastikan request dari wagate.id (verifikasi IP atau secret header)
$raw  = file_get_contents('php://input');
$data = json_decode($raw, true);

if (!$data || !isset($data['event'])) {
    http_response_code(400);
    exit('Invalid payload');
}

$event   = $data['event'];        // 'message.received', 'message.delivered', dll.
$from    = $data['from'] ?? '';   // Nomor pengirim
$message = $data['message'] ?? '';

if ($event === 'message.received') {
    // Proses pesan masuk
    $pesanMasuk = strtolower(trim($message));

    if ($pesanMasuk === 'status') {
        kirimPesanWA($from, "📊 Status akun Anda: Aktif\nSaldo: Rp 250.000\nPoin: 1.250");
    } elseif ($pesanMasuk === 'bantuan') {
        kirimPesanWA($from, "🆘 Ketik salah satu perintah:\n- STATUS: Cek akun\n- PESANAN: Info pesanan terakhir\n- AGEN: Hubungi CS");
    }
}

http_response_code(200);
echo json_encode(['ok' => true]);

Daftarkan URL webhook ini di dashboard wagate.id pada menu pengaturan perangkat Anda.


Bagian 2: Integrasi di Laravel

Untuk proyek Laravel, kita akan memanfaatkan HTTP Client bawaan Laravel (wrapper Guzzle) yang jauh lebih elegan dan ekspresif.

1. Simpan Konfigurasi di .env

Tambahkan baris berikut di file .env:

WAGATEWAY_API_KEY=wgk_live_GANTI_DENGAN_API_KEY_ANDA
WAGATEWAY_DEVICE_ID=GANTI_DENGAN_DEVICE_ID_ANDA
WAGATEWAY_BASE_URL=https://wagate.id/api

2. Daftarkan di config/services.php

// config/services.php
return [
    // ... konfigurasi lain ...

    'wagateway' => [
        'key'       => env('WAGATEWAY_API_KEY'),
        'device_id' => env('WAGATEWAY_DEVICE_ID'),
        'base_url'  => env('WAGATEWAY_BASE_URL', 'https://wagate.id/api'),
    ],
];

3. Buat Service Class

Buat file app/Services/WhatsAppService.php:

<?php

namespace App\Services;

use Illuminate\Support\Facades\Http;
use Illuminate\Http\Client\Response;

class WhatsAppService
{
    private string $apiKey;
    private string $deviceId;
    private string $baseUrl;

    public function __construct()
    {
        $this->apiKey   = config('services.wagateway.key');
        $this->deviceId = config('services.wagateway.device_id');
        $this->baseUrl  = config('services.wagateway.base_url');
    }

    /**
     * Kirim pesan teks ke satu nomor WhatsApp.
     */
    public function send(string $phone, string $message): bool
    {
        $response = Http::withHeaders([
                'X-Api-Key' => $this->apiKey,
                'Accept'    => 'application/json',
            ])
            ->timeout(15)
            ->post("{$this->baseUrl}/send", [
                'device_id' => $this->deviceId,
                'phone'     => $this->normalizePhone($phone),
                'message'   => $message,
            ]);

        return $response->successful() && ($response->json('success') === true);
    }

    /**
     * Kirim pesan ke banyak nomor sekaligus dengan jeda aman.
     *
     * @param array  $phones   Array nomor tujuan
     * @param string $message  Teks pesan
     * @param int    $delayMs  Jeda antar pesan dalam milidetik (default 3 detik)
     * @return array           ['sent' => int, 'failed' => int]
     */
    public function broadcast(array $phones, string $message, int $delayMs = 3000): array
    {
        $sent   = 0;
        $failed = 0;

        foreach ($phones as $i => $phone) {
            $ok = $this->send($phone, $message);
            $ok ? $sent++ : $failed++;

            // Jeda antar pesan (kecuali pesan terakhir)
            if ($i < count($phones) - 1) {
                usleep($delayMs * 1000);
            }
        }

        return compact('sent', 'failed');
    }

    /**
     * Normalisasi nomor ke format internasional tanpa +
     * Contoh: 081234567890 -> 6281234567890
     */
    private function normalizePhone(string $phone): string
    {
        $phone = preg_replace('/[^0-9]/', '', $phone);

        if (str_starts_with($phone, '0')) {
            $phone = '62' . substr($phone, 1);
        }

        return $phone;
    }
}

4. Daftarkan Service Provider (Opsional tapi Direkomendasikan)

// app/Providers/AppServiceProvider.php
use App\Services\WhatsAppService;

public function register(): void
{
    $this->app->singleton(WhatsAppService::class);
}

5. Penggunaan di Controller

<?php

namespace App\Http\Controllers;

use App\Services\WhatsAppService;
use App\Models\Order;
use Illuminate\Http\Request;

class OrderController extends Controller
{
    public function __construct(private WhatsAppService $wa) {}

    // Kirim notifikasi saat pesanan dibuat
    public function store(Request $request): \Illuminate\Http\RedirectResponse
    {
        $order = Order::create($request->validated());

        $pesan = "Halo {$order->customer_name}! 👋\n\n"
               . "✅ Pesanan #{$order->number} berhasil dibuat.\n"
               . "💰 Total: Rp " . number_format($order->total, 0, ',', '.') . "\n"
               . "📦 Status: Menunggu Konfirmasi\n\n"
               . "Kami akan segera memprosesnya. Terima kasih! 🙏";

        $this->wa->send($order->customer_phone, $pesan);

        return redirect()->route('orders.index')
            ->with('success', 'Pesanan berhasil dibuat, notifikasi WA terkirim!');
    }
}

6. Penggunaan di Notification Laravel

Anda juga bisa membuat custom Notification Channel untuk integrasi yang lebih rapi dengan sistem notifikasi Laravel:

<?php
// app/Notifications/OrderConfirmed.php

namespace App\Notifications;

use App\Services\WhatsAppService;
use Illuminate\Notifications\Notification;

class OrderConfirmed extends Notification
{
    public function __construct(private array $orderData) {}

    public function via(object $notifiable): array
    {
        return ['whatsapp']; // custom channel
    }

    public function toWhatsapp(object $notifiable): string
    {
        return "✅ Pesanan #{$this->orderData['number']} dikonfirmasi!\n"
             . "Total: Rp " . number_format($this->orderData['total'], 0, ',', '.') . "\n"
             . "Estimasi kirim: 2-3 hari kerja.";
    }

    public function toArray(object $notifiable): array
    {
        return $this->orderData;
    }
}

// app/Channels/WhatsAppChannel.php
namespace App\Channels;

use App\Services\WhatsAppService;
use Illuminate\Notifications\Notification;

class WhatsAppChannel
{
    public function __construct(private WhatsAppService $wa) {}

    public function send(object $notifiable, Notification $notification): void
    {
        $message = $notification->toWhatsapp($notifiable);
        $phone   = $notifiable->phone; // kolom phone di tabel users

        $this->wa->send($phone, $message);
    }
}

Daftarkan channel di AppServiceProvider:

use App\Channels\WhatsAppChannel;
use Illuminate\Notifications\ChannelManager;

$this->app->extend(ChannelManager::class, function ($service, $app) {
    $service->extend('whatsapp', fn() => $app->make(WhatsAppChannel::class));
    return $service;
});

Lalu gunakan seperti notifikasi Laravel pada umumnya:

$user->notify(new OrderConfirmed(['number' => 'ORD-001', 'total' => 150000]));

7. Terima Webhook di Laravel

Daftarkan route webhook di routes/web.php dan kecualikan dari CSRF:

// routes/web.php
Route::post('/webhook/wagateway', [WebhookController::class, 'handle'])
     ->name('webhook.wagateway');

// app/Http/Middleware/VerifyCsrfToken.php
protected $except = [
    'webhook/wagateway',
];
<?php
// app/Http/Controllers/WebhookController.php

namespace App\Http\Controllers;

use App\Services\WhatsAppService;
use Illuminate\Http\Request;

class WebhookController extends Controller
{
    public function handle(Request $request, WhatsAppService $wa)
    {
        $event   = $request->input('event');
        $from    = $request->input('from');
        $message = strtolower(trim($request->input('message', '')));

        if ($event !== 'message.received') {
            return response()->json(['ok' => true]);
        }

        // Auto-reply berdasarkan kata kunci
        match (true) {
            str_contains($message, 'harga')   => $wa->send($from, "💰 Daftar harga kami: https://wagate.id/pricing"),
            str_contains($message, 'daftar')  => $wa->send($from, "📝 Daftar di sini: https://wagate.id/register"),
            str_contains($message, 'bantuan') => $wa->send($from, "🆘 Tim kami siap membantu!\nHubungi: admin@wagate.id"),
            default                           => $wa->send($from, "👋 Halo! Ketik *bantuan* untuk melihat menu layanan kami."),
        };

        return response()->json(['ok' => true]);
    }
}

Perbandingan: PHP Native vs Laravel

AspekPHP NativeLaravel
Kemudahan setup✅ Langsung pakai✅ Lebih terstruktur
DependencyHanya cURLHTTP Client (bawaan)
Error handlingManualException & retry otomatis
Queue/AsyncManual (pcntl/cron)✅ Job Queue bawaan
TestingSulit✅ Http::fake() tersedia
Cocok untukScript sederhana, CMS lamaAplikasi besar, SaaS

Tips & Best Practice

  • ⏱️ Selalu beri jeda antar pesan broadcast — minimal 2–3 detik untuk menghindari rate-limit
  • 📱 Normalisasi nomor — pastikan format 628xxx, bukan 08xxx atau +628xxx
  • 🔒 Simpan API Key di .env — jangan hardcode di kode sumber atau commit ke Git
  • 📋 Log setiap pengiriman — simpan ke database untuk audit dan debugging
  • 🔄 Implementasikan retry — kirim ulang jika gagal, dengan exponential backoff
  • 🧪 Test di nomor sendiri dulu sebelum deploy ke production
🚀 Butuh lebih dari satu perangkat WhatsApp? wagate.id mendukung multi-device — satu akun bisa mengelola banyak nomor WA sekaligus. Cocok untuk tim CS, divisi berbeda, atau multi-tenant SaaS. Lihat paket harga →

Kesimpulan

Mengintegrasikan WhatsApp ke aplikasi PHP atau Laravel kini tidak lagi rumit. Dengan wagate.id, Anda mendapatkan:

  • ✅ REST API sederhana — kirim pesan dengan satu endpoint
  • ✅ Multi-device — kelola banyak nomor WA dalam satu dashboard
  • ✅ Webhook real-time — terima pesan masuk seketika
  • ✅ Inbox CS — tim support bisa balas chat langsung dari browser
  • ✅ Broadcast — kirim ke ribuan kontak sekaligus
  • ✅ Harga terjangkau — mulai Rp 25.000/bulan per perangkat

Daftar sekarang di wagate.id/register dan kirim pesan WhatsApp pertama Anda dari kode dalam 10 menit.

Bagikan:
Siap Otomasi WhatsApp Bisnis Anda?

Coba WA Gateway gratis 7 hari — REST API, multi-device, webhook real-time.