So senden Sie Web-Push-Benachrichtigungen mit PHP

0
610

Mit der Web Push API können Sie Push-Benachrichtigungen an Webbrowser und APIs senden. Während der Großteil der Logik im Browser abläuft, benötigen Sie dennoch eine serverseitige Komponente, um Ihre Benachrichtigungen zu generieren. So implementieren Sie ein Web-Push-Backend mit PHP.

Voraussetzungen

Für dieses Tutorial gehen wir davon aus, dass Sie 8217;sind mit den Grundlagen der Erstellung von HTTP-APIs in PHP vertraut. Sie müssen einige öffentliche Endpunkte mit Ihrem Web-Framework verfügbar machen. Diese werden von Ihrem Browser-JavaScript aufgerufen, um Geräte zu registrieren und die Registrierung aufzuheben.

In diesem Artikel wird weder auf den browserseitigen Code noch auf seine Funktionsweise eingegangen. Sie müssen einen Servicemitarbeiter zusammenstellen, der auf eingehende Push-Ereignisse reagiert und dem Benutzer eine Benachrichtigung anzeigt.

Auf hoher Ebene sieht der Web-Push-Flow wie folgt aus:

  1. Ein Push-Abonnement wird im Browser registriert. Der Browser gibt eine eindeutige Endpunkt-URL an Ihr JavaScript aus.
  2. Ihr JavaScript sendet die Abonnementdaten an Ihren Server und identifiziert den Benutzer, für den es gilt.
  3. Wenn Ihr Backend einen Push senden muss Benachrichtigung, erstellen Sie eine Nutzlast und senden Sie sie an die Endpunkt-URL, die als Teil der Abonnementdaten angegeben ist.
  4. Der Browser des Benutzers empfängt die Nutzlast über die Benachrichtigungszustellungsplattform des Anbieters. Ihr JavaScript-Service-Mitarbeiter verarbeitet das daraus resultierende Ereignis und verwendet die Benachrichtigungs-API des Browsers, um den Benutzer zu benachrichtigen.

So implementieren Sie die serverseitigen Aspekte von Schritt 1 zu 3.

Einrichten erhalten

Wir verwenden das Web-Push-Paket Packagist von minishlink. Dadurch werden die Interaktionen mit jeder Browser-Benachrichtigungsplattform abstrahiert, sodass Sie nicht manuell zwischen Endpunkttypen unterscheiden müssen.

Fügen Sie das Paket mit Composer zu Ihrem Projekt hinzu:

Composer erfordern minishlink/web-push Advertisement

Um die neueste Version zu verwenden, benötigen Sie PHP 7.2 oder höher mit den Erweiterungen gmp, mbstring, curl und openssl . Wenn Sie eine ältere PHP-Version verwenden müssen, sperren Sie das Paket auf eine frühere Version, um die Kompatibilität zu gewährleisten.

Die Bibliothek stellt eine zentrale WebPush-Klasse mit Methoden bereit, mit denen Sie Benachrichtigungen einzeln oder als Stapel senden können. Abonnements werden durch Instanzen der Abonnementklasse dargestellt.

Bereitstellung von VAPID-Schlüsseln

Das Vertrauen in das standardkonforme Web-Push-Ökosystem wird durch die Verwendung erzwungen von VAPID-Schlüsseln. Ihr Server benötigt ein VAPID-Schlüsselpaar, damit er sich gegenüber Browsern authentifizieren kann. Der öffentliche Schlüssel sollte über einen API-Endpunkt verfügbar gemacht werden.

Sie können einen VAPID-Schlüsselsatz mit dem Web-Push-Paket generieren:

verwenden Sie MinishlinkWebPushVAPID;   $keyset = VAPID::createVapidKeys();   //öffentlicher Schlüssel – dieser muss über einen API-Endpunkt zugänglich sein echo $keyset["publicKey"];   //privater Schlüssel – niemals offenlegen! echo $keyset["privateKey"];   file_put_contents("vapid.json", json_encode($keyset));

Generieren Sie Schlüssel für Ihr System und speichern Sie sie an einem dauerhaften Ort. Fügen Sie einen API-Endpunkt hinzu, damit Ihr clientseitiges JavaScript den öffentlichen Schlüssel abrufen kann. Dies wird verwendet, um das Push-Abonnement des Browsers einzurichten. Das Gerät des Benutzers akzeptiert eingehende Push-Ereignisse, wenn es mit dem entsprechenden privaten VAPID-Schlüssel signiert wurde.

