Come inviare notifiche push Web con PHP

PHP Logo

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

Prerequisiti

Ai fini di questo tutorial, assumeremo che tu abbia familiarità con le basi della creazione di API HTTP in PHP. Dovrai esporre alcuni endpoint pubblici utilizzando il tuo framework Web. Questi saranno chiamati dal tuo JavaScript nel browser per registrare e annullare la registrazione dei dispositivi.

Questo articolo non tocca il codice lato browser o come funziona. Avrai bisogno di mettere insieme un operatore di servizio che risponde agli eventi push in arrivo e visualizza una notifica all’utente.

Ad un livello elevato, il flusso di spinta Web è simile a questo:

  1. Un abbonamento push è registrato nel browser. Il browser emette un URL endpoint univoco per il tuo JavaScript.
  2. Il tuo JavaScript invia i dati di sottoscrizione al tuo server e identifica l’utente a cui si applica.
  3. Quando il backend deve inviare una notifica push, creare un payload e inviarlo all’URL dell’endpoint segnalato come parte dei dati di sottoscrizione.
  4. Il browser dell’utente riceverà il payload tramite la piattaforma di consegna delle notifiche del fornitore. Il tuo 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 da 1 a 3.

Ottenere l’installazione

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

Aggiungi il pacchetto al tuo progetto usando Composer:

composer require minishlink/web-push
Annuncio pubblicitario

Per utilizzare l’ultima versione, è necessario PHP 7.2 o superiore con il gmp, mbstring, curl, e openssl estensioni. Se è necessario utilizzare una versione PHP precedente, bloccare il pacchetto su una versione precedente per mantenere la compatibilità.

La libreria espone una classe core WebPush con metodi che consentono di inviare notifiche singolarmente o come batch. Le sottoscrizioni sono rappresentate da istanze della classe Subscription.

Fornire chiavi VAPID

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

È possibile generare un set di chiavi VAPID utilizzando il pacchetto 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));

Generare chiavi per il sistema e memorizzarle in una posizione persistente. Aggiungi un endpoint API in modo che il tuo JavaScript lato client possa recuperare la chiave pubblica. Questo verrà utilizzato per impostare 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 delle sottoscrizioni push

Il passaggio successivo nella sequenza è la ricezione delle richieste di sottoscrizione push dai client. 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 push collegati all’utente in seguito.

Pubblicità

Stiamo omettendo esempi di codice per questo passaggio in quanto 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 dal database per creare una sottoscrizione, sostituirne una esistente e richiedere l’eliminazione quando l’utente annulla l’iscrizione.

Preparazione delle sottoscrizioni

Una volta registrato un client, è possibile iniziare a inviare notifiche utilizzando la libreria web-push. Inizia creando un’istanza della classe WebPush :

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

È possibile riutilizzare un’istanza WebPush ogni volta che si invia 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 VAPID subject viene utilizzato per identificare il server e i suoi dettagli di contatto. È possibile fornire un URL del sito web o un link all’indirizzo e-mail mailto:.

Successivamente è necessario recuperare l’abbonamento push a cui verrà inviato. Utilizzare il sistema di accesso ai dati per cercare gli URL degli endpoint push associati all’utente a cui si desidera inviare. Converti ogni sottoscrizione in un’istanza Subscription :

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

Il auth proprietà del PushSubscription viene ripetuto due volte per far fronte a due diverse versioni delle specifiche utilizzate dai servizi del browser. La proprietà P256DH è un’altra chiave pubblica che deve essere fornita quando impostata sulla sottoscrizione.

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

l’Invio di una Notifica

Ora combinare la vostra WebPush e Subscription istanze per l’invio di una notifica:

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

Chiamata sendOneNotification() fornisce la consegna immediata per una singola notifica. Il payload in questo caso è un array con codifica JSON con due proprietà. Sta a te quali dati invii e il formato che usi: il tuo client JavaScript lo riceve così com’è e può interpretarlo se necessario.

l’Invio di una notifica restituisce un risultato di classe che permette di controllare se l’operazione è riuscita:

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

Si può prendere azione di riprovare o annullare la consegna se si verifica un errore.

Pubblicità

Le sottoscrizioni di notifica possono anche scadere. Chiamare il metodo isSubscriptionExpired() su una classe result per determinare se questo è il motivo dell’errore. In questo scenario, è possibile eliminare la sottoscrizione dal database, assicurandosi di non inviare altro a un punto morto.

Dosaggio Notifiche

Notifiche possono essere raggruppati insieme per la consegna con una chiamata al metodo:

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

Questo è utile quando sai che dovrai essere l’invio di un gran numero di notifiche in un breve lasso di tempo. Accoda tutti i tuoi payload e lascia che web-push li distribuisca nel modo ottimale.

È possibile limitare il numero di notifiche inviate in un unico flush() passando un intero per il metodo:

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

Il valore predefinito è 1000.

Opzioni di notifica

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

  • TTL – Controlla per quanto tempo la piattaforma di notifica del browser manterrà la notifica se non può essere passata immediatamente al dispositivo dell’utente. Se il dispositivo dell’utente è offline, le piattaforme di default cercano di consegnarlo per le prossime quattro settimane. Se stai inviando una notifica che non sarà rilevante la prossima settimana, regola il TTL di conseguenza in modo che l’utente non veda contenuti obsoleti.
  • urgency – Accetta normal, low o very-low come valori. Alcune piattaforme possono utilizzare questo per regolare la frequenza di consegna delle notifiche. I dispositivi che entrano in una modalità di risparmio della batteria possono sospendere la consegna di notifiche non urgenti.
  • batchSize – Questo ha lo stesso effetto dell’argomento flush() descritto sopra.

È possibile configurare i valori predefiniti delle opzioni utilizzando il secondo argomento della WebPush costruttore:

$webPush = new WebPush(], );

Sommario

Il web-push biblioteca rende più facile per inviare Web notifiche Push tramite PHP. Si ottiene un livello di astrazione in cima alle varie piattaforme del browser che supporta il batch, la gestione degli errori e tutte le funzionalità di Push Web.

Pubblicità

Il meccanismo Web Push è un sistema di browser insolito in quanto dipende da componenti remoti lato server forniti da soli. Questo può farlo sembrare opaco e tecnico. In pratica, la creazione di un semplice backend PHP è semplice e veloce; l’implementazione del frontend è di solito l’aspetto più dispendioso in termini di tempo, in particolare se non si utilizzano già le funzionalità di service worker.

Leave a Reply