Hoe stuur je Web Push notificaties met PHP

PHP Logo

met de Web Push API kun je push notificaties naar webbrowsers en API ‘ s sturen. Terwijl de meeste van de logica gebeurt in de browser, moet u nog steeds een server-side component om uw meldingen te genereren. Hier is het implementeren van een Web Push backend met behulp van PHP.

Prerequisites

in deze tutorial gaan we ervan uit dat u vertrouwd bent met de basisprincipes van het aanmaken van HTTP API ‘ s in PHP. Je moet een paar publieke eindpunten bloot te leggen met behulp van uw web framework. Deze zullen door uw in-browser JavaScript worden opgeroepen om apparaten te registreren en uit te schrijven.

dit artikel zal niet ingaan op de browser-side code of hoe het werkt. U moet een servicemedewerker samenstellen die reageert op inkomende push-gebeurtenissen en een melding aan de gebruiker weergeeft.

op een hoog niveau ziet de Web Push flow er zo uit:

  1. een push-abonnement wordt geregistreerd in de browser. De browser geeft een unieke endpoint URL aan uw JavaScript.
  2. uw JavaScript verzendt de abonnementsgegevens naar uw server en identificeert de gebruiker waarop het van toepassing is.
  3. wanneer uw backend een push notificatie moet verzenden, maakt u een payload aan en verzendt u deze naar de endpoint URL die wordt gerapporteerd als onderdeel van de abonnementsgegevens.
  4. de browser van de gebruiker ontvangt de lading via het meldingsplatform van de leverancier. Uw JavaScript-dienstmedewerker behandelt de daaropvolgende gebeurtenis en gebruikt de kennisgeving API van de browser om de gebruiker te waarschuwen.

hier is hoe de server-side aspecten van de stappen 1 tot en met 3 te implementeren.

instellingen ophalen

we gebruiken het web-push Packagist-pakket van minishlink. Dit abstraheert de interacties met elk browser meldingsplatform, zodat u geen handmatig onderscheid hoeft te maken tussen endpoint types.

voeg het pakket toe aan uw project met behulp van Composer:

composer require minishlink/web-push

om de nieuwste versie te gebruiken, heb je PHP 7.2 of hoger nodig met de gmp, mbstring, curl, en openssl extensies. Als je een oudere PHP release moet gebruiken, vergrendel het pakket naar een eerdere versie om compatibiliteit te behouden.

de bibliotheek toont een core WebPush klasse met methoden waarmee u meldingen afzonderlijk of als batches kunt verzenden. Abonnementen worden weergegeven door exemplaren van klasse Subscription.

het verstrekken van VAPID-sleutels

vertrouwen in het webpush-ecosysteem dat voldoet aan de normen wordt afgedwongen door het gebruik van VAPID-sleutels. Je server heeft een VAPID sleutelpaar nodig zodat hij zichzelf kan authenticeren aan browsers. De publieke sleutel moet worden blootgesteld via een API-eindpunt.

u kunt een VAPID key set aanmaken met het web-push pakket:

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

genereer sleutels voor uw systeem en bewaar ze op een blijvende locatie. Voeg een API-eindpunt toe zodat uw client-side JavaScript de publieke sleutel kan ophalen. Dit wordt gebruikt om het push-abonnement van de browser in te stellen. Het apparaat van de gebruiker zal inkomende push gebeurtenissen accepteren als ze zijn ondertekend met behulp van de bijbehorende VAPID private sleutel.

Push-abonnementen registreren

de volgende stap in de reeks is het ontvangen van push-abonnementen van uw klanten. Zodra de browser een nieuw push-abonnement heeft bevestigd, moet uw JavaScript de endpoint-URL van het abonnement en de bijbehorende authenticatiesleutels naar uw server sturen. Sla deze gegevens op naast de ID van de gebruiker, zodat u alle push-ingeschreven apparaten die zijn gekoppeld aan de gebruiker later kunt ophalen.

advertentie

we laten codevoorbeelden voor deze stap weg omdat de implementatie afhankelijk is van uw gegevensopslaglaag en de waarden die uw JavaScript verzendt. Gewoonlijk zal dit een JSON representatie zijn van een PushSubscription object. Je hebt een eenvoudige set van database-backed CRUD API-eindpunten nodig om een abonnement te maken, een bestaand abonnement te vervangen en een verwijdering aan te vragen wanneer de gebruiker zich afmeldt.

abonnementen voorbereiden

zodra een client succesvol is geregistreerd, kunt u meldingen versturen via de web-push – bibliotheek. Begin met het aanmaken van een instantie van de WebPush klasse:

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

