Cómo enviar notificaciones push web con PHP –

La API Web Push le permite enviar notificaciones push a navegadores web y API. Si bien la mayor parte de la lógica tiene lugar en el navegador, aún necesita un componente del lado del servidor para generar sus notificaciones. Aquí está cómo implementar un backend de inserción web usando PHP.

Resumen

Precondiciones

A los efectos de este tutorial, asumiremos que conoce los conceptos básicos de la creación de API HTTP en PHP. Tendrá que exponer algunos puntos de conexión públicos utilizando su infraestructura web. Estos serán llamados por el JavaScript de su navegador para registrar y cancelar el registro de dispositivos.

Este artículo no cubre el código del lado del navegador ni cómo funciona. Deberá configurar un trabajador de servicio que responda a los eventos de inserción entrantes y muestre una notificación al usuario.

En un nivel alto, el flujo de inserción de banda se ve así:

  1. Se guarda una suscripción push en el navegador. El navegador envía una URL de punto final única a su JavaScript.
  2. Su JavaScript envía datos de suscripción a su servidor e identifica al usuario al que se aplica.
  3. Cuando el backend necesite enviar una notificación push, cree una carga útil y envíela a la URL del endpoint reportada como parte de los datos de suscripción.
  4. El navegador del usuario recibirá la carga útil a través de la plataforma de entrega de notificaciones del proveedor. El trabajador de servicio de JavaScript maneja el evento resultante y utiliza la API de notificaciones del navegador para alertar al usuario.

Aquí se explica cómo implementar los aspectos del lado del servidor de los pasos 1 a 3.

Get configuration

Usaremos el paquete web-push Packagiste de minishlink. Esto no tiene en cuenta las interacciones con cada plataforma de notificaciones del navegador, por lo que no tiene que distinguir manualmente los tipos de terminales.

Agregue el paquete a su proyecto usando Composer:

composer require minishlink / web-push

Para usar la última versión necesita PHP 7.2 o superior con el gmp, mbstring, curl, y extensiones openssl. Si debe usar una versión anterior de PHP, bloquee el paquete a una versión anterior para mantener la compatibilidad.

La biblioteca expone una clase kernel WebPush con métodos que le permiten enviar notificaciones de forma individual o por lotes. Las suscripciones están representadas por instancias de la clasificación Subscription.

Proporcionar claves insulsas

La confianza en el ecosistema web push que cumple con los estándares se ve reforzada por el uso de claves insulsas. Su servidor necesita un par de claves INSÍPIDO para poder autenticarse con los navegadores. La clave pública debe exponerse a través de un punto final de API.

puede generar un INSULSO anillo de claves utilizando el web-push envuelva:

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

Generar las claves de su sistema y almacenarlos en una ubicación persistente. Agregue un punto final de API para que su JavaScript del lado del cliente pueda recuperar la clave pública. Esto se utilizará para configurar la suscripción push del navegador. El dispositivo del usuario aceptará eventos push entrantes si se han firmado con la clave privada VAPID correspondiente.

Registro de suscripciones push

El siguiente paso en la secuencia es recibir solicitudes de suscripción push de sus clientes. Después de que el navegador confirme una nueva suscripción push, su JavaScript debe enviar la URL del punto de conexión de suscripción y las claves de autenticación asociadas al servidor. Almacene estos detalles con el ID de usuario para poder recuperar más adelante cualquier dispositivo inscrito en push vinculado al usuario.

Omitimos los ejemplos de código para este paso porque la implementación depende de su capa de almacenamiento de datos y los valores enviados por su JavaScript. Normalmente se trata de una representación JSON de un objeto PushSubscription. Necesita un conjunto sencillo de terminales de API CRUD basadas en bases de datos para crear una suscripción, reemplazar una suscripción existente y solicitar la eliminación cuando el usuario se da de baja.

Preparación de suscripciones

Una vez que un cliente se haya registrado correctamente, puede comenzar a enviar notificaciones utilizando la biblioteca web-push. Comience por crear una instancia de la WebPush para clasificar:

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

