كيفية استخدام Notification Hubs من PHP

يمكنك الوصول إلى جميع ميزات مراكز الإعلامات من واجهة Java/PHP/Ruby الخلفية باستخدام واجهة Notification Hub REST كما هو موضح في موضوع MSDN Notification Hubs REST APIs.

في هذا الموضوع نعرض كيفية:

واجهة العميل

يمكن أن توفر واجهة العميل الرئيسية نفس الطرق المتوفرة في .NET Notification Hubs SDK، والتي تسمح لك بترجمة جميع البرامج التعليمية والعينات المتوفرة حاليًا على هذا الموقع مباشرة، والتي يساهم بها المجتمع على الإنترنت.

يمكنك العثور على جميع التعليمات البرمجية المتوفرة في نموذج برنامج تضمين PHP REST.

على سبيل المثال، لإنشاء عميل:

$hub = new NotificationHub("connection string", "hubname");

لإرسال إعلام أصلي لنظام التشغيل iOS:

$notification = new Notification("apple", '{"aps":{"alert": "Hello!"}}');
$hub->sendNotification($notification, null);

التنفيذ

إذا لم تكن قد فعلت ذلك بالفعل، فاتبع [بدء البرنامج التعليمي] حتى القسم الأخير حيث يجب عليك تنفيذ الواجهة الخلفية. أيضا، إذا كنت تريد يمكنك استخدام التعليمات البرمجية من نموذج برنامج تضمين PHP REST والانتقال مباشرة إلى قسم إكمال البرنامج التعليمي.

يمكن العثور على جميع التفاصيل لتنفيذ برنامج تضمين REST الكامل على MSDN. في هذا القسم، نصف تنفيذ PHP للخطوات الرئيسية المطلوبة للوصول إلى نقاط نهاية REST لـ Notification Hubs:

  1. تحليل سلسلة الاتصال
  2. إنشاء رمز التخويل المميز
  3. إجراء مكالمة HTTP

تحليل سلسلة الاتصال

فيما يلي الفئة الرئيسية التي تنفذ العميل، الذي يقوم منشئه بتحليل سلسلة الاتصال:

class NotificationHub {
    const API_VERSION = "?api-version=2013-10";

    private $endpoint;
    private $hubPath;
    private $sasKeyName;
    private $sasKeyValue;

    function __construct($connectionString, $hubPath) {
        $this->hubPath = $hubPath;

        $this->parseConnectionString($connectionString);
    }

    private function parseConnectionString($connectionString) {
        $parts = explode(";", $connectionString);
        if (sizeof($parts) != 3) {
            throw new Exception("Error parsing connection string: " . $connectionString);
        }

        foreach ($parts as $part) {
            if (strpos($part, "Endpoint") === 0) {
                $this->endpoint = "https" . substr($part, 11);
            } else if (strpos($part, "SharedAccessKeyName") === 0) {
                $this->sasKeyName = substr($part, 20);
            } else if (strpos($part, "SharedAccessKey") === 0) {
                $this->sasKeyValue = substr($part, 16);
            }
        }
    }
}

إنشاء رمز أمان

راجع وثائق Azure للحصول على معلومات حول كيفية إنشاء رمز أمان SAS المميز.

أضف أسلوب generateSasToken إلى فئة NotificationHub لإنشاء الرمز المميز استنادا إلى URI للطلب الحالي وبيانات الاعتماد المستخرجة من سلسلة الاتصال.

private function generateSasToken($uri) {
    $targetUri = strtolower(rawurlencode(strtolower($uri)));

    $expires = time();
    $expiresInMins = 60;
    $expires = $expires + $expiresInMins * 60;
    $toSign = $targetUri . "\n" . $expires;

    $signature = rawurlencode(base64_encode(hash_hmac('sha256', $toSign, $this->sasKeyValue, TRUE)));

    $token = "SharedAccessSignature sr=" . $targetUri . "&sig="
                . $signature . "&se=" . $expires . "&skn=" . $this->sasKeyName;

    return $token;
}

إرسال إخطار

أولًا، دعنا نحدد فئة تمثل إعلامًا.

class Notification {
    public $format;
    public $payload;

    # array with keynames for headers
    # Note: Some headers are mandatory: Windows: X-WNS-Type, WindowsPhone: X-NotificationType
    # Note: For Apple you can set Expiry with header: ServiceBusNotification-ApnsExpiry in W3C DTF, YYYY-MM-DDThh:mmTZD (for example, 1997-07-16T19:20+01:00).
    public $headers;

    function __construct($format, $payload) {
        if (!in_array($format, ["template", "apple", "windows", "fcm", "windowsphone"])) {
            throw new Exception('Invalid format: ' . $format);
        }

        $this->format = $format;
        $this->payload = $payload;
    }
}

هذه الفئة عبارة عن حاوية لنص إعلام أصلي، أو مجموعة من الخصائص في حالة إعلام القالب، ومجموعة من الرؤوس، والتي تحتوي على تنسيق (النظام الأساسي الأصلي أو القالب) والخصائص الخاصة بالنظام الأساسي (مثل خاصية انتهاء صلاحية Apple ورؤوس WNS).

