Come usare Hub di notifica da PHPHow to use Notification Hubs from PHP

Per accedere a tutte le funzionalità di Hub di notifica da un back-end Java/PHP/Ruby, è possibile usare l'interfaccia REST di Hub di notifica come descritto nell'argomento API REST degli hub di notificadi MSDN.You can access all Notification Hubs features from a Java/PHP/Ruby back-end using the Notification Hub REST interface as described in the MSDN topic Notification Hubs REST APIs.

In questo argomento viene illustrato come:In this topic we show how to:

  • Compilare un client REST per le funzionalità di Hub di notifica in PHP.Build a REST client for Notification Hubs features in PHP;
  • Completare l' esercitazione introduttiva per la piattaforma mobile preferita, implementando la parte del backend in PHP.Follow the Get started tutorial for your mobile platform of choice, implementing the back-end portion in PHP.

Interfaccia del clientClient interface

L'interfaccia del client principale può fornire gli stessi metodi disponibili nell'SDK di Hub di notifica per .NET. In questo modo sarà possibile tradurre direttamente tutte le esercitazioni e gli esempi disponibili in questo sito oppure messi a disposizione dalla community in Internet.The main client interface can provide the same methods that are available in the .NET Notification Hubs SDK, this will allow you to directly translate all the tutorials and samples currently available on this site, and contributed by the community on the internet.

Tutto il codice disponibile è incluso nell' esempio di wrapper REST PHP.You can find all the code available in the [PHP REST wrapper sample].

Ad esempio, per creare un client:For example, to create a client:

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

Per inviare una notifica nativa iOS:To send an iOS native notification:

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

ImplementazioneImplementation

Se non è già stato fatto, seguire l' esercitazione Introduzione ad Hub di notifica fino all'ultima sezione in cui è necessario implementare il back-end.If you did not already, please follow our [Get started tutorial] up to the last section where you have to implement the back-end. Si può anche usare il codice dell'esempio di wrapper REST PHP e passare direttamente alla sezione Completare l'esercitazione.Also, if you want you can use the code from the [PHP REST wrapper sample] and go directly to the Complete the tutorial section.

Tutti i dettagli per implementare un wrapper REST completo sono disponibili in MSDN.All the details to implement a full REST wrapper can be found on MSDN. In questa sezione viene illustrata l'implementazione PHP dei passaggi principali necessari per accedere agli endpoint REST di Hub di notifica:In this section we will describe the PHP implementation of the main steps required to access Notification Hubs REST endpoints:

  1. Analizzare la stringa di connessioneParse the connection string
  2. Generare il token di autorizzazioneGenerate the authorization token
  3. Eseguire la chiamata HTTPPerform the HTTP call

Analizzare la stringa di connessioneParse the connection string

Questa è la classe principale che implementa il client, il cui costruttore analizza la stringa di connessione:Here is the main class implementing the client, whose constructor that parses the connection string:

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);
            }
        }
    }
}

Creare il token di sicurezzaCreate security token

I dettagli della creazione del token di sicurezza sono disponibili qui.The details of the security token creation are available here. È necessario aggiungere il metodo seguente alla classe NotificationHub per creare il token in base dell'URI della richiesta corrente e delle credenziali estratte dalla stringa di connessione.The following method has to be added to the NotificationHub class to create the token based on the URI of the current request and the credentials extracted from the connection string.

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;
}

Inviare una notificaSend a notification

Definire innanzitutto una classe che rappresenta una notifica.First, let us define a class representing a notification.

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", "gcm", "windowsphone"])) {
            throw new Exception('Invalid format: ' . $format);
        }

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

Questa classe è un contenitore per un corpo di notifica nativo oppure un insieme di proprietà nel caso di una notifica modello e un insieme di intestazioni che contengono il formato (modello o piattaforma nativa) e proprietà specifiche della piattaforma (come la proprietà di scadenza e le intestazioni WNS di Apple).This class is a container for a native notification body, or a set of properties on case of a template notification, and a set of headers which contains format (native platform or template) and platform-specific properties (like Apple expiration property and WNS headers).

Per tutte le opzioni disponibili fare riferimento alla documentazione delle API REST di Hub di notifica e ai formati delle piattaforme di notifica specifiche.Please refer to the Notification Hubs REST APIs documentation and the specific notification platforms' formats for all the options available.

Una volta definita questa classe, è possibile scrivere i metodi di notifica all'interno della classe NotificationHub .Armed with this class, we can now write the send notification methods inside of the NotificationHub class.

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", "gcm"])) {
        $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 notificaiton: '. $info['http_code'] . ' msg: ' . $response);
    }
} 

I metodi sopra indicati inviano una richiesta POST HTTP all'endpoint /messages dell'hub di notifica, contenenti il corpo e le intestazioni corrette per l'invio della notifica.The above methods send an HTTP POST request to the /messages endpoint of your notification hub, with the correct body and headers to send the notification.

Completare l'esercitazioneComplete the tutorial

È ora possibile completare l'esercitazione introduttiva inviando la notifica da un back-end PHP.Now you can complete the Get Started tutorial by sending the notification from a PHP back-end.

Inizializzare il client di Hub di notifica, sostituendo la stringa di connessione e il nome hub come indicato nell'esercitazione esercitazione Introduzione ad Hub di notifica:Initialize your Notification Hubs client (substitute the connection string and hub name as instructed in the [Get started tutorial]):

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

Aggiungere quindi il codice di invio a seconda della piattaforma mobile di destinazione.Then add the send code depending on your target mobile platform.

Windows Store e Windows Phone 8.1 (non Silverlight)Windows Store and Windows Phone 8.1 (non-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);

iOSiOS

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

AndroidAndroid

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

Windows Phone 8.0 e 8.1 SilverlightWindows Phone 8.0 and 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 FireKindle Fire

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

Eseguendo il codice PHP dovrebbe essere visualizzata una notifica sul dispositivo di destinazione.Running your PHP code should produce now a notification appearing on your target device.

Passaggi successiviNext Steps

In questo argomento è stato illustrato come creare un semplice client REST Java per Hub di notifica.In this topic we showed how to create a simple Java REST client for Notification Hubs. A questo punto è possibile:From here you can:

  • Scaricare l'intero esempio di wrapper REST PHP, che contiene tutto il codice sopra indicato.Download the full [PHP REST wrapper sample], which contains all the code above.
  • Visualizzare altre informazioni sulla funzionalità di aggiunta tag di Hub di notifica nell'[esercitazione per l'invio di notizie]Continue learning about Notification Hubs tagging feature in the [Breaking News tutorial]
  • Visualizzare altre informazioni sull'invio di notifiche push a singoli utenti nell'[esercitazione sull'invio di notifiche agli utenti]Learn about pushing notifications to individual users in [Notify Users tutorial]

Per ulteriori informazioni, vedere anche il Centro per sviluppatori di PHP.For more information, see also the PHP Developer Center.