u kunt één WebPush – instantie opnieuw gebruiken telkens wanneer u een melding verzendt. De bibliotheek moet worden geconfigureerd met de VAPID key set die je eerder hebt gegenereerd. Sleutels moeten gecodeerd worden als Base64 maar dit wordt voor je afgehandeld als je ze aanmaakt met de library.

de VAPID subject wordt gebruikt om uw server en zijn contactgegevens te identificeren. U kunt een website-URL of een mailto: e-mailadres link opgeven.

vervolgens moet u het push-abonnement ophalen waarnaar u wilt verzenden. Gebruik uw systeem voor gegevenstoegang om de push-endpoint-URL ‘ s op te zoeken die zijn gekoppeld aan de gebruiker waarnaar u wilt verzenden. Converteer elk abonnement naar een Subscription instance:

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

de eigenschap auth van de PushSubscription wordt tweemaal herhaald om twee verschillende versies van de specificaties te kunnen verwerken die door browserdiensten worden gebruikt. De p256dh eigenschap is een andere publieke sleutel die moet worden geleverd wanneer ingesteld op het abonnement.

de web-push bibliotheek is compatibel met Chrome en Firefox push-eindpunten. Het zal ook werken met elke andere Web Push implementatie die voldoet aan de huidige standaard.

een notificatie verzenden

combineer nu uw WebPush en Subscription instanties om een notificatie te verzenden:

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

het oproepen van sendOneNotification() biedt onmiddellijke levering voor een enkele melding. De lading in dit geval is een JSON-gecodeerde array met twee eigenschappen. Het is aan u welke gegevens u verzendt en het formaat dat u gebruikt – uw JavaScript-client ontvangt het zoals het is en kan het zo nodig interpreteren.

het verzenden van een notificatie geeft een resultaatklasse terug waarmee u kunt controleren of de bewerking is geslaagd:

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

u kunt actie ondernemen om de levering opnieuw te proberen of te annuleren als er een fout optreedt.

advertentie

Aanmeldingsabonnementen kunnen ook verlopen. Bel de isSubscriptionExpired() methode op een resultaatklasse om te bepalen of dit de reden is voor de fout. U kunt het abonnement uit uw database verwijderen in dit scenario, zodat u niets anders naar een dood eindpunt stuurt.

Batchingmeldingen

meldingen kunnen worden samengevoegd voor levering met één methodeaanroep:

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

dit is handig als je weet dat je een groot aantal meldingen in een korte tijd zal verzenden. Wacht al uw payloads in de rij en laat web-push ze op de optimale manier leveren.

u kunt het aantal meldingen dat in een enkele flush() wordt verzonden, beperken door een geheel getal door te geven aan de methode:

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

de standaardwaarde is 1000.

Notificatieopties

sendOneNotification() en queueNotification() accepteren de volgende opties als derde array-argument:

  • TTL – bepaalt hoe lang het meldingsplatform van de browser de melding vasthoudt als deze niet onmiddellijk aan het apparaat van de gebruiker kan worden doorgegeven. Als het apparaat van de gebruiker offline is, proberen platforms het standaard te leveren voor de komende vier weken. Als je volgende week een melding verstuurt die niet relevant is, pas dan de TTL aan zodat de gebruiker geen verouderde content ziet.
  • urgency – accepteert normal, low of very-low als waarden. Sommige platforms kunnen dit gebruiken om de frequentie van de kennisgeving levering aan te passen. Apparaten die een batterijbesparingsmodus gebruiken, kunnen de levering van niet-dringende meldingen opschorten.
  • batchSize – dit heeft hetzelfde effect als het hierboven beschreven argument voor flush().

u kunt standaard optiewaarden configureren met behulp van het tweede argument van de WebPush constructor:

$webPush = new WebPush(], );

samenvatting

de web-push bibliotheek maakt het eenvoudig om Web pushmeldingen te versturen met PHP. Je krijgt een abstractielaag bovenop de verschillende browserplatforms die batching, foutafhandeling en Alle Web Push-functies ondersteunt.

advertentie

het web Push-mechanisme is een ongewoon browsersysteem omdat het afhankelijk is van externe server-side componenten die u zelf levert. Dit kan het ondoorzichtig en technisch lijken. In de praktijk, het maken van een eenvoudige PHP backend is snel en eenvoudig; de frontend implementatie is meestal de meer tijdrovende aspect, vooral als je niet al gebruik maken van service worker functies.

Leave a Reply