Använda Notification Hubs från PHP

Du kan komma åt alla Notification Hubs-funktioner från en Java/PHP/Ruby-serverdel med hjälp av REST-gränssnittet för Notification Hub enligt beskrivningen i REST-API:erna för MSDN-ämnet Notification Hubs.

I det här avsnittet visar vi hur du:

Klientgränssnitt

Huvudklientgränssnittet kan tillhandahålla samma metoder som är tillgängliga i .NET Notification Hubs SDK, vilket gör att du direkt kan översätta alla självstudier och exempel som för närvarande är tillgängliga på den här webbplatsen och som har bidragit av communityn på Internet.

Du hittar all kod som är tillgänglig i PHP REST-omslutningsexemplet.

Om du till exempel vill skapa en klient:

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

Så här skickar du ett internt iOS-meddelande:

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

Implementering

Om du inte redan gjorde det följer du självstudien [Kom igång] fram till det sista avsnittet där du måste implementera serverdelen. Om du vill kan du också använda koden från PHP REST Wrapper-exemplet och gå direkt till avsnittet Slutför självstudien .

All information för att implementera en fullständig REST-omslutning finns på MSDN. I det här avsnittet beskriver vi PHP-implementeringen av de viktigaste stegen som krävs för att få åtkomst till Notification Hubs REST-slutpunkter:

  1. Parsa anslutningssträngen
  2. Generera auktoriseringstoken
  3. Utföra HTTP-anropet

Parsa anslutningssträngen

Här är huvudklassen som implementerar klienten, vars konstruktor parsar anslutningssträngen:

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

Skapa en säkerhetstoken

I Azure-dokumentationen finns information om hur du skapar en SAS-säkerhetstoken.

generateSasToken Lägg till metoden i NotificationHub klassen för att skapa token baserat på URI:n för den aktuella begäran och de autentiseringsuppgifter som extraherats från anslutningssträngen.

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

Skicka ett meddelande

Först ska vi definiera en klass som representerar ett meddelande.

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

Den här klassen är en container för ett inbyggt meddelandetext, eller en uppsättning egenskaper för ett mallmeddelande, och en uppsättning rubriker som innehåller format (intern plattform eller mall) och plattformsspecifika egenskaper (som Apple-förfalloegenskap och WNS-huvuden).

Se dokumentationen för Notification Hubs REST-API:er och de specifika meddelandeplattformarnas format för alla tillgängliga alternativ.

Med den här klassen kan vi nu skriva metoderna för att skicka meddelanden i NotificationHub klassen:

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

Metoderna ovan skickar en HTTP POST-begäran till /messages slutpunkten för meddelandehubben med rätt brödtext och rubriker för att skicka meddelandet.

Slutför självstudien

Nu kan du slutföra självstudien Komma igång genom att skicka meddelandet från en PHP-serverdel.

Initiera Notification Hubs-klienten (ersätt anslutningssträngen och hubbens namn enligt instruktionerna i [Kom igång-självstudien]):

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

Lägg sedan till sändningskoden beroende på din mobila målplattform.

Windows Store och Windows Phone 8.1 (icke-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 och 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);

När du kör PHP-koden bör nu ett meddelande visas på målenheten.

Nästa steg

I det här avsnittet visade vi hur du skapar en enkel PHP REST-klient för Notification Hubs. Här kan göra du följande:

  • Ladda ned det fullständiga PHP REST-omslutningsexemplet, som innehåller all kod ovan.
  • Fortsätt att lära dig mer om taggningsfunktionen i Notification Hubs i [Breaking News-självstudien]
  • Lär dig mer om push-meddelanden till enskilda användare i [Självstudie om att meddela användare]

Mer information finns i PHP Developer Center.

Skicka push-meddelanden till iOS-appar med Azure Notification Hubs