بازگشت به وبلاگ

ارسال پوش نوتیفیکیشن با PHP و Laravel: آموزش کامل، چالش‌ها و راه‌اندازی سریع با پوشفا

ارسال پوش نوتیفیکیشن با PHP و Laravel: آموزش کامل، چالش‌ها و راه‌اندازی سریع با پوشفا

ارسال پوش نوتیفیکیشن (Push Notification) به کاربران، یکی از مؤثرترین راه‌های ارتباط با مخاطبان و افزایش تعامل در وب‌سایت‌هاست. اگر با PHP و فریم‌ورک محبوب لاراول کار می‌کنید، احتمالاً به دنبال راهی برای افزودن این قابلیت به سایت خود هستید. اما شاید با دیدن مستندات فنی، مقالات متعدد و پیچیدگی‌های مربوط به Service Worker، VAPID، رمزنگاری و ... به این نتیجه رسیده باشید که پیاده‌سازی دستی آن بسیار سخت و زمان‌بر است.

در این مقاله، ابتدا به بررسی عمیق چالش‌های فنی ارسال پوش نوتیفیکیشن با PHP و لاراول می‌پردازیم و نشان می‌دهیم که چرا این کار می‌تواند برای توسعه‌دهندگان حتی با تجربه، دشوار باشد. سپس راه‌حلی ساده و سریع معرفی می‌کنیم: استفاده از سرویس پوشفا که با چند خط کد ساده، می‌توانید پوش نوتیفیکیشن را در سایت لاراولی خود فعال کنید و از امکانات پیشرفته آن بهره‌مند شوید.

فهرست مطالب

مقدمه‌ای بر پوش نوتیفیکیشن وب

پوش نوتیفیکیشن وب به شما این امکان را می‌دهد که حتی زمانی که کاربر در سایت شما نیست، پیام‌های کوتاه و جذابی را به مرورگر او ارسال کنید. این پیام‌ها می‌توانند شامل اطلاع‌رسانی از محصولات جدید، تخفیف‌ها، رویدادها و یا هر محتوای مرتبط دیگری باشند. برخلاف ایمیل که ممکن است دیده نشود، پوش نوتیفیکیشن معمولاً در بالای صفحه یا در ناحیه اعلان‌ها نمایش داده می‌شود و نرخ تعامل بالایی دارد.

برای پیاده‌سازی وب پوش، به دو بخش اصلی نیاز دارید: سمت کلاینت (مرورگر) و سمت سرور. در سمت کلاینت، باید یک Service Worker ثبت کنید که قادر به دریافت و نمایش اعلان‌ها باشد. در سمت سرور، باید کدهایی بنویسید که اشتراک‌های کاربران را ذخیره کرده و پیام‌هایی را به سرویس‌دهنده اعلان (مانند FCM یا Mozilla Autopush) ارسال کند. این فرایند شامل مفاهیم پیچیده‌ای مانند رمزنگاری، احراز هویت و مدیریت چرخه حیات است که در ادامه به آن‌ها می‌پردازیم.

چرا پیاده‌سازی دستی پوش نوتیفیکیشن در لاراول سخت است؟

وقتی صحبت از پیاده‌سازی دستی می‌شود، توسعه‌دهنده با چالش‌های متعددی روبرو می‌شود که در نگاه اول شاید ساده به نظر برسند اما در عمل زمان‌بر و خطاپذیر هستند. بیایید این چالش‌ها را با جزئیات بررسی کنیم.

