Hur man skickar webb Push -aviseringar med PHP

0
158

Med Web Push API kan du skicka push -aviseringar 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.

Förkunskaper

För denna handledning antar vi att du ’ 8217; känner igen grunderna för att skapa HTTP -API: er i PHP. Du kommer att behöva avslöja några offentliga slutpunkter med ditt webbramverk. Dessa kommer att kallas av din JavaScript i webbläsaren för att registrera och avregistrera enheter.

Den här artikeln kommer inte att beröra koden på webbläsaren 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. Ditt JavaScript skickar prenumerationsdata till din server och identifierar användaren som det gäller.
  3. När din backend måste skicka en push avisering, skapa en nyttolast och skicka den till slutpunktens webbadress som rapporteras som en del av prenumerationsdata.
  4. Användarens webbläsare kommer att ta emot nyttolasten via leverantörens plattform för avisering av aviseringar. Din JavaScript-tjänsteman hanterar den påföljande händelsen och använder webbläsarens meddelande-API för att varna användaren.

Så här implementerar du aspekterna på serversidan av steg 1 till 3.

Komma igång

Vi kommer att använda paketet web-push Packagist från minishlink. Detta abstraherar interaktionerna med varje webbläsaraviseringsplattform så att du inte behöver manuellt skilja mellan slutpunktstyper.

Lägg till paketet i ditt projekt med Composer:

composer kräver minishlink/web-push Annonsering

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

Biblioteket avslöjar en kärn WebPush -klass med metoder som låter dig skicka aviseringar individuellt eller som grupper. Prenumerationer representeras av förekomster av prenumerationsklassen.

Tillhandahålla VAPID-nycklar

Förtroendet för det standard-kompatibla Web Push-ekosystemet upprätthålls genom användning av VAPID -nycklar. Din server behöver ett VAPID -nyckelpar så att den kan autentisera sig själv i webbläsare. Den offentliga nyckeln ska exponeras via en API-slutpunkt.

Du kan generera en VAPID-nyckeluppsättning med webb-push-paketet:

