affidev / affichat
Official WhatsApp Notification Channel and PHP Client for AffiChat Gateway
Requires
- php: ^8.0 || ^8.1 || ^8.2 || ^8.3
- guzzlehttp/guzzle: ^7.2
- illuminate/notifications: ^9.0 || ^10.0 || ^11.0 || ^12.0
- illuminate/support: ^9.0 || ^10.0 || ^11.0 || ^12.0
Requires (Dev)
None
Suggests
None
Provides
None
Conflicts
None
Replaces
None
This package is auto-updated.
Last update: 2026-09-26 06:13:52 UTC
README
Channel notifikasi WhatsApp dan klien PHP resmi untuk framework Laravel menggunakan AffiChat Gateway.
Paket ini menghubungkan aplikasi Laravel langsung ke server gateway AffiChat tanpa memerlukan konfigurasi domain manual tambahan.
Fitur Utama
- Laravel Package Auto-Discovery: Otomatis terdaftar pada Laravel 9, 10, 11, dan 12 tanpa registrasi manual di
config/app.php. - Integrasi Notification Channel: Mengembalikan objek
AffiChatMessagepada methodtoAffiChat($notifiable). - Fluent Message Builder: Mendukung pesan teks, gambar dengan caption, dokumen/PDF, video, lokasi GPS, vCard kontak, stiker, dan polling interaktif.
- Resolusi Penerima Otomatis: Mendukung method
routeNotificationForAffiChat(),routeNotificationForWhatsApp(), atau atribut$user->phone_number/$user->phone. - Sanitasi Nomor Otomatis: Format lokal (
08...,+62..., karakter spasi, dan tanda hubung) otomatis dikonversi ke format standar E.164 (628...). - Facade Klien (
AffiChat): Kirim pesan langsung dari Controller, Service, atau Queue Job tanpa membuat class Notification terpisah. - Verifikasi Webhook HMAC-SHA256: Helper terpadu untuk memvalidasi keaslian payload event webhook masuk.
Instalasi
Tambahkan paket ke proyek Laravel melalui Composer:
composer require affidev/affichat
(Opsional) Publikasikan file konfigurasi config/affichat.php:
php artisan vendor:publish --tag=affichat-config
Konfigurasi Environment
Tambahkan variabel berikut ke file .env proyek Laravel Anda:
AFFICHAT_API_KEY=your_api_key_here AFFICHAT_SESSION_ID=default AFFICHAT_TIMEOUT=15 AFFICHAT_WEBHOOK_SECRET=your_webhook_secret_here
Cara Penggunaan
1. Menyiapkan Model Notifiable
Tambahkan routing nomor tujuan pada model yang mengimplementasikan trait Notifiable (misalnya User.php):
namespace App\Models; use Illuminate\Foundation\Auth\User as Authenticatable; use Illuminate\Notifications\Notifiable; class User extends Authenticatable { use Notifiable; public function routeNotificationForAffiChat($notification): ?string { return $this->phone_number; } }
2. Membuat Class Notifikasi
Generate class notifikasi baru menggunakan Artisan:
php artisan make:notification OrderStatusNotification
Buka dan sesuaikan isi file app/Notifications/OrderStatusNotification.php:
namespace App\Notifications; use AffiChat\Laravel\Messages\AffiChatMessage; use Illuminate\Notifications\Notification; class OrderStatusNotification extends Notification { protected $order; public function __construct($order) { $this->order = $order; } public function via($notifiable): array { return ['affichat']; } public function toAffiChat($notifiable): AffiChatMessage { return AffiChatMessage::create("Halo {$notifiable->name}, pesanan #{$this->order->id} telah berhasil diproses.") ->sessionId('default'); } }
Kirim notifikasi melalui instance model:
$user->notify(new OrderStatusNotification($order));
3. Ragam Tipe Pesan (AffiChatMessage)
Gambar dengan Caption
public function toAffiChat($notifiable): AffiChatMessage { return AffiChatMessage::create() ->image('https://tokosaya.com/promo.jpg', 'Katalog Promo Mingguan'); }
Dokumen atau Faktur PDF
public function toAffiChat($notifiable): AffiChatMessage { return AffiChatMessage::create() ->document('https://tokosaya.com/invoice-1024.pdf', 'Invoice-1024.pdf'); }
Lokasi GPS
public function toAffiChat($notifiable): AffiChatMessage { return AffiChatMessage::create() ->location(-6.200000, 106.816666, 'AffiChat Headquarter', 'Jakarta Selatan'); }
Polling Interaktif
public function toAffiChat($notifiable): AffiChatMessage { return AffiChatMessage::create() ->poll('Apakah pesanan Anda telah sampai?', ['Sudah, Sangat Puas', 'Sudah, Ada Kendala', 'Belum'], false); }
4. Mengirim Pesan Langsung via Facade AffiChat
Kirim pesan langsung tanpa membuat class Notification:
use AffiChat\Laravel\Facades\AffiChat; AffiChat::sendText('081234567890', 'Kode verifikasi Anda adalah 582910.'); AffiChat::sendImage('081234567890', 'https://tokosaya.com/banner.png', 'Promo Spesial'); $keyStatus = AffiChat::checkApiKey();
5. Memproses Webhook Masuk (HMAC Signature Verification)
Server AffiChat menyertakan tanda tangan HMAC-SHA256 pada header X-AffiChat-Signature untuk setiap event masuk:
use Illuminate\Http\Request; use AffiChat\Laravel\Webhook\AffiChatWebhook; Route::post('/webhook/affichat', function (Request $request) { $signature = $request->header('X-AffiChat-Signature'); $secret = config('affichat.webhook_secret'); // Body mentah wajib digunakan untuk memvalidasi digest HMAC-SHA256 if (!AffiChatWebhook::verifySignature($request->getContent(), $signature, $secret)) { return response()->json(['error' => 'Invalid signature'], 401); } $payload = AffiChatWebhook::parsePayload($request->getContent()); $event = $payload['event'] ?? ''; if ($event === 'messages.upsert') { $message = $payload['data']; } return response()->json(['status' => 'success']); });
Pengujian Mandiri
Paket ini menyediakan skrip pengujian mandiri tanpa memerlukan instalasi penuh aplikasi Laravel:
php integrations/affichat-laravel/tests/test-channel.php
Lisensi
MIT License.