Usted puede reutilizar una WebPush instancia cada vez que se envíe una notificación. La biblioteca debe configurarse con el llavero INSÍPIDO que generaste anteriormente. Las claves deben estar codificadas en Base64, pero esto se maneja por usted si las crea con la biblioteca.

VAPID subject se utiliza para identificar su servidor y sus datos de contacto. Puede proporcionar una URL de sitio web o un enlace de dirección de correo electrónico mailto:.

A continuación, debe obtener la suscripción push a la que va a enviar. Utilice su sistema de acceso a datos para encontrar las direcciones URL de punto final push asociadas con el usuario al que desea enviar. Convierta cada suscripción en un ejemplo Subscription :

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

El auth propiedad de la PushSubscription se repite dos veces para lidiar con dos versiones diferentes de la especificación de navegador utiliza los servicios. La propiedad P256DH es otra clave pública que debe proporcionarse cuando se establece en la suscripción.

El web-push La biblioteca es compatible con terminales push de Chrome y Firefox. También funcionará con cualquier otra implementación de web push que cumpla con el estándar actual.

Envío de una notificación

Ahora combinar su WebPush et Subscription instancias para enviar una notificación de:

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

Appel sendOneNotification() ofrece entrega inmediata por una sola notificación. La carga útil en este caso es una matriz codificada en JSON con dos propiedades. Depende de usted qué datos envía y qué formato utiliza: su cliente de JavaScript los recibe tal cual y puede interpretarlos según sea necesario.

El envío de una notificación devuelve una clase de resultado que le permite verificar si la operación se realizó correctamente:

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

Puede tomar medidas para reintentar o cancelar la entrega si se produce un error.

Las suscripciones a notificaciones también pueden caducar. Llame a isSubscriptionExpired() en una clase result para determinar si esta es la razón del error. En este caso, puede eliminar la suscripción de la base de datos, asegurándose de no enviar nada más a un punto final muerto.

Lote de notificaciones

Notificaciones pueden ser agrupados juntos para ser entregados con una sola llamada al método:

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

Esto es útil cuando usted sabe que usted va a enviar un gran número de notificaciones en un corto período de tiempo. Ponga en cola todas sus cargas útiles y deje que web-push las entregue de manera óptima.

Puede limitar el número de notificaciones enviadas en una flush() pasando un entero al método:

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

El valor predeterminado es 1000.

Opciones de notificación

sendOneNotification() et queueNotification() acepte las siguientes opciones como tercer argumento de la matriz:

  • TTL – Controla durante cuánto tiempo la plataforma de notificaciones del navegador mantendrá la notificación si no se puede entregar al dispositivo del usuario de inmediato. Si el dispositivo del usuario está desconectado, las plataformas intentarán entregarlo por defecto durante las próximas cuatro semanas. Si envías una notificación que no será relevante la próxima semana, ajusta la edad en consecuencia para que el usuario no vea contenido obsoleto.
  • urgency – Acepte normal, low ou very-low como valores. Algunas plataformas pueden usarlo para ajustar la frecuencia de entrega de notificaciones. Los dispositivos que entran en el modo de ahorro de batería pueden suspender la entrega de notificaciones no urgentes.
  • batchSize – Esto tiene el mismo efecto que el argumento de flush() descrito anteriormente.

Puede configurar los valores de opción predeterminados utilizando el segundo argumento del fabricante WebPush :

$ webPush = new WebPush(], );

Resumen

El web-push La biblioteca hace que sea fácil para enviar notificaciones push usando PHP. Se obtiene una capa de abstracción en la parte superior de las diferentes plataformas del navegador que admite el procesamiento por lotes, el manejo de errores y toda la funcionalidad de inserción web.

El mecanismo de inserción web es un sistema de navegador inusual porque se basa en componentes remotos del lado del servidor que usted mismo proporciona. Esto puede hacer que parezca opaco y técnico. En la práctica, crear un backend PHP simple es rápido y fácil; la implementación de front-end suele ser el aspecto que consume más tiempo, especialmente si aún no está utilizando las funciones de service worker.

Deja una respuesta

Tu dirección de correo electrónico no será publicada.