Registrieren von Push-Abonnements

Der nächste Schritt in der Sequenz ist das Empfangen von Push-Abonnementanfragen von Ihren Clients. Sobald der Browser ein neues Push-Abonnement bestätigt hat, sollte Ihr JavaScript die Endpunkt-URL des Abonnements und die zugehörigen Authentifizierungsschlüssel an Ihren Server senden. Speichern Sie diese Details zusammen mit der ID des Nutzers, damit Sie später alle per Push registrierten Geräte abrufen können, die mit dem Nutzer verknüpft sind.

Werbung

Wir lassen Codebeispiele für diesen Schritt weg da die Implementierung von Ihrer Datenspeicherschicht und den Werten abhängt, die Ihr JavaScript sendet. Normalerweise ist dies eine JSON-Darstellung eines PushSubscription-Objekts. Sie benötigen einen einfachen Satz datenbankgestützter CRUD-API-Endpunkte, um ein Abonnement zu erstellen, ein vorhandenes zu ersetzen und eine Löschung anzufordern, wenn der Benutzer sich abmeldet.

Vorbereiten von Abonnements

Sobald sich ein Kunde erfolgreich registriert hat, können Sie mit dem Senden von Benachrichtigungen über die Web-Push-Bibliothek beginnen. Beginnen Sie mit dem Erstellen einer Instanz der WebPush-Klasse:

verwenden Sie MinishlinkWebPushWebPush;   $webPush = neuer WebPush([ "VAPID" => [ "Betreff" => "https://example.com", "publicKey" => "VAPID_Public_Key_Here", "privateKey" => "VAPID_Private_Key_Here" ] ]);

Sie können jedes Mal, wenn Sie eine Benachrichtigung senden, eine WebPush-Instanz wiederverwenden. Die Bibliothek muss mit dem zuvor generierten VAPID-Schlüsselsatz konfiguriert werden. Schlüssel sollten als Base64 kodiert sein, aber dies wird für Sie gehandhabt, wenn Sie sie mit der Bibliothek erstellen.

Der VAPID-Betreff wird verwendet, um Ihren Server und seine Kontaktdaten zu identifizieren. Sie können eine Website-URL oder einen mailto:-E-Mail-Adresslink angeben.

Als Nächstes müssen Sie das Push-Abonnement abrufen, an das Sie senden möchten. Verwenden Sie Ihr Datenzugriffssystem, um die Push-Endpunkt-URLs zu suchen, die dem Benutzer zugeordnet sind, an den Sie senden möchten. Konvertieren Sie jedes Abonnement in eine Abonnementinstanz:

verwenden Sie MinishlinkWebPushAbonnement;   //Push-Daten des Benutzers abrufen… //SELECT * FROM push_subscriptions WHERE user_id = 123456   $subscription = Abonnement::create([ "Endpunkt" => "https://fcm.google.com/…", "contentEncoding" => "aesgcm", "authToken" => "<Authentifizierungstoken vom JavaScript-PushSubscription-Objekt>" "Schlüssel" => [ "Auth" => "<Authentifizierungstoken vom JavaScript-PushSubscription-Objekt>", "p256dh" => "<p256dh-Token aus JavaScript-PushSubscription-Objekt>" ] ]); Werbung

Die auth-Eigenschaft der PushSubscription wird zweimal wiederholt, um mit zwei verschiedenen Versionen der von Browserdiensten verwendeten Spezifikation zurechtzukommen. Die P256DH-Eigenschaft ist ein weiterer öffentlicher Schlüssel, der beim Festlegen im Abonnement bereitgestellt werden sollte.

Die Web-Push-Bibliothek ist mit Chrome- und Firefox-Push-Endpunkten kompatibel. Es funktioniert auch mit jeder anderen Web-Push-Implementierung, die dem aktuellen Standard entspricht.

Senden einer Benachrichtigung

Kombinieren Sie jetzt Ihren WebPush und Abonnementinstanzen zum Senden einer Benachrichtigung:

$result = $webPush -> sendOneNotification( $subscription, json_encode([ "Nachricht" => "Demo-Benachrichtigung", "foo" => "Bar" ]) );