چالش‌های فنی و زیرساختی

  • پیچیدگی Service Worker: Service Worker باید به‌درستی ثبت شود، نسخه‌بندی شود و رویدادهای push و notificationclick را مدیریت کند. هر اشتباه کوچک در این کد می‌تواند باعث عدم دریافت اعلان شود.
  • VAPID و احراز هویت: برای ارتباط با سرویس‌دهنده اعلان، باید کلیدهای VAPID (Voluntary Application Server Identification) را تولید و به‌درستی پیکربندی کنید. این کلیدها باید در سمت سرور نگهداری شده و در هدر درخواست‌ها ارسال شوند.
  • رمزنگاری پیام: پیام‌های ارسالی باید با استاندارد Message Encryption برای Web Push رمزنگاری شوند. این کار نیازمند دانش دقیق از الگوریتم‌های AES و ECDH است و پیاده‌سازی آن از صفر بسیار دشوار است.
  • مدیریت اشتراک‌ها: شما باید اطلاعات اشتراک کاربران (شامل endpoint و کلیدهای رمزنگاری) را در پایگاه‌داده ذخیره کنید. این اطلاعات باید به‌صورت امن نگهداری شده و در صورت نیاز به‌روزرسانی یا حذف شوند.
  • سازگاری با مرورگرها: هر مرورگر ممکن است رفتار متفاوتی داشته باشد. برای مثال، برخی مرورگرها نیاز به نمایش درخواست اجازه در تعامل کاربر دارند و برخی دیگر اجازه‌نامه خودکار دارند. همچنین تفاوت در پشتیبانی از امکانات مختلف مانند Badge یا Actions وجود دارد.
  • ابزارهای کمکی: کتابخانه‌های PHP مانند minishlink/web-push وجود دارند که بسیاری از پیچیدگی‌ها را کاهش می‌دهند، اما با این حال، نیاز به دانش کافی برای استفاده صحیح از آن‌ها دارید.

حال که با چالش‌ها آشنا شدیم، بیایید قدم‌به‌قدم مراحل پیاده‌سازی را بررسی کنیم تا بتوانید درک کاملی از روند کار داشته باشید.

اجزای ضروری برای ارسال پوش نوتیفیکیشن با PHP

برای پیاده‌سازی وب پوش در یک پروژه لاراولی، به اجزای زیر نیاز دارید:

  1. Service Worker: یک فایل جاوااسکریپت که در پس‌زمینه مرورگر اجرا می‌شود و رویدادهای مرتبط با اعلان را مدیریت می‌کند.
  2. کلیدهای VAPID: یک جفت کلید عمومی و خصوصی که برای شناسایی برنامه‌نویس (وب‌سایت) استفاده می‌شود.
  3. ذخیره‌سازی اشتراک‌ها: جدول پایگاه‌داده برای نگهداری اطلاعات اشتراک کاربران (endpoint, p256dh, auth).
  4. ارسال‌دهنده (Sender): کلاس یا سرویسی در لاراول که پیام را به endpoint ارسال می‌کند.
  5. پایگاه‌داده برای سوابق ارسال (اختیاری): برای ردیابی و تحلیل ارسال‌ها.

در ادامه، هر کدام از این اجزا را به‌تفصیل توضیح می‌دهیم و بخش‌های کد نمونه را ارائه می‌کنیم.

Service Worker چیست و چگونه آن را در لاراول راه‌اندازی کنیم؟

Service Worker یک فایل جاوااسکریپت است که به‌عنوان یک پروکسی بین مرورگر و شبکه عمل می‌کند. این فایل می‌تواند رویدادهای push را دریافت کند، اعلان‌ها را نمایش دهد و حتی کش را مدیریت کند. در لاراول، معمولاً فایل Service Worker را در پوشه public قرار می‌دهند تا به‌صورت مستقیم قابل دسترسی باشد.

برای ثبت Service Worker در سمت کلاینت، می‌توانید از کد زیر استفاده کنید:

// در فایل app.js یا هر اسکریپت دیگری
if ('serviceWorker' in navigator) {
    navigator.serviceWorker.register('/sw.js')
        .then(function(reg) {
            console.log('Service Worker registered', reg);
        })
        .catch(function(err) {
            console.log('Service Worker error', err);
        });
}

محتوای فایل sw.js باید شامل گوش دادن به رویدادهای push و notificationclick باشد. یک نمونه ساده به شکل زیر است:

self.addEventListener('push', function(event) {
    const data = event.data.json();
    const options = {
        body: data.body,
        icon: data.icon,
        badge: data.badge,
        data: { url: data.url },
        actions: [
            { action: 'open', title: 'باز کردن' },
            { action: 'close', title: 'بستن' }
        ]
    };
    event.waitUntil(
        self.registration.showNotification(data.title, options)
    );
});

self.addEventListener('notificationclick', function(event) {
    event.notification.close();
    if (event.action === 'close') return;
    if (event.notification.data.url) {
        clients.openWindow(event.notification.data.url);
    }
});

