Come inviare notifiche push Web con PHP

0
1055

L'API Web Push consente di inviare notifiche push a browser Web e API. Sebbene la maggior parte della logica avvenga nel browser, è comunque necessario un componente lato server per generare le notifiche. Ecco come implementare un backend Web Push utilizzando PHP.

Prerequisiti

Per gli scopi di questo tutorial, supponiamo che tu sia 8217; hai familiarità con le basi della creazione di API HTTP in PHP. Dovrai esporre alcuni endpoint pubblici utilizzando il tuo framework web. Questi verranno chiamati dal tuo JavaScript nel browser per registrare e annullare la registrazione dei dispositivi.

Questo articolo non toccherà il codice lato browser o il suo funzionamento. Dovrai creare un addetto all'assistenza che risponda agli eventi push in arrivo e mostri una notifica all'utente.

Ad un livello più alto, il flusso Web Push ha questo aspetto:

  1. Nel browser è registrata una sottoscrizione push. Il browser invia un URL endpoint univoco al tuo JavaScript.
  2. Il tuo JavaScript invia i dati di abbonamento al tuo server e identifica l'utente a cui si applica.
  3. Quando il tuo backend deve inviare un push notifica, creare un payload e inviarlo all'URL dell'endpoint riportato come parte dei dati dell'abbonamento.
  4. Il browser dell'utente riceverà il payload tramite la piattaforma di consegna delle notifiche del fornitore. L'operatore del servizio JavaScript gestisce l'evento conseguente e utilizza l'API di notifica del browser per avvisare l'utente.

Ecco come implementare gli aspetti lato server dei passaggi 1 a 3.

Preparazione

Utilizzeremo il pacchetto Web-push Packagist di minishlink. Questo astrae le interazioni con ciascuna piattaforma di notifica del browser in modo da non dover distinguere manualmente tra i tipi di endpoint.

Aggiungi il pacchetto al tuo progetto utilizzando Composer:

il compositore richiede minishlink/web-push Advertisement

Per utilizzare l'ultima versione, hai bisogno di PHP 7.2 o successivo con le estensioni gmp, mbstring, curl e openssl . Se devi utilizzare una versione precedente di PHP, blocca il pacchetto su una versione precedente per mantenere la compatibilità.

La libreria espone una classe WebPush principale con metodi che consentono di inviare notifiche singolarmente o in batch. Gli abbonamenti sono rappresentati da istanze della classe Abbonamento.

Fornire chiavi VAPID

La fiducia nell'ecosistema Web Push conforme agli standard viene rafforzata attraverso l'uso di chiavi VAPID. Il tuo server ha bisogno di una coppia di chiavi VAPID in modo che possa autenticarsi nei browser. La chiave pubblica deve essere esposta tramite un endpoint API.

Puoi generare un set di chiavi VAPID utilizzando il pacchetto web-push:

usa MinishlinkWebPushVAPID;   $keyset = VAPID::createVapidKeys();   //chiave pubblica: deve essere accessibile tramite un endpoint API echo $keyset["publicKey"];   //chiave privata – non esporla mai! echo $keyset["privateKey"];   file_put_contents("vapid.json", json_encode($keyset));

Genera chiavi per il tuo sistema e archiviale in una posizione permanente. Aggiungi un endpoint API in modo che il tuo JavaScript lato client possa recuperare la chiave pubblica. Questo verrà utilizzato per configurare l'abbonamento push del browser. Il dispositivo dell'utente accetterà gli eventi push in arrivo se sono stati firmati utilizzando la chiave privata VAPID corrispondente.

Registrazione di iscrizioni push

Il prossimo passo nella sequenza è ricevere richieste di abbonamento push dai tuoi clienti. Una volta che il browser ha confermato una nuova sottoscrizione push, il tuo JavaScript dovrebbe inviare l'URL dell'endpoint della sottoscrizione e le chiavi di autenticazione associate al tuo server. Memorizza questi dettagli insieme all'ID dell'utente in modo da poter recuperare tutti i dispositivi registrati tramite push collegati all'utente in un secondo momento.

Annuncio

Stiamo omettendo gli esempi di codice per questo passaggio poiché l'implementazione dipende dal livello di archiviazione dei dati e dai valori inviati da JavaScript. In genere, questa sarà una rappresentazione JSON di un oggetto PushSubscription. È necessario un semplice set di endpoint API CRUD supportati da database per creare un abbonamento, sostituirne uno esistente e richiedere l'eliminazione quando l'utente annulla l'iscrizione.

Preparazione degli abbonamenti

Una volta che un cliente si è registrato con successo, puoi iniziare a inviare notifiche utilizzando la libreria web-push. Inizia creando un'istanza della classe WebPush:

usa MinishlinkWebPushWebPush;   $webPush = nuovo WebPush([ "VAPIDO" => [ "soggetto" => "https://example.com", "chiave pubblica" => "VAPID_Public_Key_Here", "privateKey" => "VAPID_Private_Key_Qui" ] ]);

Puoi riutilizzare un'istanza WebPush ogni volta che invii una notifica. La libreria deve essere configurata con il set di chiavi VAPID generato in precedenza. Le chiavi dovrebbero essere codificate come Base64 ma questo viene gestito per te se le crei con la libreria.

