Cómo enviar notificaciones push web con PHP

La API Web Push le permite enviar notificaciones push a navegadores web y API. Aunque la mayor parte de la lógica tiene lugar en el navegador, todavía se requiere un componente del lado del servidor para generar las notificaciones. A continuación, se explica cómo implementar un backend Web Push usando PHP.

Prerrequisitos

A los efectos de este tutorial, supongamos que está familiarizado con los conceptos básicos de la creación de API HTTP en PHP. Deberá exponer algunos puntos finales públicos utilizando su marco web. Estos serán llamados por su JavaScript en el navegador para registrar y cancelar el registro de dispositivos.

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

En un nivel alto, el flujo de Web Push tiene este aspecto:

  1. Se registra 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 su backend necesita enviar una notificación de inserción, crea una carga útil y la envía a la URL del extremo informado como parte de los datos de suscripción.
  4. El navegador del usuario recibirá la carga útil a través de la plataforma de envío de notificaciones del proveedor. El operador del servicio de JavaScript maneja el evento consecuente y usa la API de notificación 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.

Obtener la instalación

Usaremos el web-push Paquete packagist de minishlink. Esto abstrae las interacciones con cada plataforma de notificación del navegador para que no tenga que distinguir manualmente entre los tipos de puntos finales.

Agregue el paquete a su proyecto usando Composer:

composer require minishlink/web-push

Para utilizar la última versión, necesita PHP 7.2 o posterior con el gmp, mbstring, curl, Y openssl extensiones. Si necesita utilizar una versión anterior de PHP, bloquee el paquete en una versión anterior para mantener la compatibilidad.

La biblioteca expone un núcleo WebPush class con métodos que le permiten enviar notificaciones individualmente o en lotes. Las suscripciones están representadas por instancias del Subscription clase.

Proporcionar claves VAPID

La confianza en el ecosistema Web Push que cumple con los estándares se fortalece mediante el uso de claves VAPID. Su servidor necesita un par de claves VAPID para poder 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 VAPID usando el botón web-push paquete:

use MinishlinkWebPushVAPID;
 
$keyset = VAPID::createVapidKeys();
 
// public key - this needs to be accessible via an API endpoint
echo $keyset["publicKey"];
 
// private key - never expose this!
echo $keyset["privateKey"];
 
file_put_contents("vapid.json", json_encode($keyset));

Genere claves para su sistema y guárdelas en una ubicación permanente. 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 suscripción push

El siguiente paso de la secuencia es recibir solicitudes de suscripción push de sus clientes. Una vez que el navegador haya confirmado 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 con su servidor. Almacena estos detalles junto con el ID de usuario para que pueda recuperar todos los dispositivos push registrados conectados al usuario en un momento posterior.

Estamos omitiendo ejemplos de código para este paso ya que la implementación depende del nivel de almacenamiento de datos y los valores enviados por JavaScript. Normalmente, será una representación JSON de un PushSubscription objeto. Se requiere un conjunto simple de puntos finales de API CRUD respaldados por bases de datos para crear una suscripción, reemplazar una existente y solicitar la eliminación cuando el usuario cancela la suscripción.

Preparación de suscripciones

Una vez que un cliente se ha registrado correctamente, puede comenzar a enviar notificaciones utilizando el web-push Biblioteca. Empiece por crear una instancia de WebPush clase:

use MinishlinkWebPushWebPush;
 
$webPush = new WebPush([
    "VAPID" => [
        "subject" => "https://example.com",
        "publicKey" => "VAPID_Public_Key_Here",
        "privateKey" => "VAPID_Private_Key_Here"
    ]
]);

Puedes reutilizar uno WebPush instancia cada vez que envíe una notificación. La biblioteca debe configurarse con el conjunto de claves VAPID generado previamente. Las claves deben estar codificadas como Base64, pero esto se maneja por usted si las crea con la biblioteca.

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

A continuación, debe recuperar la suscripción push a la que enviará. Utilice su sistema de acceso a datos para buscar las URL de punto final de inserción asociadas con el usuario al que desea enviar datos. Convierta cada suscripción en una Subscription ejemplo:

use MinishlinkWebPushSubscription;
 
// Get user's push data...
// SELECT * FROM push_subscriptions WHERE user_id = 123456
 
$subscription = Subscription::create([
    "endpoint" => "https://fcm.google.com/...",
    "contentEncoding" => "aesgcm",
    "authToken" => "<auth token from JavaScript PushSubscription object>"
    "keys" => [
        "auth" => "<auth token from JavaScript PushSubscription object>",
        "p256dh" => "<p256dh token from JavaScript PushSubscription object>"
    ]
]);

los auth propiedad de PushSubscription se repite dos veces para hacer frente a dos versiones diferentes de las especificaciones utilizadas por los servicios del navegador. La propiedad P256DH es otra clave pública que debe proporcionarse cuando se establece en la suscripción.

los web-push La biblioteca es compatible con los puntos finales de inserción 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 combina el tuyo WebPush Y Subscription instancias para enviar una notificación:

$result = $webPush -> sendOneNotification(
    $subscription,
    json_encode([
        "message" => "Demo notification",
        "foo" => "bar"
    ])
);

vocación sendOneNotification() proporciona entrega instantánea para 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 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 fue exitosa:

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 volver a intentar o cancelar la entrega si se produce un error.

Las suscripciones a notificaciones también pueden vencer. Llama a isSubscriptionExpired() en una clase de resultado para determinar si esta es la razón del error. Puede eliminar la suscripción de su base de datos en este escenario, asegurándose de no enviar nada más a un punto muerto.

Notificaciones por lotes

Las notificaciones se pueden agrupar para su entrega con una llamada de método:

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

Esto es útil cuando sabe que enviará una gran cantidad de notificaciones en poco tiempo. Ponga en cola todas sus cargas útiles y váyase web-push entregarlos de la manera óptima.

Puedes limitar la cantidad de notificaciones enviadas en una sola flush() pasando un número entero al método:

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

El valor predeterminado es 1000.

Opciones de notificación

sendOneNotification() Y queueNotification() acepta las siguientes opciones como tercer argumento de la matriz:

  • TTL - Compruebe cuánto tiempo la plataforma de notificación del navegador mantendrá la notificación si no se puede transferir inmediatamente al dispositivo del usuario. Si el dispositivo del usuario está fuera de línea, las plataformas intentan entregarlo de forma predeterminada durante las próximas cuatro semanas. Si envía una notificación de que no será relevante la próxima semana, ajuste el TTL en consecuencia para que el usuario no vea contenido desactualizado.
  • urgency - aceptar normal, low o very-low como valores. Algunas plataformas pueden usarlo para regular la frecuencia de envío de notificaciones. Los dispositivos que activan un modo de ahorro de batería pueden suspender el envío de notificaciones no urgentes.
  • batchSize - Esto tiene el mismo efecto que el argumento a favor flush() descrito arriba.

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

$webPush = new WebPush(["VAPID" => [...]], ["TTL" => 3600]);

Resumen

los web-push La biblioteca facilita el envío de notificaciones Web Push utilizando PHP. Obtenga una capa de abstracción sobre las diversas plataformas de navegador que admiten el procesamiento por lotes, el manejo de errores y todas las funciones de Web Push.

El mecanismo Web Push es un sistema de navegador inusual en el sentido de que se basa en componentes remotos del lado del servidor proporcionados por el usuario. Esto puede hacer que parezca aburrido 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, especialmente si aún no está utilizando las funciones del trabajador de servicio.

¿Qué te ha parecido?

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Subir