ویژگی تصویر

ارسال Push Notification با PHP — راهنمای کامل و کاربردی

  /  PHP   /  ارسال Push Notification با PHP
بنر تبلیغاتی الف
آموزش PHP

Push Notification یکی از مؤثرترین روش‌ها برای تعامل با کاربر است؛ اطلاع‌رسانی بلادرنگ درباره پیام‌ها، پیشنهادها، به‌روزرسانی‌ها و هشدارها. در این مقاله به‌صورت عملی و فنی توضیح می‌دهیم چطور با PHP پیام‌های Push ارسال کنید، چه گزینه‌هایی دارید، نمونه کدهای آماده و نکات امنیتی و بهینه‌سازی.

چیست و چرا استفاده کنیم؟

Push Notification پیامی است که سرور یا سرویس پیام‌رسان از راه دور به مرورگر یا اپلیکیشن کاربر ارسال می‌کند، حتی وقتی اپ باز نیست. مزایا: افزایش بازگشت کاربر، تعامل بیشتر، ارسال اعلان‌های زمان‌مند و کاهش وابستگی به ایمیل.

موارد کاربرد

  • اعلان تراکنش‌ها و پرداخت‌ها
  • نوتیفیکیشن‌های خبری یا محتوایی
  • هشدارهای امنیتی و لاگین از دستگاه جدید
  • یادآوری‌ها و پیشنهادهای سفارشی (personalized)

روش‌های معمول ارسال Push با PHP

دو مسیر رایج برای ارسال Push از سمت وب/سرور وجود دارد:

  • FCM (Firebase Cloud Messaging) — برای اپ‌های اندروید، وب و برخی موارد iOS
  • Web Push (Push API + VAPID) — مخصوص مرورگرها (Chrome, Firefox, Edge)

مثال سریع: ارسال با FCM (Legacy HTTP)

// Replace with your server key and device token
$serverKey = 'AAA...YOUR_SERVER_KEY...';
$deviceToken = 'fcm_device_token_here';

$headers = [
  'Authorization: key=' . $serverKey,
  'Content-Type: application/json'
];

$payload = [
  'to' => $deviceToken,
  'notification' => [
    'title' => 'سلام از PHP',
    'body'  => 'این یک نمونه اعلان به وسیله FCM است',
    'icon'  => '/icons/notify.png'
  ],
  'data' => [
    'customKey' => 'customValue'
  ]
];

$ch = curl_init('https://fcm.googleapis.com/fcm/send');
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($payload));
$result = curl_exec($ch);
$httpcode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);

echo "HTTP: $httpcoden";
echo $result;

توضیح: این کد با استفاده از Legacy FCM Server Key یک اعلان به یک دستگاه خاص ارسال می‌کند. header شامل Authorization با کلید سرور است. payload شامل بخش notification (برای نمایش اعلان) و data (برای داده‌های دلخواه در پس‌زمینه) است. روش Legacy سریع است اما برای پروژه‌های بزرگ و امنیتی توصیه می‌شود از HTTP v1 استفاده کنید.

نکات امنیتی برای FCM

  • Server Key را در سرور نگهداری کنید؛ هرگز در کلاینت منتشر نکنید.
  • برای پروژه‌های بزرگ از HTTP v1 با OAuth2 و Service Account استفاده کنید تا دسترسی‌ها محدودتر و قابل بازبینی باشند.
  • برای ارسال به گروه دستگاه‌ها از Topic یا Condition استفاده کنید تا درخواست‌ها بهینه شود.

ارسال Web Push با PHP (VAPID + Minishlink/WebPush)

برای Push به مرورگرها باید از Push API و VAPID استفاده کنید. کتابخانه محبوب PHP: minishlink/web-push. ابتدا از Composer نصب کنید:

composer require minishlink/web-push

توضیح: این دستور بستهٔ WebPush را نصب می‌کند که کار رمزگذاری و ارسال به endpoint های مرورگر (مانند those provided by Mozilla/Google) را ساده می‌کند.

use MinishlinkWebPushVAPID;
use MinishlinkWebPushWebPush;

$vapid = VAPID::createVapidKeys();
$publicKey = $vapid['publicKey'];
$privateKey = $vapid['privateKey'];
echo "Public: $publicKeynPrivate: $privateKeyn";
// سپس این کلیدها را ذخیره و در سمت کلاینت برای subscribe استفاده کنید

توضیح: این قطعه کلیدهای VAPID تولید می‌کند. کلید عمومی را در Service Worker کلاینت برای subscribe استفاده کنید و کلید خصوصی را امن در سرور نگه دارید.

// Example: send push to one subscription
require 'vendor/autoload.php';
use MinishlinkWebPushWebPush;
use MinishlinkWebPushSubscription;

$subscription = Subscription::create([
  'endpoint' => 'https://fcm.googleapis.com/fcm/send/xxxxx...',
  'publicKey' => 'BPublicKeyFromClient...',
  'authToken' => 'authSecretFromClient...'
]);

$auth = [
  'VAPID' => [
    'subject' => 'mailto:you@example.com',
    'publicKey' => 'your_public_key_here',
    'privateKey' => 'your_private_key_here',
  ],
];

$webPush = new WebPush($auth);
$payload = json_encode(['title' => 'پیام جدید', 'body' => 'ساده و امن']);
$res = $webPush->sendOneNotification($subscription, $payload);

foreach ($webPush->flush() as $report) {
  if ($report->isSuccess()) {
    echo "OK: {$report->getEndpoint()}n";
  } else {
    echo "FAILED: {$report->getEndpoint()} - {$report->getReason()}n";
  }
}

توضیح: این کد یک اعلان به اشتراک (subscription) مرورگر ارسال می‌کند. subscription شامل endpoint، publicKey و authToken است که در زمان subscribe کلاینت به سرور ارسال می‌شود. بخش VAPID اطلاعات هویتی سرور را فراهم می‌کند.

بهینه‌سازی و مدیریت مقیاس

  • برای ارسال به هزاران اشتراک از batching و queue (مثلاً Redis + Worker) استفاده کنید.
  • بررسی بروز بودن توکن‌ها/اشتراک‌ها و حذف اشتراک‌های منقضی شده را خودکار کنید.
  • در FCM از topics و condition برای کاهش هزینه درخواست‌ها بهره ببرید.

مقایسه سریع

ویژگیFCMWeb Push (VAPID)
پلتفرمAndroid, Web, iOS (محدود)مرورگرها (Web)
نیاز به کلیدServer Key یا OAuth2VAPID public/private
پیچیدگی پیاده‌سازیکم تا متوسطمتوسط (رمزنگاری)

جمع‌بندی و نکات عملی

  • برای شروع سریع و نمونه‌سازی از Legacy FCM استفاده کنید ولی برای تولید از HTTP v1 یا VAPID استفاده نمایید.
  • کلیدها را امن ذخیره و لاگینگ مناسبی برای خطاها و وضعیت ارسال داشته باشید.
  • تست روی دستگاه‌ها و مرورگرهای مختلف ضروری است؛ خصوصاً iOS که محدودیت‌های خاص خود را دارد.
  • به تجربه کاربری توجه کنید: اعلان بیش از حد یا نامرتبط باعث از دست رفتن اعتماد کاربر می‌شود.

اگر نیاز به نمونه کد پیشرفته‌تر (مثلاً ایجاد JWT برای HTTP v1 FCM، مدیریت صف ارسال یا integration با Laravel) دارید، می‌توانم نمونهٔ آماده و گام‌به‌گام ارائه دهم.

آیا این مطلب برای شما مفید بود ؟

خیر
بله
موضوعات شما در انجمن: