Delen via


Notification Hubs gebruiken vanuit PHP

U hebt toegang tot alle Notification Hubs-functies vanuit een Java/PHP/Ruby-back-end met behulp van de Notification Hub REST-interface, zoals beschreven in het MSDN-onderwerp Notification Hubs REST API's.

In dit onderwerp laten we het volgende zien:

Clientinterface

De belangrijkste clientinterface kan dezelfde methoden bieden die beschikbaar zijn in de .NET Notification Hubs SDK, waarmee u alle zelfstudies en voorbeelden die momenteel beschikbaar zijn op deze site en die zijn bijgedragen door de community op internet, rechtstreeks kunt vertalen.

U vindt alle beschikbare code in het PHP REST-wrapper-voorbeeld.

Als u bijvoorbeeld een client wilt maken, gaat u als volgt te werk:

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

Een systeemeigen iOS-melding verzenden:

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

Implementatie

Als u dat nog niet hebt gedaan, volgt u de [Zelfstudie Aan de slag] tot de laatste sectie waarin u de back-end moet implementeren. Als u wilt, kunt u ook de code uit het PHP REST-wrapper-voorbeeld gebruiken en rechtstreeks naar de sectie De zelfstudie voltooien gaan.

Alle details voor het implementeren van een volledige REST-wrapper vindt u op MSDN. In deze sectie beschrijven we de PHP-implementatie van de belangrijkste stappen die nodig zijn voor toegang tot Notification Hubs REST-eindpunten:

  1. De verbindingsreeks parseren
  2. Het autorisatietoken genereren
  3. De HTTP-aanroep uitvoeren

De verbindingsreeks parseren

Dit is de belangrijkste klasse die de client implementeert, waarvan de constructor de connection string parseert:

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

Een beveiligingstoken maken

Raadpleeg de Azure-documentatie voor informatie over het maken van een SAS-beveiligingstoken.

Voeg de generateSasToken methode toe aan de NotificationHub klasse om het token te maken op basis van de URI van de huidige aanvraag en de referenties die zijn geëxtraheerd uit de 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;
}

Een melding verzenden

Laten we eerst een klasse definiëren die een melding vertegenwoordigt.

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

Deze klasse is een container voor een systeemeigen meldingstekst of een set eigenschappen voor het geval van een sjabloonmelding en een set headers, die de indeling (systeemeigen platform of sjabloon) en platformspecifieke eigenschappen (zoals Apple-verloopeigenschap en WNS-headers) bevat.

Raadpleeg de documentatie voor Notification Hubs REST API's en de indelingen van de specifieke meldingsplatforms voor alle beschikbare opties.

Gewapend met deze klasse kunnen we nu de methoden voor het verzenden van meldingen in de NotificationHub klasse schrijven:

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

Met de bovenstaande methoden wordt een HTTP POST-aanvraag verzonden naar het /messages eindpunt van uw Notification Hub, met de juiste hoofdtekst en headers om de melding te verzenden.

De zelfstudie voltooien

U kunt nu de zelfstudie Aan de slag voltooien door de melding te verzenden vanuit een PHP-back-end.

Initialiseer uw Notification Hubs-client (vervang de naam van de connection string en de hub zoals aangegeven in de [Zelfstudie Aan de slag]):

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

Voeg vervolgens de verzendcode toe, afhankelijk van uw mobiele doelplatform.

Windows Store en Windows Phone 8.1 (niet-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 en 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);

Als u uw PHP-code uitvoert, wordt er nu een melding weergegeven op uw doelapparaat.

Volgende stappen

In dit onderwerp hebben we laten zien hoe u een eenvoudige PHP REST-client maakt voor Notification Hubs. Hier kunt u het volgende doen:

  • Download het volledige PHP REST-wrapper-voorbeeld, dat alle bovenstaande code bevat.
  • Meer informatie over de tagfunctie van Notification Hubs in de zelfstudie [Belangrijk nieuws]
  • Meer informatie over pushmeldingen naar afzonderlijke gebruikers in [Zelfstudie Gebruikers waarschuwen]

Zie ook het PHP Developer Center voor meer informatie.

Pushmeldingen verzenden naar iOS-apps met Azure Notification Hubs