همان‌طور که می‌بینید، Service Worker مسئول نمایش اعلان و مدیریت کلیک روی آن است. این فایل باید همیشه در دسترس باشد و نسخه‌بندی صحیح داشته باشد تا مرورگر نسخه جدید را دریافت کند.

VAPID و احراز هویت در وب پوش

VAPID یک پروتکل احراز هویت است که به سرورها اجازه می‌دهد خودشان را به سرویس‌دهنده اعلان معرفی کنند. شما باید یک جفت کلید عمومی و خصوصی VAPID تولید کنید. کلید عمومی در کد کلاینت قرار می‌گیرد و کلید خصوصی در سرور نگهداری می‌شود.

برای تولید این کلیدها در PHP، می‌توانید از کتابخانه‌هایی مانند minishlink/web-push استفاده کنید. این کتابخانه توابع لازم برای تولید کلید، رمزنگاری و ارسال پیام را فراهم می‌کند. برای نصب آن، از Composer استفاده کنید:

composer require minishlink/web-push

سپس می‌توانید کلیدهای VAPID را به این شکل تولید کنید:

use Minishlink\WebPush\VAPID;

$keys = VAPID::createVapidKeys();
// $keys['publicKey'] و $keys['privateKey']

این کلیدها را باید در فایل .env لاراول ذخیره کنید و از آن‌ها در تنظیمات استفاده کنید.

رمزنگاری پیام‌ها در وب پوش

یکی از پیچیده‌ترین بخش‌های وب پوش، رمزنگاری پیام‌هاست. طبق استاندارد RFC 8291، پیام‌ها باید با استفاده از الگوریتم‌های AES-GCM و ECDH رمزنگاری شوند. پیاده‌سازی این رمزنگاری از صفر بسیار دشوار است، به همین دلیل توصیه می‌شود از کتابخانه‌های آماده استفاده کنید.

کتابخانه minishlink/web-push تمام این پیچیدگی‌ها را پنهان می‌کند. شما فقط باید اطلاعات اشتراک کاربر (شامل endpoint، کلید p256dh و کلید auth) را داشته باشید و پیام را به همراه برخی تنظیمات به کتابخانه بدهید. کتابخانه به‌صورت خودکار رمزنگاری را انجام می‌دهد و درخواست را به endpoint ارسال می‌کند.

ذخیره‌سازی اشتراک‌ها و مدیریت کاربران

برای ارسال پوش به کاربران، باید اشتراک‌های آن‌ها را ذخیره کنید. در لاراول، می‌توانید یک جدول برای ذخیره اطلاعات اشتراک ایجاد کنید. این جدول معمولاً شامل فیلدهای زیر است:

  • id – شناسه یکتا (Primary Key)
  • user_id – شناسه کاربر (در صورت داشتن سیستم احراز هویت)
  • endpoint – آدرس مخصوص مرورگر برای دریافت پیام
  • public_key (p256dh) – کلید عمومی برای رمزنگاری
  • auth_token – توکن احراز هویت
  • created_at و updated_at – تاریخ‌ها

می‌توانید از طریق مهاجرت (Migration) این جدول را ایجاد کنید:

Schema::create('push_subscriptions', function (Blueprint $table) {
    $table->id();
    $table->unsignedBigInteger('user_id')->nullable();
    $table->text('endpoint');
    $table->string('public_key');
    $table->string('auth_token');
    $table->timestamps();
});

سپس، در سمت کلاینت، پس از دریافت اجازه از کاربر، اطلاعات اشتراک را به سرور ارسال کنید و در این جدول ذخیره کنید.

پیاده‌سازی بک‌اند ارسال پوش در لاراول

در لاراول، می‌توانید یک کلاس سرویس برای ارسال پوش بسازید. این کلاس باید مسئول Initialize کردن کتابخانه web-push با کلیدهای VAPID و ارسال پیام به یک یا چند endpoint باشد. در اینجا یک نمونه ساده از کلاس سرویس را می‌بینید:

namespace App\Services;

use Minishlink\WebPush\WebPush;
use Minishlink\WebPush\Subscription;

class PushService
{
    protected $webPush;