راجع وثائق Notification Hubs REST APIs وتنسيقات الأنظمة الأساسية للإعلامات المحددة لجميع الخيارات المتاحة.

مسلحًا بهذه الفئة، يمكننا الآن كتابة أساليب إرسال الإعلام داخل فئة NotificationHub:

public function sendNotification($notification, $tagsOrTagExpression="") {
    if (is_array($tagsOrTagExpression)) {
        $tagExpression = implode(" || ", $tagsOrTagExpression);
    } else {
        $tagExpression = $tagsOrTagExpression;
    }

    # build uri
    $uri = $this->endpoint . $this->hubPath . "/messages" . NotificationHub::API_VERSION;
    $ch = curl_init($uri);

    if (in_array($notification->format, ["template", "apple", "fcm"])) {
        $contentType = "application/json";
    } else {
        $contentType = "application/xml";
    }

    $token = $this->generateSasToken($uri);

    $headers = [
        'Authorization: '.$token,
        'Content-Type: '.$contentType,
        'ServiceBusNotification-Format: '.$notification->format
    ];

    if ("" !== $tagExpression) {
        $headers[] = 'ServiceBusNotification-Tags: '.$tagExpression;
    }

    # add headers for other platforms
    if (is_array($notification->headers)) {
        $headers = array_merge($headers, $notification->headers);
    }

    curl_setopt_array($ch, array(
        CURLOPT_POST => TRUE,
        CURLOPT_RETURNTRANSFER => TRUE,
        CURLOPT_SSL_VERIFYPEER => FALSE,
        CURLOPT_HTTPHEADER => $headers,
        CURLOPT_POSTFIELDS => $notification->payload
    ));

    // Send the request
    $response = curl_exec($ch);

    // Check for errors
    if($response === FALSE){
        throw new Exception(curl_error($ch));
    }

    $info = curl_getinfo($ch);

    if ($info['http_code'] <> 201) {
        throw new Exception('Error sending notification: '. $info['http_code'] . ' msg: ' . $response);
    }
} 

ترسل الأساليب أعلاه طلب HTTP POST إلى نقطة نهاية /messages لمركز الإعلامات الخاص بك، مع النص الأساسي الصحيح والرؤوس لإرسال الإعلام.

إكمال البرنامج التعليمي

الآن يمكنك إكمال البرنامج التعليمي بدء الاستخدام عن طريق إرسال الإعلام من الخلفية PHP.

تهيئة عميل Notification Hubs (استبدل سلسلة الاتصال واسم المركز كما هو موضح في [البرنامج التعليمي للبدء]):

$hub = new NotificationHub("connection string", "hubname");

ثم أضف رمز الإرسال اعتمادا على النظام الأساسي المستهدف للجوال.

متجر Windows و Windows Phone 8.1 (غير Silverlight)

$toast = '<toast><visual><binding template="ToastText01"><text id="1">Hello from PHP!</text></binding></visual></toast>';
$notification = new Notification("windows", $toast);
$notification->headers[] = 'X-WNS-Type: wns/toast';
$hub->sendNotification($notification, null);

iOS

$alert = '{"aps":{"alert":"Hello from PHP!"}}';
$notification = new Notification("apple", $alert);
$hub->sendNotification($notification, null);

Android

$message = '{"data":{"msg":"Hello from PHP!"}}';
$notification = new Notification("fcm", $message);
$hub->sendNotification($notification, null);

Windows Phone 8.0 و8.1 Silverlight

$toast = '<?xml version="1.0" encoding="utf-8"?>' .
            '<wp:Notification xmlns:wp="WPNotification">' .
               '<wp:Toast>' .
                    '<wp:Text1>Hello from PHP!</wp:Text1>' .
               '</wp:Toast> ' .
            '</wp:Notification>';
$notification = new Notification("windowsphone", $toast);
$notification->headers[] = 'X-WindowsPhone-Target : toast';
$notification->headers[] = 'X-NotificationClass : 2';
$hub->sendNotification($notification, null);

Kindle Fire

$message = '{"data":{"msg":"Hello from PHP!"}}';
$notification = new Notification("adm", $message);
$hub->sendNotification($notification, null);

يجب أن ينتج عن تشغيل كود PHP الخاص بك الآن إشعار يظهر على جهازك المستهدف.

الخطوات التالية

في هذا الموضوع، أوضحنا كيفية إنشاء عميل PHP REST بسيط لـ Notification Hubs. من هنا، يمكنك القيام بما يلي:

  • قم بتنزيل نموذج برنامج تضمين PHP REST الكامل، والذي يحتوي على جميع التعليمات البرمجية أعلاه.
  • متابعة التعرف على ميزة وضع العلامات على Notification Hubs في [البرنامج التعليمي للأخبار العاجلة]
  • تعرف على دفع الإعلامات إلى المستخدمين الفرديين في [البرنامج التعليمي لإعلام المستخدمين]

لمزيد من المعلومات، انظر أيضًا مركز مطوري PHP.

إرسال إعلامات منبثقة إلى تطبيقات iOS باستخدام Azure Notification Hubs