Enviar una notificación desde PHP con FCM (Firebase Cloud Messaging)
Las notificaciones push son esenciales para mantener el engagement de los usuarios. En este tutorial, veremos cómo crear una clase en PHP para comunicarnos con el API de Firebase (FCM) y cómo capturar el token en una App desarrollada con Cordova.
class NotifyGoogleFcm {
private static $urlFcmGoogle = 'https://fcm.googleapis.com/fcm/send';
private static $apiKey = 'TU_API_KEY_AQUI';
public $title;
public $body;
public $to = '/topics/all'; // Destinatario por defecto
public $registrationIds = array();
public $data = array();
public $icon = 'myicon'; // Icono por defecto de la app
/**
* Envía la notificación vía cURL a los servidores de Google
*/
public function sendNotify() {
$header = [
'Authorization: key=' . self::$apiKey,
'Content-Type: application/json'
];
$payload = [
'notification' => [
'title' => $this->title,
'body' => $this->body,
'sound' => 'default',
'color' => '#22c08a',
'click_action' => 'FCM_PLUGIN_ACTIVITY',
'icon' => $this->icon
],
'priority' => 'high'
];
// Lógica de destinatarios: IDs múltiples o un solo TO
if (!empty($this->registrationIds)) {
$payload['registration_ids'] = $this->registrationIds;
} else {
$payload['to'] = $this->to;
}
if (!empty($this->data)) {
$payload['data'] = $this->data;
}
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, self::$urlFcmGoogle);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, $header);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); // Nota: En producción, mejor usar certificados
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($payload));
$result = curl_exec($ch);
curl_close($ch);
return $result;
}
}Lenguaje del código: PHP (php)Ejemplos prácticos de uso en PHP
Para usar estos ejemplos, asegúrate de haber incluido primero tu clase NotifyGoogleFcm y configurado tu API_KEY.
1. Enviar una notificación masiva (a todos los suscritos)
Este es el caso más común para anuncios globales. Por defecto, nuestra clase apunta al tópico /topics/all.
$clNotify = new NotifyGoogleFcm();
$clNotify->title = '¡Nueva actualización disponible!';
$clNotify->body = 'Hemos añadido nuevas funciones de PHP. Haz clic para verlas.';
$clNotify->icon = 'ic_launcher'; // Nombre del recurso en tu App
$clNotify->sendNotify();
Lenguaje del código: PHP (php)2. Enviar a un único dispositivo (Token individual)
Ideal para mensajes personalizados, como una alerta de seguridad o un mensaje privado. Solo tienes que asignar el token del dispositivo a la propiedad $to.
$clNotify = new NotifyGoogleFcm();
$clNotify->to = "dtbjlnBC3Os:APA91bEHzYAdwZrCOvrMc5ottIbX6mygHi2N5UKg-_fdzsf63U_Ste";
$clNotify->title = 'Hola Marius';
$clNotify->body = 'Tu código de verificación es 1234.';
$clNotify->sendNotify();
Lenguaje del código: PHP (php)3. Enviar a un grupo selecto (Varios tokens)
Si tienes una lista de usuarios específicos (por ejemplo, solo administradores), utiliza el array registrationIds. La clase detectará automáticamente que debe usar registration_ids en lugar de to.
$clNotify = new NotifyGoogleFcm();
$clNotify->registrationIds = [
"dtbjlnBC3Os:APA91bEHzYAdwZrCOvrMc5....",
"dfuTx5jdD0w:APA91bFfDkzY0ntMOt......"
];
$clNotify->title = 'Alerta del Sistema';
$clNotify->body = 'Se ha detectado un inicio de sesión desde una nueva IP.';
// También podemos pasar datos invisibles para que la App los procese
$clNotify->data = ['id_alerta' => 45, 'urgente' => true];
$clNotify->sendNotify();
Lenguaje del código: PHP (php)Me he basado en el código publicado en Stackoverflow
En la parte de Android, estoy utilizando Cordova con el plugin cordova-plugin-fcm-notification
Una vez instalado el plugin, como utilizarlo.
document.addEventListener("deviceready", function() {
// 1. Obtener el token único del dispositivo
FCMPlugin.getToken(function(token){
console.log("Token del dispositivo: " + token);
// Aquí deberías enviar el token a tu base de datos mediante AJAX
});
// 2. Escuchar cuando llega una notificación
FCMPlugin.onNotification(function(data){
if(data.wasTapped){
// El usuario hizo clic en la notificación con la app cerrada
alert("Notificación recibida: " + data.title);
} else {
// La app estaba abierta (Primer plano)
console.log("Notificación en primer plano", data);
}
});
}, false);Lenguaje del código: JavaScript (javascript)
Awesome post! Keep up the great work! 🙂
Great content! Super high-quality! Keep it up! 🙂
no puedo instalar el plugin cordova-plugin-fcm-notification me da error plugin.xml para cordova no se encuentra
Hola, prueba con este cordova-plugin-fcm-with-dependecy-updated, ya que el otro por lo visto ya no se mantiene.
gracias muy buen post la verdad me sirvió, luche con algunos problemas pero al final me dio
amigo otra pregunta, de casualidad sabes como activar el conteo de las notificaciones sobre el icono de la app ?, hay q activar alguna propiedad del plugin fcm para eso ?
Hola, siento en responder, como no he tenido la necesidad de utilizarlo no se muy bien como funciona, pero he encontrado lo siguiente:
En el plugin hay una pull en github para eso: https://github.com/fechanique/cordova-plugin-fcm/pull/136 pero me parece que no se ha fusionado.
Si no veo que hay un plugin para eso: https://github.com/katzer/cordova-plugin-badge
Espero que te sirva.
Saludos
gracias, lo mirare, tengo una pregunta, sabes por que las notificaciones no suenan en algunos dispositivos ? o es solo cosa de los xiaomi ?
Hola Raizel,
La verdad que yo en todo los dispositivos que he probado han sonado, por lo que no te podria ayudar en este caso.
Podrías mirar a nivel de notificaciones en los ajuste del Xiaomi ver si la app que has creado tiene asignado algun sonido.
Saludos
Buenas tardes tienes algún correo en donde te pueda contactar megustaria cotizar un proyecto
Hola Sergio, ya te he enviado un correo a la dirección de email que has indicado al publicar el comentario.
Saludos