hur man skickar Web Push-meddelanden med PHP

PHP Logo

Web Push API kan du skicka push-meddelanden till webbläsare och API: er. Medan det mesta av logiken händer i webbläsaren behöver du fortfarande en komponent på serversidan för att generera dina aviseringar. Så här implementerar du en Web Push backend med PHP.

förutsättningar

i denna handledning antar vi att du är bekant med grunderna för att skapa HTTP API: er i PHP. Du måste exponera några offentliga slutpunkter med ditt webbramverk. Dessa anropas av ditt JavaScript i webbläsaren för att registrera och avregistrera enheter.

den här artikeln berör inte webbläsarens kod eller hur den fungerar. Du måste sätta ihop en servicearbetare som svarar på inkommande push-händelser och visar ett meddelande till användaren.

på en hög nivå ser Web Push-flödet ut så här:

  1. en push-prenumeration är registrerad i webbläsaren. Webbläsaren utfärdar en unik slutpunkts-URL till ditt JavaScript.
  2. JavaScript skickar prenumerationsdata till din server och identifierar användaren den gäller för.
  3. när din backend behöver skicka ett push-meddelande skapar du en nyttolast och skickar den till slutpunktsadressen som rapporteras som en del av prenumerationsdata.
  4. användarens webbläsare kommer att få nyttolasten via leverantörens meddelandeleveransplattform. Din JavaScript-servicearbetare hanterar den därmed följande händelsen och använder webbläsarens meddelande API för att varna användaren.

så här implementerar du serversidan aspekter av steg 1 till 3.

hämta Setup

vi använder paketet web-push Packagist av minishlink. Detta sammanfattar interaktionerna med varje webbläsarmeddelandeplattform så att du inte behöver skilja mellan slutpunktstyper manuellt.

Lägg till paketet i ditt projekt med Composer:

composer require minishlink/web-push
annons

för att använda den senaste versionen behöver du PHP 7.2 eller högre med gmp, mbstring, curl, och openssl tillägg. Om du måste använda en äldre PHP-version låser du paketet till en tidigare version för att behålla kompatibiliteten.

biblioteket exponerar en kärna WebPush klass med metoder som låter dig skicka meddelanden individuellt eller som partier. Prenumerationer representeras av instanser av klassen Subscription.

att tillhandahålla VAPID Keys

förtroende för det standardkompatibla Web Push-ekosystemet verkställs genom användning av VAPID keys. Din server behöver en fadd nyckelpar så att den kan autentisera sig till webbläsare. Den offentliga nyckeln ska exponeras via en API-slutpunkt.

du kan skapa en fadd nyckeluppsättning med paketet 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));

generera nycklar för ditt system och lagra dem på en beständig plats. Lägg till en API-slutpunkt så att JavaScript på klientsidan kan hämta den offentliga nyckeln. Detta kommer att användas för att ställa in webbläsarens push-prenumeration. Användarens enhet accepterar inkommande push-händelser om de har signerats med motsvarande VAPID privata nyckel.

registrera Push-Prenumerationer

nästa steg i sekvensen är att ta emot push-prenumerationsförfrågningar från dina kunder. När webbläsaren har bekräftat en ny push-prenumeration ska JavaScript skicka prenumerationens slutpunktsadress och tillhörande autentiseringsnycklar till din server. Lagra dessa uppgifter tillsammans med användarens ID så att du kan hämta alla push-inskrivna enheter kopplade till användaren senare.

annons

vi utelämnar kodprover för detta steg eftersom implementeringen beror på ditt datalagringslager och de värden som JavaScript skickar upp. Vanligtvis kommer detta att vara en JSON-representation av ett PushSubscription – objekt. Du behöver en enkel uppsättning DATABASSTÖDDA CRUD API-slutpunkter för att skapa en prenumeration, ersätta en befintlig och begära en radering när användaren avslutar prenumerationen.

förbereda Prenumerationer

när en klient har registrerats kan du börja skicka aviseringar med biblioteket web-push. Börja med att skapa en instans av klassen WebPush :

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

