jak wysyłać powiadomienia Web Push za pomocą PHP

Logo PHP

interfejs API Web Push umożliwia wysyłanie powiadomień push do przeglądarek internetowych i interfejsów API. Podczas gdy większość logiki dzieje się w przeglądarce, nadal potrzebujesz komponentu po stronie serwera, aby wygenerować powiadomienia. Oto jak zaimplementować web Push backend za pomocą PHP.

wymagania wstępne

na potrzeby tego kursu Zakładamy, że znasz podstawy tworzenia HTTP API w PHP. Musisz ujawnić kilka publicznych punktów końcowych przy użyciu struktury sieci web. Będą one wywoływane przez JavaScript w przeglądarce, aby zarejestrować i wyrejestrować urządzenia.

ten artykuł nie dotyka kodu po stronie przeglądarki ani sposobu działania. Musisz stworzyć pracownika serwisowego, który reaguje na przychodzące zdarzenia push i wyświetla użytkownikowi powiadomienie.

na wysokim poziomie Web Push flow wygląda tak:

  1. subskrypcja push jest rejestrowana w przeglądarce. Przeglądarka wysyła unikalny adres URL punktu końcowego do JavaScript.
  2. Twój JavaScript wysyła dane subskrypcji do twojego serwera i identyfikuje użytkownika, którego dotyczy.
  3. gdy twój backend musi wysłać powiadomienie push, Utwórz ładunek i wyślij go do adresu URL punktu końcowego zgłoszonego jako część danych subskrypcji.
  4. przeglądarka użytkownika otrzyma ładunek za pośrednictwem platformy dostarczania powiadomień dostawcy. Pracownik obsługi JavaScript obsługuje kolejne zdarzenie i korzysta z interfejsu API powiadomień przeglądarki, aby ostrzec użytkownika.

Oto jak zaimplementować aspekty po stronie serwera w krokach od 1 do 3.

Getting Setup

użyjemy pakietu Packagist web-push przez minishlink. Umożliwia to abstrakcję interakcji z każdą platformą powiadomień przeglądarki, dzięki czemu nie trzeba ręcznie rozróżniać typów punktów końcowych.

Dodaj pakiet do swojego projektu za pomocą Composera:

composer require minishlink/web-push
Reklama

aby korzystać z najnowszej wersji, potrzebujesz PHP 7.2 lub nowszego z gmp, mbstring, curl, i openssl rozszerzeń. Jeśli musisz użyć starszego wydania PHP, Zablokuj pakiet do wcześniejszej wersji, aby zachować zgodność.

biblioteka udostępnia podstawową klasę WebPush z metodami, które pozwalają wysyłać powiadomienia pojedynczo lub jako partie. Subskrypcje są reprezentowane przez instancje klasy Subscription.

dostarczanie kluczy VAPID

zaufanie do zgodnego ze standardami ekosystemu web Push jest egzekwowane poprzez użycie kluczy vapid. Twój serwer potrzebuje pary kluczy VAPID, aby mógł uwierzytelnić się w przeglądarkach. Klucz publiczny powinien być ujawniony za pośrednictwem punktu końcowego API.

możesz wygenerować zestaw kluczy VAPID używając pakietu web-push :

use Minishlink\WebPush\VAPID; $keyset = VAPID::createVapidKeys(); // public key - this needs to be accessible via an API endpointecho $keyset; // private key - never expose this!echo $keyset; file_put_contents("vapid.json", json_encode($keyset));

Generuj klucze dla systemu i przechowuj je w stałej lokalizacji. Dodaj punkt końcowy API, aby JavaScript po stronie klienta mógł odzyskać klucz publiczny. Zostanie to wykorzystane do skonfigurowania subskrypcji push przeglądarki. Urządzenie użytkownika będzie akceptować przychodzące zdarzenia push, jeśli zostały podpisane przy użyciu odpowiedniego klucza prywatnego VAPID.

Rejestracja subskrypcji Push

kolejnym krokiem w kolejności jest otrzymywanie żądań subskrypcji push od klientów. Po potwierdzeniu przez przeglądarkę nowej subskrypcji push skrypt JavaScript powinien wysłać adres URL punktu końcowego subskrypcji i powiązane klucze uwierzytelniania do serwera. Przechowuj te dane wraz z identyfikatorem użytkownika, aby później móc odzyskać wszystkie urządzenia zarejestrowane w trybie push połączone z użytkownikiem.

Reklama

na tym etapie pomijamy próbki kodu, ponieważ implementacja zależy od warstwy przechowywania danych i wartości wysyłanych przez JavaScript. Zazwyczaj będzie to reprezentacja JSON obiektu PushSubscription. Aby utworzyć subskrypcję, zastąpić istniejącą subskrypcję i zażądać usunięcia, gdy użytkownik zrezygnuje z subskrypcji, potrzebny jest prosty zestaw punktów końcowych CRUD API z obsługą bazy danych.

przygotowywanie subskrypcji

po pomyślnej rejestracji klienta możesz rozpocząć wysyłanie powiadomień za pomocą biblioteki web-push. Rozpocznij od utworzenia instancji klasy WebPush :

use Minishlink\WebPush\WebPush; $webPush = new WebPush(]);