Der Aufruf von sendOneNotification() ermöglicht die sofortige Zustellung einer einzelnen Benachrichtigung. Die Nutzlast ist in diesem Fall ein JSON-codiertes Array mit zwei Eigenschaften. Es liegt an Ihnen, welche Daten Sie senden und welches Format Sie verwenden – Ihr JavaScript-Client empfängt sie unverändert und kann sie bei Bedarf interpretieren.

Das Senden einer Benachrichtigung gibt eine Ergebnisklasse zurück, mit der Sie überprüfen können, ob die Operation erfolgreich war:

wenn ($ergebnis -> istErfolg()) { //alles gut } sonst {   //etwas ist schief gelaufen error_log($result -> getReason());   //liefert rohe HTTP-Antwortdaten error_log($result -> getResponse());   }

Wenn ein Fehler auftritt, können Sie die Zustellung wiederholen oder abbrechen.

Werbung

Benachrichtigungsabonnements können auch ablaufen. Rufen Sie die Methode isSubscriptionExpired() für eine Ergebnisklasse auf, um festzustellen, ob dies der Grund für den Fehler ist. In diesem Szenario können Sie das Abonnement aus Ihrer Datenbank löschen, um sicherzustellen, dass Sie nichts anderes an einen toten Endpunkt senden.

Batching-Benachrichtigungen

Benachrichtigungen können für die Zustellung mit einem Methodenaufruf zusammengefasst werden:

$webPush -> queueNotification($subscription, ["msg" => "erster"]); $webPush -> queueNotification($subscription, ["msg" => "zweiter"]);   foreach ($webPush -> bündig() als $i => $Ergebnis) { echo ("Benachrichtigung $i war " . ($Ergebnis -> istErfolg() ? "gesendet" : "nicht gesendet")); }

Dies ist nützlich, wenn Sie wissen, dass Sie in kurzer Zeit eine große Anzahl von Benachrichtigungen senden werden. Stellen Sie alle Ihre Nutzlasten in eine Warteschlange und lassen Sie sie per Web-Push optimal bereitstellen.

Sie können die Anzahl der in einem einzigen flush() gesendeten Benachrichtigungen begrenzen, indem Sie eine ganze Zahl an die Methode übergeben:

$webPush -> bündig(100); //100 Nachrichten senden

Der Standardwert ist 1000.

Benachrichtigungsoptionen

sendOneNotification() und queueNotification() akzeptieren die folgenden Optionen als a drittes Array-Argument:

  • TTL– Steuert, wie lange die Benachrichtigungsplattform des Browsers die Benachrichtigung aufbewahrt, wenn sie nicht sofort an das Gerät des Benutzers weitergeleitet werden kann. Wenn das Gerät des Nutzers offline ist, versuchen die Plattformen standardmäßig, es in den nächsten vier Wochen zuzustellen. Wenn Sie eine Benachrichtigung senden, die nächste Woche nicht relevant ist, passen Sie die TTL entsprechend an, damit dem Nutzer keine veralteten Inhalte angezeigt werden.
  • Dringlichkeit– Akzeptiert normale, niedrige oder sehr niedrige Werte. Einige Plattformen können dies verwenden, um die Häufigkeit der Benachrichtigungszustellung anzupassen. Geräte, die in einen Energiesparmodus wechseln, können die Zustellung nicht dringender Benachrichtigungen aussetzen.
  • batchSize – Dies hat den gleichen Effekt wie das oben beschriebene Argument für flush().

Sie können Standardoptionswerte konfigurieren, indem Sie das zweite Argument für den WebPush-Konstruktor verwenden:

$webPush = new WebPush& #40;["VAPID" => […]], ["TTL" => 3600]);

Zusammenfassung

Die Web-Push-Bibliothek erleichtert das Senden von Web-Push-Benachrichtigungen mit PHP. Sie erhalten eine Abstraktionsschicht über den verschiedenen Browserplattformen, die Batching, Fehlerbehandlung und alle Web-Push-Funktionen unterstützt.

Werbung

Der Web-Push-Mechanismus ist ein ungewöhnliches Browsersystem, da es abhängig ist auf entfernten serverseitigen Komponenten, die Sie selbst bereitstellen. Dadurch kann es undurchsichtig und technisch erscheinen. In der Praxis ist die Erstellung eines einfachen PHP-Backends schnell und einfach; die Frontend-Implementierung ist normalerweise der zeitaufwendigere Aspekt, insbesondere wenn Sie noch keine Service-Worker-Funktionen verwenden.