Hoe te verzenden web push-notificaties met PHP –

Web Push API kunt u pushmeldingen naar webbrowsers en API ‘ s te sturen. Terwijl de meeste van de logica vindt plaats in de browser, moet u nog steeds een server-side component om uw meldingen te genereren. Hier is hoe je een web push backend kunt implementeren met PHP.

samenvatting

Voorwaarden

in deze handleiding gaan we ervan uit dat je de basis van het bouwen van HTTP API ‘ s in PHP kent. Je moet een paar publieke eindpunten blootstellen met behulp van je webinfrastructuur. Deze worden door het JavaScript van uw browser opgeroepen om apparaten te registreren en uit te schrijven.

dit artikel behandelt geen browser-side code of hoe het werkt. U moet een servicemedewerker instellen 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 opgeslagen in de browser. De browser stuurt een unieke endpoint URL naar uw JavaScript.
  2. uw JavaScript verzendt 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 provider. Uw JavaScript-dienstmedewerker behandelt de resulterende gebeurtenis en gebruikt de browser notification API om de gebruiker te waarschuwen.

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

configuratie ophalen

we zullen het web-push Packagiste pakket gebruiken via minishlink. Dit negeert interacties met elke browser kennisgeving platform, zodat je niet hoeft te handmatig onderscheid 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 versie van PHP moet gebruiken, moet je het pakket vergrendelen op een oudere versie om de compatibiliteit te behouden.

de bibliotheek toont een kernel WebPush klasse met methoden waarmee u meldingen afzonderlijk of in batches kunt verzenden. De abonnementen worden weergegeven door exemplaren van de classificatie Subscription.

geef VAPID-sleutels

het vertrouwen in het web push-ecosysteem dat voldoet aan de normen wordt versterkt door het gebruik van VAPID-sleutels. Je server heeft een VAPID sleutelpaar nodig om je te kunnen authenticeren met browsers. De publieke sleutel moet worden blootgesteld via een API-eindpunt.

u kunt een VAPID sleutelhanger aanmaken met behulp van de wrap web-push :

use MinishlinkWebPushVAPID; $ keyset = VAPID::createVapidKeys(); // public key - this needs to be accessible via an API endpointthrew out $ keyset; // private key - never expose this!threw out $ keyset; File_put_contents("vapid.json", json_encode($ keyset));

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

registratie van push-abonnementen

de volgende stap in de reeks is het ontvangen van push-abonnementsaanvragen van uw klanten. Nadat de browser een nieuw push-abonnement heeft bevestigd, moet uw JavaScript de URL van het eindpunt van het abonnement en de bijbehorende authenticatiesleutels naar uw server sturen. Sla deze gegevens op met de gebruikers-ID, zodat u eventuele push-geregistreerde apparaten die later aan de gebruiker zijn gekoppeld, kunt ophalen.

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

voorbereiding van abonnementen

zodra een klant succesvol is geregistreerd, kunt u meldingen versturen via de web-push bibliotheek. Begin met het maken van een instantie van de WebPush om te classificeren:

use MinishlinkWebPushWebPush; $ webPush = new WebPush(]);

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

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

dan moet je het push-abonnement pakken waarnaar je gaat verzenden. Gebruik uw systeem voor gegevenstoegang om de push-endpoint-URL ‘ s te vinden die zijn gekoppeld aan de gebruiker waarnaar u wilt verzenden. Converteer elk abonnement naar één Subscription voorbeeld:

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

de eigenschap auth van de PushSubscription wordt tweemaal herhaald om twee verschillende versies van de specificatie te behandelen die door browserdiensten worden gebruikt. De p256dh-eigenschap is een andere publieke sleutel die moet worden verstrekt wanneer deze is ingesteld op het abonnement.

de web-push de 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());

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

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

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

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

abonnementen op kennisgevingen kunnen eveneens vervallen. Bel de isSubscriptionExpired() 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, om ervoor te zorgen dat u niets anders naar een dood eindpunt stuurt.

Batchmeldingen

meldingen kunnen worden gegroepeerd om te worden afgeleverd met één methode:

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

dit is handig wanneer u weet dat u een groot aantal meldingen in een korte periode van tijd gaat verzenden. Zet al uw payloads in de rij en laat web-push deze optimaal leveren.

u kunt het aantal verzonden meldingen beperken in één flush() waarbij een geheel getal wordt doorgegeven aan de methode:

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

de standaardwaarde is 1000.

Notification options

sendOneNotification() et queueNotification() accepteer de volgende opties als het derde argument van de array:

  • TTL – bepaalt hoe lang het Browser meldingsplatform de melding bewaart als deze niet onmiddellijk op het apparaat van de gebruiker kan worden afgeleverd. Als het apparaat van de gebruiker offline is, zullen de platforms standaard proberen het voor de volgende vier weken af te leveren. Als u volgende week een melding verzendt die niet relevant is, pas dan de leeftijd aan zodat de gebruiker geen verouderde inhoud ziet.
  • urgency – accepteer normal, low ou very-low als waarden. Sommige platforms kunnen het gebruiken om de frequentie van de kennisgeving levering aan te passen. Apparaten die de batterijbesparingsmodus gebruiken, kunnen de levering van niet-dringende meldingen opschorten.
  • batchSize – dit heeft hetzelfde effect als het argument van flush() hierboven beschreven.

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

$ webPush = new WebPush(], );

samenvatting

de web-push bibliotheek maakt het eenvoudig om web pushmeldingen te versturen met PHP. Je krijgt een laag van abstractie op de top van de verschillende browser platforms die batchverwerking, foutafhandeling en alle web push functionaliteit ondersteunt.

het web push mechanisme is een ongebruikelijk browser systeem omdat het afhankelijk is van externe server-side componenten die u zelf verstrekt. Hierdoor kan het ondoorzichtig en technisch lijken. In de praktijk, het maken van een eenvoudige PHP backend is snel en eenvoudig; de front-end implementatie is meestal de meest tijdrovende aspect, vooral als je niet al met behulp van service worker functies.

Geef een antwoord

Het e-mailadres wordt niet gepubliceerd.