Enviar notificaciones PUSH a Google API de Firebase Cloud Messaging (V1) usando PHP

Tiempo de lectura: 3 minutos

Hoy vamos a aprender cómo podemos enviar un mensaje al endpoint de Firebase Cloud Messaging usando PHP. (https://firebase.google.com/docs/cloud-messaging/http-server-ref?hl=es-419)

Para ello necesitamos el endpoint de Google:

POST https://fcm.googleapis.com/v1/projects/myproject-b5ae1/messages:send

Y previamente tenemos que generar un token en nuestra aplicación, para ello vamos a Firebase, seleccionamos nuestro proyecto y pulsamos en Configuración del Proyecto:

Firebase Configuración del proyecto

Aquí dentro buscamos Cloud Messaging

Configuración cloud Messaging

Ahora vamos a la seccion de API de Firebase Cloud Messaging (V1) y comprobamos que esté habilitada.

Habilitar cloud Messaging (v1)

Ahora buscamos Cuentas de servicio

Cuentas de servicio Firebase

Y generamos una Nueva Clave Privada

Generar nueva clave privada Firebase

Guardamos este JSON en la raíz del proyecto y creamos un archivo llamado send_push.php

-app.json
-send_push.php

Y añadimos lo siguiente en send_push.php

function enviarMensajeCloud($tituloEnviar, $mensajeEnviar, $tokenEnviar) {
    $accessToken = getAccessToken();
    $projectId = getProjectId();

    $url = "https://fcm.googleapis.com/v1/projects/$projectId/messages:send";
    
    $data = array(
        'message' => array(
            'token' => $tokenEnviar,
            'notification' => array(
                'title' => $tituloEnviar,
                'body' => $mensajeEnviar,
            ),
            'data' => array(
                'key_1' => 'Value for key_1',
                'key_2' => 'Value for key_2',
            ),
        ),
    );

    $payload = json_encode($data);

    $headers = array(
        'Content-type: application/json',
        'Authorization: Bearer ' . $accessToken,
    );

    $ch = curl_init($url);
    curl_setopt($ch, CURLOPT_POSTFIELDS, $payload);
    curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

    $result = curl_exec($ch);

    curl_close($ch);

    // Manejar la respuesta según tus necesidades
    // Puedes imprimir el resultado para depuración
    echo $result;
}

function getAccessToken() {
       // Lee el contenido del archivo app.json
     $filePath = __DIR__ . '/app.json';

    if (!file_exists($filePath)) {
        die('Error: No se encuentra el archivo app.json en ' . $filePath);
    }
    // Lee el contenido del archivo app.json
    $jsonContent = file_get_contents($filePath);
    
    if ($jsonContent === false) {
        die('Error al leer el archivo app.json');
    }

    $jsonData = json_decode($jsonContent, true);

    $privateKey = $jsonData['private_key'];
    $clientId = $jsonData['client_id'];

    $jwtHeader = base64_encode(json_encode(array("alg" => "RS256", "typ" => "JWT")));
    $jwtClaimSet = base64_encode(json_encode(array(
        "iss" => $clientId,
        "scope" => "https://www.googleapis.com/auth/firebase.messaging",
        "aud" => "https://www.googleapis.com/oauth2/v4/token",
        "exp" => time() + 3600, // La validez del token es de 1 hora
        "iat" => time(),
    )));

    $signature = '';
    openssl_sign("$jwtHeader.$jwtClaimSet", $signature, $privateKey, OPENSSL_ALGO_SHA256);
    $jwtSignature = base64_encode($signature);

    $assertion = "$jwtHeader.$jwtClaimSet.$jwtSignature";

    $url = "https://www.googleapis.com/oauth2/v4/token";
    $data = array(
        "grant_type" => "urn:ietf:params:oauth:grant-type:jwt-bearer",
        "assertion" => $assertion,
    );

    $ch = curl_init($url);
    curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($data));
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_HTTPHEADER, array(
        "Content-Type: application/x-www-form-urlencoded"
    ));

    $response = curl_exec($ch);
    curl_close($ch);

    $responseData = json_decode($response, true);
    return $responseData['access_token'];
}

function getProjectId() {
    // Lee el contenido del archivo app.json
     $filePath = __DIR__ . '/app.json';

    if (!file_exists($filePath)) {
        die('Error: No se encuentra el archivo app.json en ' . $filePath);
    }
    // Lee el contenido del archivo app.json
    $jsonContent = file_get_contents($filePath);
    
    if ($jsonContent === false) {
        die('Error al leer el archivo app.json');
    }

    $jsonData = json_decode($jsonContent, true);

    return $jsonData['project_id'];
}


// Usa esta función para enviar un mensaje
enviarMensajeCloud('Título del mensaje', 'Cuerpo del mensaje', 'token_del_dispositivo');

Recuerda añadir correctamente el nombre del proyecto en esta línea:

$jsonContent = file_get_contents('app.json');

Y lo mismo para ‘token_del_dispositivo’, tendrás que usar un Token de dispositivo válido aquí te explico cómo puedes obtenerlo: https://devcodelight.com/?p=7128

Deja un comentario