From 5c7060565b624e9e9583bd7f8c6ac4ac084bbab4 Mon Sep 17 00:00:00 2001 From: Yoga Pangestu Date: Tue, 28 Oct 2025 23:27:32 +0700 Subject: [PATCH] feat(whatsapp service): menambahkan zawa api di config service -membuat sesi dan generate qr code -membuat model dan migrasi -menambahkan permission --- app/Livewire/Studio/Setting/Whatsapp.php | 98 +++++++++++++++++++ app/Models/Whatsapp.php | 10 ++ app/Providers/ViewServiceProvider.php | 7 ++ config/services.php | 4 + ...25_10_28_150511_create_whatsapps_table.php | 30 ++++++ database/seeders/RolePermissionSeeder.php | 2 + .../studio/setting/whatsapp.blade.php | 52 ++++++++++ routes/pages/studio.php | 2 + 8 files changed, 205 insertions(+) create mode 100644 app/Livewire/Studio/Setting/Whatsapp.php create mode 100644 app/Models/Whatsapp.php create mode 100644 database/migrations/2025_10_28_150511_create_whatsapps_table.php create mode 100644 resources/views/livewire/studio/setting/whatsapp.blade.php diff --git a/app/Livewire/Studio/Setting/Whatsapp.php b/app/Livewire/Studio/Setting/Whatsapp.php new file mode 100644 index 0000000..1412b18 --- /dev/null +++ b/app/Livewire/Studio/Setting/Whatsapp.php @@ -0,0 +1,98 @@ +whatsapp = [ + 'id' => $whatsapp?->id, + 'zawa_id' => $whatsapp?->zawa_id, + 'session_id' => $whatsapp?->session_id, + 'qr_code' => $whatsapp?->qr_code, + ]; + } + + public function createSession(): void + { + try { + $response = Http::post(config('services.zawa.url').'/authorize'); + + if ($response->successful()) { + $data = $response->json(); + + WhatsappModel::updateOrCreate( + ['zawa_id' => $data['id']], + [ + 'session_id' => $data['sessionId'], + ] + ); + + $this->whatsapp['zawa_id'] = $data['id']; + $this->whatsapp['session_id'] = $data['sessionId']; + + $this->toast('Berhasil membuat sesi WhatsApp'); + } else { + $this->toast('Gagal membuat sesi WhatsApp', 'Gagal', 'danger'); + } + } catch (\Throwable $e) { + Log::error($e); + $this->toast('Gagal membuat sesi WhatsApp, silakan coba lagi.', 'Gagal', 'danger'); + } + } + + public function generateQrCode(): void + { + try { + $response = Http::withHeaders([ + 'id' => $this->whatsapp['zawa_id'], + 'session-id' => $this->whatsapp['session_id'], + ])->get(config('services.zawa.url').'/qrcode'); + + if ($response->successful()) { + $data = $response->json(); + + $qrBase64 = 'data:image/png;base64,'.$data['qrcode']; + + WhatsappModel::updateOrCreate( + ['zawa_id' => $this->whatsapp['zawa_id']], + [ + 'session_id' => $this->whatsapp['session_id'], + 'qr_code' => $qrBase64, + ] + ); + + $this->whatsapp['qr_code'] = $qrBase64; + + $this->toast('Berhasil generate QR Code WhatsApp'); + } else { + $this->toast('Gagal generate QR Code, silakan coba lagi.', 'Gagal', 'danger'); + } + } catch (\Throwable $e) { + Log::error($e); + $this->toast('Terjadi kesalahan saat generate QR Code,silakan hubungi Administrator.', 'Gagal', 'danger'); + } + } + + public function render() + { + return view('livewire.studio.setting.whatsapp', [ + 'pageTitle' => 'Whatsapp', + ]); + } +} diff --git a/app/Models/Whatsapp.php b/app/Models/Whatsapp.php new file mode 100644 index 0000000..d809d41 --- /dev/null +++ b/app/Models/Whatsapp.php @@ -0,0 +1,10 @@ + 'studio.setting.application', 'can' => 'view application settings', ], + [ + 'label' => 'Whatsapp', + 'icon' => 'chat-bubble-oval-left-ellipsis', + 'route' => 'studio.setting.whatsapp', + 'match' => 'studio.setting.whatsapp', + 'can' => 'view whatsapp settings', + ], ], ], ]; diff --git a/config/services.php b/config/services.php index 6182e4b..6740d19 100644 --- a/config/services.php +++ b/config/services.php @@ -35,4 +35,8 @@ ], ], + 'zawa' => [ + 'url' => env('ZAWA_API_URL'), + ], + ]; diff --git a/database/migrations/2025_10_28_150511_create_whatsapps_table.php b/database/migrations/2025_10_28_150511_create_whatsapps_table.php new file mode 100644 index 0000000..031f014 --- /dev/null +++ b/database/migrations/2025_10_28_150511_create_whatsapps_table.php @@ -0,0 +1,30 @@ +id(); + $table->string('zawa_id', 100); + $table->string('session_id', 100); + $table->text('qr_code')->nullable(); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('whatsapps'); + } +}; diff --git a/database/seeders/RolePermissionSeeder.php b/database/seeders/RolePermissionSeeder.php index 7a20794..f8f99aa 100644 --- a/database/seeders/RolePermissionSeeder.php +++ b/database/seeders/RolePermissionSeeder.php @@ -108,6 +108,8 @@ public function run(): void 'view application settings', + 'view whatsapp settings', + 'view general settings', 'update general settings', diff --git a/resources/views/livewire/studio/setting/whatsapp.blade.php b/resources/views/livewire/studio/setting/whatsapp.blade.php new file mode 100644 index 0000000..9b33699 --- /dev/null +++ b/resources/views/livewire/studio/setting/whatsapp.blade.php @@ -0,0 +1,52 @@ + +
+
+ {{ $pageTitle }} + + Integrasikan WhatsApp untuk pengiriman invoice, kode verifikasi, serta + broadcast voucher atau informasi kepada pelanggan secara cepat dan efikien. + +
+
+ +
+ + Langkah 1: Buat Sesi WA + + Klik tombol untuk membuat sesi WhatsApp dan mendapatkan sessionId. + + + + @if (!$whatsapp['zawa_id']) + Buat Sesi + @else + ✅ Sesi sudah dibuat + @endif + + + + + Langkah 2: Generate QR Code + + Gunakan sessionId untuk men-generate QR code yang akan discan di WhatsApp. + + + + @if (!$whatsapp['qr_code'] && $whatsapp['zawa_id']) + Generate QR Code + @endif + + + @if ($whatsapp['qr_code']) +
+ QR Code WhatsApp +

Scan QR ini di WhatsApp

+
+ @endif +
+
+ +
diff --git a/routes/pages/studio.php b/routes/pages/studio.php index 8812d9b..55017d6 100644 --- a/routes/pages/studio.php +++ b/routes/pages/studio.php @@ -37,6 +37,7 @@ use App\Livewire\Studio\Setting\Application as ApplicationComponent; use App\Livewire\Studio\Setting\Password as PasswordComponent; use App\Livewire\Studio\Setting\Profile as ProfileComponent; +use App\Livewire\Studio\Setting\Whatsapp as WhatsappComponent; use Illuminate\Support\Facades\Route; Route::middleware('auth')->prefix('studio')->group(function () { @@ -159,4 +160,5 @@ }); Route::get('/settings/applications', ApplicationComponent::class)->name('studio.setting.application')->middleware('can:view application settings'); + Route::get('/settings/whatsapp', WhatsappComponent::class)->name('studio.setting.whatsapp')->middleware('can:view whatsapp settings'); });