    public function __construct()
    {
        $auth = [
            'VAPID' => [
                'subject' => config('app.url'),
                'publicKey' => env('VAPID_PUBLIC_KEY'),
                'privateKey' => env('VAPID_PRIVATE_KEY'),
            ],
        ];
        $this->webPush = new WebPush($auth);
    }

    public function sendNotification($subscription, $payload)
    {
        $sub = Subscription::create([
            'endpoint' => $subscription->endpoint,
            'publicKey' => $subscription->public_key,
            'authToken' => $subscription->auth_token,
        ]);
        $this->webPush->queueNotification($sub, $payload);
        foreach ($this->webPush->flush() as $report) {
            // بررسی وضعیت ارسال
        }
    }
}

سپس می‌توانید این سرویس را در هر Controller یا Command فراخوانی کنید. برای مثال، در یک کنترلر برای ارسال پوش به همه کاربران:

public function sendToAll(Request $request)
{
    $subscriptions = PushSubscription::all();
    $payload = json_encode([
        'title' => 'تخفیف ویژه',
        'body' => 'تا ۵۰٪ تخفیف برای خرید بعدی شما!',
        'url' => route('offers'),
    ]);

    foreach ($subscriptions as $sub) {
        $this->pushService->sendNotification($sub, $payload);
    }
}

این کار ممکن است ساده به نظر برسد، اما در عمل چالش‌هایی مانند مدیریت خطاها، بررسی وضعیت هر ارسال و به‌روزرسانی اشتراک‌های نامعتبر را نیز باید در نظر بگیرید. ممکن است بعضی از endpointها منقضی شوند (مثلاً وقتی کاربر مرورگر را پاک می‌کند یا اجازه را لغو می‌کند). در این صورت باید اشتراک‌های نامعتبر را از پایگاه‌داده حذف کنید تا خطاهای بعدی کاهش یابد.

تست و رفع اشکال در ارسال پوش نوتیفیکیشن

تست وب پوش می‌تواند چالش‌برانگیز باشد، زیرا نیاز به شبیه‌سازی شرایط مختلف دارد. برخی از نکات مهم برای تست:

  • از Chrome DevTools برای تست Service Worker استفاده کنید. می‌توانید رویداد push را شبیه‌سازی کنید و خطاها را مشاهده کنید.
  • در محیط توسعه، از گواهی SSL استفاده کنید، زیرا Service Worker فقط در وب‌سایت‌های امن (HTTPS) کار می‌کند.
  • اطمینان حاصل کنید که endpoint ارسال پیام (مثلاً FCM) در دسترس است و به‌درستی به اینترنت متصل هستید.
  • برای بررسی خطاهای PHP، لاگ‌های لاراول را بررسی کنید. خطاهای مربوط به کتابخانه web-push معمولاً در فایل storage/logs/laravel.log ثبت می‌شوند.
  • اگر پیام ارسال می‌شود ولی کاربر اعلان دریافت نمی‌کند، احتمالاً مشکل از Service Worker یا تنظیمات VAPID است. بررسی کنید که کلید عمومی VAPID در کد کلاینت با کلید خصوصی سرور مطابقت داشته باشد.

مقیاس‌پذیری و تحویل‌پذیری در مقیاس بزرگ

زمانی که تعداد کاربران شما زیاد می‌شود (مثلاً صدها هزار نفر)، ارسال پوش نوتیفیکیشن به‌صورت دستی و با حلقه‌های ساده می‌تواند بسیار کند و ناکارآمد باشد. شما باید به‌جای ارسال هم‌زمان، از صف‌ها (Queues) یا سیستم‌های پیام‌رسان مانند RabbitMQ یا Redis استفاده کنید. در لاراول، می‌توانید از صف‌های از پیش ساخته‌شده استفاده کنید.

همچنین، باید به مدیریت خطاهای ناشی از از کار افتادن سرویس‌دهنده اعلان یا محدودیت‌های نرخ (Rate Limit) توجه کنید. بسیاری از سرویس‌دهنده‌ها محدودیت تعداد درخواست در ثانیه دارند که اگر رعایت نشود، درخواست‌های شما رد می‌شوند.

علاوه بر این، برای تحویل‌پذیری بهتر، باید از تکنیک‌هایی مانند Batch ارسال و بهینه‌سازی payload استفاده کنید. همچنین باید رفتار کاربران را پایش کنید و اشتراک‌های بلااستفاده را غیرفعال کنید تا درخواست‌های بیهوده کاهش یابد.

