Dela via


Så här använder du Notification Hubs från PHP

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

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 kan översätta alla självstudier och exempel som för närvarande finns på den här webbplatsen och som har bidragits av communityt på internet direkt.

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 inbyggt iOS-meddelande:

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

Genomförande

Om du inte redan gjorde det följer du [Kom igång-självstudien] 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. Analysera anslutningssträngen
  2. Generera auktoriseringstoken
  3. Utför HTTP-anropet

Analysera 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

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

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 extraheras 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 en inbyggd meddelandetextkropp, eller en uppsättning egenskaper i fallet med ett mallmeddelande och en uppsättning rubriker som innehåller format (intern plattform eller mall) och plattformsspecifika egenskaper (till exempel egenskapen Apple-förfallotid och WNS-huvuden).

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

Beväpnad 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 handledningen

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ärifrån kan du:

  • 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 att skicka 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 Hjälp av Azure Notification Hubs