Il soggetto VAPID viene utilizzato per identificare il tuo server e i suoi dettagli di contatto. Puoi fornire l'URL di un sito web o un mailto: link all'indirizzo email.

Successivamente devi recuperare l'abbonamento push a cui invierai. Utilizza il tuo sistema di accesso ai dati per cercare gli URL dell'endpoint push associati all'utente a cui desideri inviare i dati. Converti ogni abbonamento in un'istanza di abbonamento:

usa MinishlinkWebPushSubscription;   //Ottieni i dati push dell'utente… //SELECT * FROM push_subscriptions WHERE user_id = 123456   $subscription = Abbonamento::create([ "endpoint" => "https://fcm.google.com/…", "contentEncoding" => "aesgcm", "authToken" => "<token di autenticazione dall'oggetto JavaScript PushSubscription>" "chiavi" => [ "autorizzazione" => "<token di autenticazione dall'oggetto JavaScript PushSubscription>", "p256dh" => "<p256dh token dall'oggetto JavaScript PushSubscription>" ] ]); Pubblicità

La proprietà auth di PushSubscription viene ripetuta due volte per far fronte a due diverse versioni delle specifiche utilizzate dai servizi browser. La proprietà P256DH è un'altra chiave pubblica che dovrebbe essere fornita quando impostata sull'abbonamento.

La libreria push web è compatibile con gli endpoint push di Chrome e Firefox. Funzionerà anche con qualsiasi altra implementazione Web Push che soddisfi lo standard attuale.

Invio di una notifica

Ora combina il tuo WebPush e Istanze di abbonamento per inviare una notifica:

$risultato = $webPush -> sendOneNotifica( $subscription, json_encode([ "messaggio" => "Notifica demo", "pippo" => "bar" ]) );

La chiamata a sendOneNotification() fornisce la consegna immediata per una singola notifica. Il payload in questo caso è un array con codifica JSON con due proprietà. Dipende da te quali dati invii e il formato che utilizzi – il tuo client JavaScript lo riceve così com'è e può interpretarlo secondo necessità.

L'invio di una notifica restituisce una classe di risultati che ti consente di verificare se l'operazione è riuscita:

se ($risultato -> isSuccess()) { //tutto bene } altrimenti {   //qualcosa è andato storto error_log($result -> getReason());   //fornisce dati di risposta HTTP non elaborati error_log($result -> getResponse());   }

Puoi agire per riprovare o annullare la consegna se si verifica un errore.

Annuncio

Anche gli abbonamenti alle notifiche possono scadere. Chiama il metodo isSubscriptionExpired() su una classe di risultati per determinare se questo è il motivo dell'errore. In questo scenario potresti eliminare l'abbonamento dal tuo database, assicurandoti di non inviare nient'altro a un endpoint morto.

Notifiche batch

Le notifiche possono essere raggruppate insieme per la consegna con una chiamata al metodo:

$webPush -> queueNotification($subscription, ["msg" => "primo"]); $webPush -> queueNotification($subscription, ["msg" => "secondo"]);   per ogni ($webPush -> a filo() come $i => $risultato) { echo ("Notifica $i era " . ($risultato -> isSuccess() ? "inviato" : "non inviato")); }

Questo è utile quando sai che invierai un numero elevato di notifiche in un breve lasso di tempo. Metti in coda tutti i tuoi payload e lascia che il web-push li consegni in modo ottimale.

Puoi limitare il numero di notifiche inviate in un singolo flush() passando un numero intero al metodo:

$webPush -> a filo(100); //invia 100 messaggi

Il valore predefinito è 1000.

Opzioni di notifica

sendOneNotification() e queueNotification() accettano le seguenti opzioni come terzo argomento dell'array:

  • TTL– Controlla per quanto tempo la piattaforma di notifica del browser conserva la notifica se non può essere trasferita immediatamente al dispositivo dell'utente. Se il dispositivo dell'utente è offline, le piattaforme per impostazione predefinita tentano di consegnarlo per le prossime quattro settimane. Se invii una notifica che non sarà pertinente la prossima settimana, modifica il TTL di conseguenza in modo che l'utente non veda contenuti obsoleti.
  • urgenza– Accetta come valori normali, bassi o molto bassi. Alcune piattaforme potrebbero utilizzarlo per regolare la frequenza di consegna delle notifiche. I dispositivi che attivano una modalità di risparmio della batteria possono sospendere l'invio di notifiche non urgenti.
  • batchSize – Questo ha lo stesso effetto dell'argomento flush() descritto sopra.

Puoi configurare i valori delle opzioni predefinite usando il secondo argomento del costruttore WebPush:

$webPush = new WebPush& #40;["VAPIDO" => […]], ["TTL" => 3600]);

Riepilogo

La libreria web-push semplifica l'invio di notifiche web push utilizzando PHP. Ottieni un livello di astrazione in cima alle varie piattaforme del browser che supporta il batch, la gestione degli errori e tutte le funzionalità di Web Push.

Pubblicità

Il meccanismo di Web Push è un sistema browser insolito in quanto dipende sui componenti lato server remoti forniti dall'utente. Questo può farlo sembrare opaco e tecnico. In pratica, creare un semplice backend PHP è facile e veloce; l'implementazione del frontend è di solito l'aspetto che richiede più tempo, in particolare se non stai già utilizzando le funzionalità degli operatori di servizio.