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:
- Daftar akun di wagate.id/register — proses hanya 1 menit
- Hubungkan perangkat WhatsApp: Perangkat WA → Tambah Perangkat → scan QR dengan HP Anda
- Buat API Key: menu API Keys → Tambah → salin key-nya (format:
wgk_live_xxxxxxxx) - 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
| Aspek | PHP Native | Laravel |
|---|---|---|
| Kemudahan setup | ✅ Langsung pakai | ✅ Lebih terstruktur |
| Dependency | Hanya cURL | HTTP Client (bawaan) |
| Error handling | Manual | Exception & retry otomatis |
| Queue/Async | Manual (pcntl/cron) | ✅ Job Queue bawaan |
| Testing | Sulit | ✅ Http::fake() tersedia |
| Cocok untuk | Script sederhana, CMS lama | Aplikasi besar, SaaS |
Tips & Best Practice
- ⏱️ Selalu beri jeda antar pesan broadcast — minimal 2–3 detik untuk menghindari rate-limit
- 📱 Normalisasi nomor — pastikan format
628xxx, bukan08xxxatau+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.