Hur man skickar web push-meddelanden med PHP –

Web Push API kan du skicka push-meddelanden till webbläsare och API: er. Medan det mesta av logiken sker 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.

sammanfattning

förutsättningar

i denna handledning antar vi att du känner till grunderna för att bygga HTTP API i PHP. Du måste exponera några offentliga slutpunkter med din webbinfrastruktur. Dessa anropas av din webbläsares JavaScript för att registrera och avregistrera enheter.

den här artikeln kommer inte att täcka webbläsarkod eller hur den fungerar. Du måste ställa in 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 sparas i webbläsaren. Webbläsaren skickar en unik slutpunkts-URL till ditt JavaScript.
  2. JavaScript skickar prenumerationsdata till din server och identifierar användaren som den gäller.
  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 resulterande 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 konfiguration

vi kommer att använda paketet web-push Packagiste av minishlink. Detta bortser från interaktioner 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

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 version av PHP låser du paketet till en äldre version för att behålla kompatibiliteten.

biblioteket exponerar en kärna WebPush – klass med metoder som låter dig skicka meddelanden individuellt eller i satser. Prenumerationerna representeras av instanser av Subscription klassificera.

ge VAPID keys

förtroendet för det standardkompatibla web push-ekosystemet förbättras genom användning av VAPID keys. Din server behöver en fadd nyckelpar för att kunna autentisera med webbläsare. Den offentliga nyckeln måste exponeras via en API-slutpunkt.

du kan skapa en fadd nyckelring med hjälp av web-push wrap:

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

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 konfigurera webbläsarens push-prenumeration. Användarens enhet accepterar inkommande push-händelser om de har signerats med motsvarande VAPID privata nyckel.

registrering av 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 webbadressen till prenumerationsslutpunkten och tillhörande autentiseringsnycklar till din server. Lagra dessa uppgifter med användar-ID så att du kan hämta alla push inskrivna enheter kopplade till användaren senare.

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

förberedelse av prenumerationer

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

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

du kan återanvända en WebPush – instans varje gång du skickar ett meddelande. Biblioteket måste konfigureras med VAPID nyckelring som du genererade tidigare. Nycklarna måste vara Base64 kodad, 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.

då måste du ta tag i push-prenumerationen du ska skicka till. Använd ditt dataåtkomstsystem för att hitta de push-slutpunkts-URL: er som är associerade med användaren du vill skicka till. Konvertera varje prenumeration till ett Subscription exempel:

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

egenskapen auth för PushSubscription upprepas två gånger för att hantera två olika versioner av specifikationen som används av webbläsartjänster. Egenskapen P256DH är en annan offentlig nyckel som måste tillhandahållas 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 et Subscription instanser för att skicka ett meddelande:

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

Appel 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.

prenumerationer på aviseringar kan också upphöra att gälla. Ring isSubscriptionExpired() 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 och se till att du inte skickar något annat till en återvändsgränd.

Batch meddelanden

meddelanden kan grupperas tillsammans för att levereras med en enda metod samtal:

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

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

du kan begränsa antalet meddelanden som skickas i en flush() som skickar ett heltal till metoden:

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

Standardvärdet är 1000.

anmälningsalternativ

sendOneNotification() et queueNotification() acceptera följande alternativ som det tredje argumentet i arrayen:

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

du kan konfigurera standardalternativvärdena med det andra argumentet från tillverkaren WebPush :

$ webPush = new WebPush(], );

sammanfattning

web-push biblioteket gör det enkelt att skicka webb push-meddelanden med PHP. Du får ett lager av abstraktion ovanpå de olika webbläsarplattformarna som stöder batchbehandling, felhantering och all web push-funktionalitet.

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

Lämna ett svar

Din e-postadress kommer inte publiceras.