همه این موارد نیازمند زیرساخت مناسب، دانش فنی عمیق و زمان کافی برای توسعه و نگهداری هستند. اینجاست که استفاده از یک سرویس آماده مانند پوشفا می‌تواند بسیار هوشمندانه باشد.

راه‌حل سریع: استفاده از سرویس پوشفا در لاراول

پوشفا یک سرویس ایرانی ارائه‌دهنده وب پوش نوتیفیکیشن است که به شما امکان می‌دهد بدون نیاز به مدیریت زیرساخت پیچیده، پوش نوتیفیکیشن را به‌سادگی در سایت خود راه‌اندازی کنید. با پوشفا، کافیست یک حساب کاربری بسازید، کد جاوااسکریپت یا کتابخانه PHP آن را در سایت خود قرار دهید و شروع به ارسال پوش کنید.

برای استفاده از پوشفا در یک پروژه لاراولی، مراحل زیر را دنبال کنید:

مرحله ۱: ساخت حساب و دریافت API Key

ابتدا در وب‌سایت پوشفا ثبت‌نام کنید (یا وارد حساب خود شوید). سپس یک پروژه جدید بسازید. پوشفا به شما یک API Key اختصاص می‌دهد که برای ارتباط با سرویس استفاده می‌شود.

مرحله ۲: نصب پکیج PHP (اختیاری)

پوشفا یک پکیج PHP ارائه می‌دهد که می‌توانید از طریق Composer نصب کنید:

composer require pushfa/pushfa-php

این پکیج به شما امکان می‌دهد تا از طریق PHP به راحتی پوش ارسال کنید. اما حتی بدون این پکیج، می‌توانید از طریق API ساده REST با پوشفا ارتباط برقرار کنید.

مرحله ۳: افزودن کد کلاینت به سایت

در پنل پوشفا، یک کد جاوااسکریپت به شما داده می‌شود که باید آن را در قالب اصلی سایت خود (مثلاً در فایل layouts/app.blade.php) قرار دهید. این کد به‌طور خودکار درخواست اجازه را نمایش می‌دهد و اشتراک کاربر را در پوشفا ذخیره می‌کند. لازم نیست نگران Service Worker و VAPID باشید؛ پوشفا این کارها را برای شما انجام می‌دهد.

مرحله ۴: ارسال پوش از سمت سرور

برای ارسال پوش از سمت سرور، می‌توانید از API پوشفا استفاده کنید. یک نمونه با PHP (با استفاده از Guzzle یا حتی cURL):

$client = new \GuzzleHttp\Client();
$response = $client->post('https://api.pushfa.com/v1/push', [
    'headers' => [
        'Authorization' => 'Bearer ' . env('PUSHFA_API_KEY'),
        'Content-Type' => 'application/json',
    ],
    'json' => [
        'title' => 'تخفیف ویژه',
        'body' => 'تا ۵۰٪ تخفیف برای خرید بعدی شما!',
        'url' => 'https://example.com/offers',
        // می‌توانید target به صورت 'all' یا 'segment' یا 'users' قرار دهید
        'target' => 'all',
    ],
]);
// بررسی پاسخ
if ($response->getStatusCode() === 200) {
    // موفق
} else {
    // خطا
}

همان‌طور که می‌بینید، این کار بسیار ساده‌تر از پیاده‌سازی دستی است. شما هیچ نیازی به مدیریت Service Worker، VAPID، رمزنگاری و یا زیرساخت ندارید.

مرحله ۵: راه‌اندازی در چند دقیقه

با پوشفا، در کمتر از چند دقیقه می‌توانید پوش نوتیفیکیشن را در سایت لاراولی خود فعال کنید. کافی است کد کلاینت را اضافه کنید و از پنل، ارسال‌های خود را مدیریت کنید. پوشفا همچنین امکاناتی مانند زمان‌بندی ارسال، شخصی‌سازی، تجزیه و تحلیل عملکرد و ... را فراهم می‌کند که در پیاده‌سازی دستی به زمان زیادی نیاز دارد.

مقایسه پیاده‌سازی دستی با پوشفا