använd Minishlink WebPush VAPID; & nbsp; $ keyset = VAPID :: createVapidKeys ( &#41 ;; & nbsp; //offentlig nyckel – detta måste vara tillgängligt via ett API -slutpunkt echo $ keyset [ & quot; publicKey & quot; &#93 ;; & nbsp; //privat nyckel – avslöj aldrig detta! echo $ keyset [ & quot; privateKey & quot; &#93 ;; & nbsp; file_put_contents ( & quot; vapid.json & quot ;, json_encode ( $ keyset ) &#41 ;;

Generera nycklar för ditt system och lagra dem på en ihållande plats. Lägg till en API-slutpunkt så att ditt 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-privatnyckel.

Registrera Push-prenumerationer

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

Annonsering

Vi utelämnar kodprover för detta steg eftersom implementeringen beror på ditt datalagringslager och de värden som din JavaScript skickar upp. Vanligtvis är detta 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 radering när användaren avslutar prenumerationen.

Förbereda prenumerationer

När en klient har registrerat sig kan du börja skicka aviseringar med webb-push-biblioteket. Börja med att skapa en instans av WebPush -klassen:

använd Minishlink WebPush WebPush; & nbsp; $ webPush = nytt WebPush ( [ & quot; VAPID & quot; = & gt; [ & quot; ämne & quot; = & gt; & quot; https: //exempel.com&quot ;, & quot; publicKey & quot; = & gt; & quot; VAPID_Public_Key_Here & quot ;, & quot; privateKey & quot; = & gt; & quot; VAPID_Private_Key_Here & quot; ] ] &#41 ;;

Du kan återanvända en WebPush -instans varje gång du skickar ett meddelande. Biblioteket måste konfigureras med den VAPID -nyckeluppsättning du skapade tidigare. Nycklar ska vara kodade som Base64 men detta hanteras åt dig om du skapar dem med biblioteket.

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

Därefter måste du hämta push -prenumerationen som du skickar till. Använd ditt dataåtkomstsystem för att leta upp URL -adresserna för push -slutpunkter som är associerade med den användare du vill skicka till. Konvertera varje prenumeration till en prenumerationsinstans:

använd Minishlink WebPush Subscription; & nbsp; //Skaffa användarens push -data … //VÄLJ * FRÅN push_subscriptions WHERE user_id = 123456 & nbsp; $ prenumeration = Prenumeration :: skapa ( [ & quot; slutpunkt & quot; = & gt; & quot; https: //fcm.google.com/…&quot ;, & quot; contentEncoding & quot; = & gt; & quot; aesgcm & quot ;, & quot; authToken & quot; = & gt; & quot; & lt; auth -token från JavaScript PushSubscription -objekt & gt; & quot; & quot; nycklar & quot; = & gt; [ & quot; auth & quot; = & gt; & quot; & lt; auth -token från JavaScript PushSubscription -objekt & gt; & quot ;, & quot; p256dh & quot; = & gt; & quot; & lt; p256dh -token från JavaScript PushSubscription -objekt & gt; & quot; ] ] &#41 ;; Annons

Push -prenumerationens autentiska egenskap 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 bör tillhandahållas när den är inställd på prenumerationen.

Web-push-biblioteket är kompatibelt med Chrome och Firefox push-slutpunkter. Det fungerar också med alla andra Web Push-implementeringar som uppfyller den nuvarande standarden.

Skicka ett meddelande

Kombinera nu din WebPush och Prenumerationsinstanser för att skicka ett meddelande:

$ result = $ webPush -& gt; sendOneNotification ( $ prenumeration, json_encode ( [ & quot; meddelande & quot; = & gt; & quot; Demomeddelande & quot ;, & quot; foo & quot; = & gt; & quot; bar & quot; ] ) &#41 ;;

Ringa sendOneNotification () ger omedelbar leverans för en enda avisering. Nyttolasten i det här fallet är en JSON-kodad array med två egenskaper. Det är upp till dig vilken 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 operationen lyckades:

om ( $ resultat -& gt; isSuccess ( ) ) { //allt bra } annars { & nbsp; //något gick fel error_log ( $ resultat -& gt; getReason ( ) &#41 ;; & nbsp; //ger rå HTTP -svarsdata error_log ( $ resultat -& gt; getResponse ( ) &#41 ;; & nbsp; }

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

Annonsering

Anmälningsabonnemang kan också löpa ut. Anropa metoden 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 slutpunkt.

Batching Notifications

Meddelanden kan satsas ihop för leverans med ett metodsamtal:

$ webPush -& gt; queueNotification ( $ prenumeration, [ & quot; msg & quot; = & gt; & quot; först & quot; ] &#41 ;; $ webPush -& gt; queueNotification ( $ prenumeration, [ & quot; msg & quot; = & gt; & quot; andra & quot; ] &#41 ;; & nbsp; för varje ( $ webPush -& gt; spola ( ) som $ i = & gt; $ resultat ) { echo ( & quot; Meddelande $ i was & quot; . ( $ resultat -& gt; isSuccess ( ) ? & quot; skickat & quot; : & quot; inte skickat & quot; ) &#41 ;; }

Detta är användbart när du vet att du kommer att skicka ett stort antal aviseringar inom en kort tidsram. Kö alla dina nyttolaster och låt web-push leverera dem på det bästa sättet.

Du kan begränsa antalet aviseringar som skickas i en enda spolning () genom att skicka ett heltal till metoden:

$ webPush -& gt; spola ( 100 &#41 ;; //skicka 100 meddelanden

Standardvärdet är 1000.

Meddelandealternativ

sendOneNotification () och queueNotification () accepterar följande alternativ som en tredje matrisargument:

  • TTL – Kontrollerar hur länge webbläsarens aviseringsplattform kommer att hålla kvar meddelandet om det inte kan överföras till användarens enhet omedelbart. Om användarens enhet är offline är plattformarna standard för att försöka leverera den under de kommande fyra veckorna. Om du skickar ett meddelande som inte kommer att vara relevant nästa vecka, justera TTL i enlighet med detta så att användaren inte ser föråldrat innehåll.
  • brådskande – Accepterar normala, låga eller mycket låga som värden. Vissa plattformar kan använda detta för att justera frekvensen för aviseringar. Enheter som går in i ett batterisparläge kan avbryta leveransen av icke-brådskande aviseringar.
  • batchSize – Detta har samma effekt som argumentet att spola () som beskrivs ovan.

Du kan konfigurera standardalternativvärden med det andra argumentet till WebPush -konstruktören:

$ webPush = new WebPush & #40; [ & quot; VAPID & quot; = & gt; [ … ] &#93 ;, [ & quot; TTL & quot; = & gt; 3600 ] &#41 ;;

Sammanfattning

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

Annonsering

Web Push -mekanismen är ett ovanligt webbläsarsystem eftersom det är beroende av på fjärranslutna serversidor som du själv tillhandahåller. Detta kan få det att verka 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 servicearbetarfunktioner.