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 ocurre en el navegador, aún necesita un componente del lado del servidor para generar sus notificaciones. He aquí cómo implementar un backend de inserción Web usando PHP.
Requisitos previos
Para los fines de este tutorial, asumiremos que está familiarizado con los conceptos básicos de la creación de API HTTP en PHP. Necesitará exponer algunos puntos de conexión públicos utilizando su marco web. Su JavaScript en el navegador llamará a estos dispositivos para registrar y cancelar el registro.
Este artículo no tocará el código del lado del navegador ni cómo funciona. Deberá crear un trabajador de servicio que responda a los eventos push entrantes y muestre una notificación al usuario.
En un nivel alto, el flujo de inserción de banda se ve así:
- Se registra una suscripción push en el navegador. El navegador emite una URL de punto final única a su JavaScript.
- Su JavaScript envía los datos de suscripción a su servidor e identifica al usuario al que se aplica.
- 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.
- 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.
A continuación se explica cómo implementar los aspectos del lado del servidor de los pasos 1 a 3.
Getting Setup
Usaremos el paquete web-push
Packagist de minishlink. Esto abstrae las interacciones con cada plataforma de notificaciones del navegador para que no tenga que distinguir manualmente entre los tipos de endpoints.
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 de PHP anterior, bloquee el paquete a una versión anterior para mantener la compatibilidad.
La biblioteca expone una clase core WebPush
con métodos que le permiten enviar notificaciones de forma individual o por lotes. Las suscripciones están representadas por instancias de la clase Subscription
.
Proporcionar claves VAPID
La confianza en el ecosistema Web Push que cumple con los estándares se refuerza mediante el uso de claves VAPID. Su servidor necesita un par de claves INSÍPIDO para que pueda autenticarse en los navegadores. La clave pública debe exponerse a través de un punto final de API.
Puede generar un conjunto de claves insípido utilizando el paquete 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));
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 de la secuencia es recibir solicitudes de suscripción push de sus clientes. Una vez que el navegador confirme una nueva suscripción push, su JavaScript debe enviar la URL del punto final de la suscripción y las claves de autenticación asociadas a su servidor. Almacene estos detalles junto con el ID del usuario para que pueda recuperar todos los dispositivos inscritos en push vinculados al usuario más adelante.
Omitimos ejemplos de código para este paso, ya que la implementación depende de la capa de almacenamiento de datos y los valores que envía JavaScript. Normalmente, se trata de una representación JSON de un objeto PushSubscription
. Necesita un conjunto sencillo de terminales de API CRUD respaldados por bases de datos para crear una suscripción, reemplazar una existente y solicitar una 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
. Comenzar por la creación de una instancia de la WebPush
clase:
use Minishlink\WebPush\WebPush; $webPush = new WebPush(]);
Usted puede reutilizar una WebPush
instancia cada vez que se envíe una notificación. La biblioteca debe configurarse con el conjunto de claves VAPID que generó anteriormente. Las claves deben estar codificadas como Base64, pero esto se maneja para usted si las crea con la biblioteca.
El 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, necesita recuperar la suscripción push a la que va a enviar. Utilice su sistema de acceso a datos para buscar las direcciones URL de punto final push asociadas con el usuario al que desea enviar. Convierta cada suscripción a una instancia Subscription
:
use Minishlink\WebPush\Subscription; // 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 hacer frente 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.
La biblioteca web-push
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
y Subscription
instancias para enviar una notificación de:
$result = $webPush -> sendOneNotification( $subscription, json_encode());
Llamar 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 el formato que 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 comprobar si la operación tuvo éxito:
if ($result -> isSuccess()) { // all good}else { // something went wrong error_log($result -> getReason()); // provides raw HTTP response data error_log($result -> getResponse()); }
Puede realizar acciones para reintentar o cancelar la entrega si se produce un error.
Las suscripciones a notificaciones también pueden caducar. Llame al método 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.
Notificaciones por lotes
Las notificaciones se pueden agrupar por lotes para entregarse con una llamada a un método:
$webPush -> queueNotification($subscription, );$webPush -> queueNotification($subscription, ); foreach ($webPush -> flush() as $i => $result) { echo ("Notification $i was " . ($result -> isSuccess() ? "sent" : "not sent"));}
Esto es útil cuando sabes que vas a enviar una gran cantidad de notificaciones en un corto período de tiempo. Ponga en cola todas sus cargas útiles y deje que web-push
las entregue de la manera óptima.
Usted puede limitar el número de notificaciones enviadas en un solo flush()
pasando un entero para el método:
$webPush -> flush(100); // send 100 messages
El valor predeterminado es 1000
.
Opciones de notificación
sendOneNotification()
y queueNotification()
aceptan las siguientes opciones como un tercer argumento de matriz:
-
TTL
– Controla el tiempo que la plataforma de notificaciones del navegador mantendrá la notificación si no se puede pasar al dispositivo del usuario de inmediato. Si el dispositivo del usuario está desconectado, las plataformas por defecto intentan entregarlo durante las próximas cuatro semanas. Si vas a enviar una notificación que no será relevante la próxima semana, ajusta el TTL en consecuencia para que el usuario no vea contenido obsoleto. -
urgency
– Aceptanormal
,low
overy-low
como valores. Algunas plataformas pueden usar esto para ajustar la frecuencia de entrega de notificaciones. Los dispositivos que entran en un modo de ahorro de batería pueden suspender la entrega de notificaciones no urgentes. -
batchSize
– Esto tiene el mismo efecto que el argumentoflush()
descrito anteriormente.
Puede configurar los valores de opción predeterminados utilizando el segundo argumento del constructor WebPush
:
$webPush = new WebPush(], );
Resumen
La biblioteca web-push
facilita el envío de notificaciones Push Web utilizando PHP. Se obtiene una capa de abstracción encima de las diversas plataformas del navegador que admite procesamiento por lotes, manejo de errores y todas las funciones de inserción Web.
El mecanismo de inserción Web es un sistema de navegador inusual, ya que depende de componentes remotos del lado del servidor que usted mismo suministra. 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 frontend suele ser el aspecto que consume más tiempo, particularmente si aún no está utilizando las características de service worker.
Leave a Reply