برای درک بهتر، بیایید مقایسه‌ای بین پیاده‌سازی دستی و استفاده از پوشفا داشته باشیم:

موردپیاده‌سازی دستی با PHP/Laravelاستفاده از پوشفا
زمان راه‌اندازی اولیهچند روز تا چند هفته (بسته به تجربه)چند دقیقه
نیاز به دانش فنیبالا (Service Worker، رمزنگاری، HTTP)کم (فقط کپی و قرار دادن کد)
مدیریت زیرساختباید خودتان مدیریت کنید (سرور، SSL، پایگاه‌داده)پوشفا مدیریت می‌کند
هزینههزینه‌های سرور و نگهداریپلن‌های اشتراک (شروع رایگان)
خطای احتمالیبالا (باتوجه به پیچیدگی)کم (سرویس پایدار)
امکانات پیشرفتهباید خودتان توسعه دهیدآماده (تجزیه و تحلیل، شخصی‌سازی، زمان‌بندی)

همان‌طور که جدول نشان می‌دهد، پوشفا به‌طور قابل توجهی فرآیند را ساده‌تر می‌کند، به‌ویژه برای تیم‌هایی که تخصص کافی در زمینه وب پوش ندارند یا زمان محدودی دارند.

سؤالات متداول

آیا استفاده از پوشفا باعث محدودیت در سفارشی‌سازی می‌شود؟

خیر، پوشفا API انعطاف‌پذیری دارد و شما می‌توانید پارامترهای مختلف مانند عنوان، متن، URL و حتی تصویر را تنظیم کنید. همچنین امکان ارسال به گروه‌های خاص کاربران (سگمنت) وجود دارد.

آیا پوشفا با لاراول سازگار است؟

بله، در پوشفا می‌توانید از طریق HTTP API با هر زبان و فریم‌ورکی ارتباط برقرار کنید، بنابراین برای لاراول کاملاً مناسب است.

آیا برای استفاده از پوشفا نیاز به داشتن سرور جداگانه است؟

خیر، شما فقط باید کد کلاینت و سرور را در پروژه خود قرار دهید؛ پوشفا زیرساخت ارسال را مدیریت می‌کند.

چگونه می‌توانم نرخ کلیک روی پوش‌ها را افزایش دهم؟

پوشفا به شما امکان تست A/B و تحلیل عملکرد را می‌دهد. همچنین می‌توانید زمان ارسال را بهینه کنید و از محتوای شخصی‌سازی‌شده استفاده کنید. برای اطلاعات بیشتر، مقالات آزمایش A/B در وب پوش و شخصی‌سازی پوش نوتیفیکیشن را مطالعه کنید.

نتیجه‌گیری

ارسال پوش نوتیفیکیشن با PHP و لاراول، اگرچه از نظر فنی امکان‌پذیر است، اما نیازمند دانش عمیق در زمینه‌های مختلف مانند Service Worker، VAPID، رمزنگاری و مدیریت زیرساخت است. این کار می‌تواند زمان‌بر باشد و خطاهای زیادی را به همراه داشته باشد. در مقابل، استفاده از سرویس پوشفا به شما این امکان را می‌دهد که در چند دقیقه پوش نوتیفیکیشن را در سایت لاراولی خود فعال کنید و از امکانات پیشرفته آن بهره‌مند شوید. اگر به دنبال راه‌حلی سریع، مطمئن و مقرون‌به‌صرفه هستید، به‌شدت توصیه می‌کنم پوشفا را امتحان کنید.

با شروع استفاده از پوشفا، می‌توانید بر روی بهبود تجربه کاربری و افزایش تعامل تمرکز کنید و نگران پیچیدگی‌های فنی نباشید. برای آشنایی بیشتر با مفاهیم پایه، می‌توانید مقاله پوش نوتیفیکیشن چیست؟ را مطالعه کنید. همچنین برای یادگیری نحوه افزودن پوش به سایت‌های بدون فریم‌ورک، این راهنما می‌تواند مفید باشد.

در نهایت، اگر سایت لاراولی شما به دنبال راهی مؤثر برای ارتباط با کاربران است، پوش نوتیفیکیشن یک ابزار حیاتی است و پوشفا آن را به ساده‌ترین شکل ممکن در اختیار شما قرار می‌دهد.