możesz ponownie użyć jednej instancji WebPush za każdym razem, gdy wysyłasz powiadomienie. Biblioteka musi być skonfigurowana z zestawem kluczy VAPID wygenerowanym wcześniej. Klucze powinny być zakodowane jako Base64, ale jest to obsługiwane dla Ciebie, jeśli tworzysz je z biblioteką.

VAPID subject służy do identyfikacji serwera i jego danych kontaktowych. Możesz podać adres URL witryny lub link do adresu e-mail mailto:.

następnie musisz odzyskać subskrypcję push, do której będziesz wysyłać. Użyj systemu dostępu do danych, aby wyszukać adresy URL punktów końcowych push powiązane z użytkownikiem, do którego chcesz wysłać wiadomość. Konwertuj każdą subskrypcję na instancję Subscription :

use Minishlink\WebPush\Subscription; // Get user's push data...// SELECT * FROM push_subscriptions WHERE user_id = 123456 $subscription = Subscription::create(]);

Reklama

właściwość auth PushSubscription jest powtarzana dwukrotnie, aby poradzić sobie z dwiema różnymi wersjami specyfikacji używanymi przez usługi przeglądarek. Właściwość P256DH jest kolejnym kluczem publicznym, który powinien być dostarczony po ustawieniu w subskrypcji.

biblioteka web-push jest kompatybilna z Chrome i Firefox push endpoints. Będzie również współpracować z każdą inną implementacją Web Push, która spełnia obecny standard.

wysyłanie powiadomienia

teraz Połącz swoje wystąpienia WebPush i Subscription, aby wysłać powiadomienie:

$result = $webPush -> sendOneNotification( $subscription, json_encode());

połączenie sendOneNotification() zapewnia natychmiastową dostawę za pojedyncze zgłoszenie. Ładunek w tym przypadku jest tablicą kodowaną JSON z dwiema właściwościami. To od Ciebie zależy, jakie dane wysyłasz i jakiego formatu używasz – twój Klient JavaScript otrzymuje je w takim stanie, w jakim są i może je zinterpretować w razie potrzeby.

wysłanie powiadomienia zwraca klasę result, która pozwala sprawdzić, czy operacja się powiodła:

if ($result -> isSuccess()) { // all good}else { // something went wrong error_log($result -> getReason()); // provides raw HTTP response data error_log($result -> getResponse()); }

możesz podjąć działania, aby ponowić próbę lub anulować dostawę, jeśli wystąpi błąd.

Reklama

subskrypcje powiadomień mogą również wygasnąć. Wywołanie metody isSubscriptionExpired() w klasie result w celu ustalenia, czy jest to przyczyna błędu. W tym scenariuszu możesz usunąć subskrypcję z bazy danych, zapewniając, że nie wyślesz niczego innego do martwego punktu końcowego.

powiadomienia dotyczące grupowania

powiadomienia mogą być zestawiane ze sobą w celu dostarczenia za pomocą jednej metody wywołania:

$webPush -> queueNotification($subscription, );$webPush -> queueNotification($subscription, ); foreach ($webPush -> flush() as $i => $result) { echo ("Notification $i was " . ($result -> isSuccess() ? "sent" : "not sent"));}

jest to przydatne, gdy wiesz, że będziesz wysyłać dużą liczbę powiadomień w krótkim czasie. Kolejkuj wszystkie swoje ładunki i pozwól web-push dostarczyć je w optymalny sposób.

możesz ograniczyć liczbę powiadomień wysyłanych w jednym flush() przekazując liczbę całkowitą do metody:

$webPush -> flush(100); // send 100 messages

domyślną wartością jest 1000.

opcje powiadomień

sendOneNotification() i queueNotification() akceptują następujące opcje jako trzeci argument tablicy:

  • TTL – kontroluje, jak długo Platforma powiadomień przeglądarki będzie przechowywać powiadomienie, jeśli nie można go natychmiast przekazać na urządzenie użytkownika. Jeśli urządzenie użytkownika jest offline, platformy domyślnie próbują go dostarczyć przez następne cztery tygodnie. Jeśli wysyłasz powiadomienie, które nie będzie odpowiednie w przyszłym tygodniu, dostosuj odpowiednio TTL, aby użytkownik nie widział nieaktualnych treści.
  • urgency – akceptuje wartości normal, low lub very-low. Niektóre platformy mogą wykorzystać to do dostosowania częstotliwości dostarczania powiadomień. Urządzenia, które wchodzą w tryb oszczędzania baterii może zawiesić dostarczanie powiadomień nie pilne.
  • batchSize – ma to taki sam efekt jak argument flush() opisany powyżej.

możesz skonfigurować domyślne wartości opcji używając drugiego argumentu konstruktora WebPush :

$webPush = new WebPush(], );

podsumowanie

biblioteka web-push ułatwia wysyłanie powiadomień Web Push za pomocą PHP. Otrzymujesz warstwę abstrakcji na różnych platformach przeglądarek, która obsługuje dozowanie, obsługę błędów i wszystkie funkcje web Push.

Reklama

Mechanizm web Push jest nietypowym systemem przeglądarkowym, ponieważ opiera się na zdalnych komponentach po stronie serwera, które sam dostarczasz. Może to sprawiać wrażenie nieprzezroczystego i technicznego. W praktyce tworzenie prostego zaplecza PHP jest szybkie i łatwe; implementacja frontendu jest zwykle bardziej czasochłonnym aspektem, szczególnie jeśli nie używasz jeszcze funkcji service worker.

Leave a Reply