du kan återanvända en WebPush – instans varje gång du skickar ett meddelande. Biblioteket måste konfigureras med VAPID nyckeluppsättning du genererade tidigare. Nycklar ska kodas som Base64 men detta hanteras för dig om du skapar dem med biblioteket.

VAPID subject används för att identifiera din server och dess kontaktuppgifter. Du kan ange en webbadress eller en mailto: e-postadress länk.

nästa måste du hämta push-prenumerationen du skickar till. Använd ditt dataåtkomstsystem för att slå upp de push-slutpunkts-URL: er som är associerade med användaren du vill skicka till. Konvertera varje prenumeration till en Subscription instans:

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

egenskapen auth för PushSubscription upprepas två gånger för att klara två olika versioner av spec som används av webbläsartjänster. P256dh-egenskapen är en annan offentlig nyckel som ska levereras när den är inställd på prenumerationen.

web-push biblioteket är kompatibelt med Chrome och Firefox push endpoints. Det kommer också att fungera med någon annan Web Push-implementering som uppfyller den nuvarande standarden.

skicka ett meddelande

kombinera nu dina WebPush och Subscription instanser för att skicka ett meddelande:

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

ringa sendOneNotification() ger omedelbar leverans för en enda anmälan. Nyttolasten i detta fall är en JSON-kodad array med två egenskaper. Det är upp till dig vilka data du skickar och vilket format du använder – din JavaScript-klient tar emot den som den är och kan tolka den efter behov.

skicka ett meddelande returnerar en resultatklass som låter dig kontrollera om åtgärden lyckades:

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

du kan vidta åtgärder för att försöka eller avbryta leveransen om ett fel uppstår.

annons

Anmälningsprenumerationer kan också löpa ut. Ring isSubscriptionExpired() – metoden på en resultatklass för att avgöra om detta är orsaken till felet. Du kan ta bort prenumerationen från din databas i det här scenariot, så att du inte skickar något annat till en återvändsgränd.

Batching Notifications

meddelanden kan satsas tillsammans för leverans med ett metodsamtal:

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

detta är användbart när du vet att du kommer att skicka ett stort antal meddelanden inom en kort tidsram. Köa alla dina nyttolaster och låt web-push leverera dem på optimalt sätt.

du kan begränsa antalet meddelanden som skickas i en enda flush() genom att skicka ett heltal till metoden:

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

Standardvärdet är 1000.

anmälningsalternativ

sendOneNotification() och queueNotification() acceptera följande alternativ som ett tredje arrayargument:

  • TTL – styr hur länge webbläsarens anmälningsplattform kommer att hålla fast vid meddelandet om det inte kan skickas till användarens enhet omedelbart. Om användarens enhet är offline, plattformar standard för att försöka leverera den för de kommande fyra veckorna. Om du skickar ett meddelande som inte kommer att vara relevant nästa vecka, justera TTL så att användaren inte ser föråldrat innehåll.
  • urgency – accepterar normal, low eller very-low som värden. Vissa plattformar kan använda detta för att justera frekvensen för leverans av meddelanden. Enheter som går in i ett batterisparläge kan avbryta leveransen av icke-brådskande meddelanden.
  • batchSize – detta har samma effekt som argumentet till flush() som beskrivs ovan.

du kan konfigurera standardalternativ värden med det andra argumentet till WebPush konstruktören:

$webPush = new WebPush(], );

sammanfattning

web-push biblioteket gör det enkelt att skicka webb-Push-meddelanden med PHP. Du får ett abstraktionslager ovanpå de olika webbläsarplattformarna som stöder batching, felhantering och alla Web Push-funktioner.

annons

Webbtryckmekanismen är ett ovanligt webbläsarsystem eftersom det är beroende av komponenter på fjärrserversidan som du levererar själv. Detta kan göra att det verkar ogenomskinligt och tekniskt. I praktiken är det snabbt och enkelt att skapa en enkel PHP-backend; frontend-implementeringen är vanligtvis den mer tidskrävande aspekten, särskilt om du inte redan använder service worker-funktioner.

Leave a Reply