Sprache:

Suche

FCM-Benachrichtigung mit Laravel implementieren

  • Teilen:
FCM-Benachrichtigung mit Laravel implementieren

Voraussetzungen

  • Grundlegendes Verständnis von Laravel
  • Grundlegendes Verständnis von APIs
  • Einige Kenntnisse über CURL oder GuzzleHTTP
  • Wissen Sie, was FCM ist?
  • Firebase Konto und Projekt einrichten

Projekt einrichten

Richten Sie eine neue Laravel-Anwendung ein, indem Sie den folgenden Befehl ausführen.

laravel new fcm-notifications

Vorbereitung der Probe Nutzlast

{
"payload": {
"a": "b",
"c": "d",
"e": "f"
},
"receiver_user": "receiver_fcm_registeration_id",
"sender_user": "sender_fcm_registeration_id",
"title":"sample title",
"message":"sample message",
"push_type":"individual"
}
  • Nutzdaten sind die Muster-Nutzdaten, die durch die Bereitstellung benutzerdefinierter Musterdaten bereitgestellt werden.
  • Receiver User ist die FCM-Registrierungs-ID des Benutzers, an den Sie die Benachrichtigung senden möchten.
  • Absender Benutzer ist die FCM-Registrierungs-ID des Benutzers, der die Benachrichtigung sendet (optional)
  • Titel für die Benachrichtigung
  • Nachricht für die Benachrichtigung
  • Post Type ist entweder Individual für einen einzelnen Benutzer, Topic für das Senden an ein Topic oder Multiple für das Senden an mehrere Benutzer.

API-Endpunkt

Für diese Aufgabe benötigen wir nur einen einfachen POST-API-Endpunkt zum Senden von FCM-Benachrichtigungen an Benutzer.

Gehen Sie zum Projektordner und öffnen Sie routes/api.php und fügen Sie unsere POST-Route zu einigen NotificationController, die wir später erstellen werden.

Route::post( 'notify', 'NotificationController@notify' );

Erstellen wir nun einen Controller und eine darin enthaltene Notify-Methode mit der artisan-Befehlszeile.

php artisan make:controller NotificationController

Holen wir nun diese Beispiel-Nutzlast aus der Anfrage in Ihrem Controller app\Http\Controllers\NotificationController.php etwa so,

public function notify() {

$data = json_decode( \request()->getContent() );

$sender = $data->sender_user;
$receiver = $data->receiver_user;
$notification_payload = $data->payload;
$notification_title = $data->title;
$notification_message = $data->message;
$notification_push_type = $data->push_type;

}

FCM und Push-Benachrichtigung einrichten

Bevor wir weitermachen, sollten wir hier kurz innehalten und uns überlegen, was als Nächstes ansteht. Um jetzt eine FCM-Benachrichtigung zu senden, brauchen wir eine Art von Mechanismus, der funktioniert. Um eine einfache Lösung zu finden, erstellen wir hier ein paar Dateien: Firebase.php und Push.php

Firebase.php ist für das Versenden von Nachrichten zuständig und kümmert sich um den Push-Typ der Nachricht, die Sie versenden möchten.

Push.php ist für die Einstellung der Daten aus der Beispiel-Nutzlast verantwortlich und setzt unser endgültiges JSON für die Benachrichtigung.

Lassen Sie uns jetzt unsere Dateien erstellen. Wir packen sie in app\Libraries Namensraum.

Jetzt in unserem Firebase.php, fügen Sie die folgenden Methoden hinzu.

class Firebase {

/**
* Sending push message to single user by Firebase Registration ID
* @param $to
* @param $message
*
* @return bool|string
*/
public function send( $to, $message ) {

$fields = array(
'to' => $to,
'data' => $message,
);

return $this->sendPushNotification( $fields );
}


/**
* Sending message to a topic by topic name
* @param $to
* @param $message
*
* @return bool|string
*/
public function sendToTopic( $to, $message ) {
$fields = array(
'to' => '/topics/' . $to,
'data' => $message,
);

return $this->sendPushNotification( $fields );
}


/**
* Sending push message to multiple users by firebase registration ids
* @param $registration_ids
* @param $message
*
* @return bool|string
*/
public function sendMultiple( $registration_ids, $message ) {
$fields = array(
'to' => $registration_ids,
'data' => $message,
);

return $this->sendPushNotification( $fields );
}

/**
* CURL request to firebase servers
* @param $fields
*
* @return bool|string
*/
private function sendPushNotification( $fields ) {

// Set POST variables
$url = 'https://fcm.googleapis.com/fcm/send';

$headers = array(
'Authorization: key=' . env('FCM_LEGACY_KEY')',
'Content-Type: application/json'
);
// Open connection
$ch = curl_init();

// Set the url, number of POST vars, POST data
curl_setopt( $ch, CURLOPT_URL, $url );

curl_setopt( $ch, CURLOPT_POST, true );
curl_setopt( $ch, CURLOPT_HTTPHEADER, $headers );
curl_setopt( $ch, CURLOPT_RETURNTRANSFER, true );

// Disabling SSL Certificate support temporarly
curl_setopt( $ch, CURLOPT_SSL_VERIFYPEER, false );

curl_setopt( $ch, CURLOPT_POSTFIELDS, json_encode( $fields ) );

// Execute post
$result = curl_exec( $ch );
if ( $result === false ) {
die( 'Curl failed: ' . curl_error( $ch ) );
}

// Close connection
curl_close( $ch );

return $result;
}

Diese Firebase-Klasse ist ziemlich einfach zu bekommen. Es ist nur eine Sammlung von Methoden für das Senden von Push-Benachrichtigungen. Hier, wenn Sie bemerkt haben, müssen Sie hinzufügen FCM_LEGACY_KEY, die wir aus unserer .env-Datei erhalten.

Sie können Ihre FCM_LEGACY_KEY in Ihrer FCM-Konsole unter Ihren Projekteinstellungen auf der Registerkarte Cloud Messaging.

Jetzt für Push.php,

class Push {

private $title;
private $message;
private $data;


/**
* @param $title
*/
public function setTitle( $title ) {
$this->title = $title;
}

/**
* @param $message
*/
public function setMessage( $message ) {
$this->message = $message;
}


/**
* @param $data
*/
public function setPayload( $data ) {
$this->data = $data;
}


/**
* @return array
*/
public function getPush() {
$response = array();
$response['data']['title'] = $this->title;
$response['data']['message'] = $this->message;
$response['data']['payload'] = $this->data;
$response['data']['timestamp'] = date( 'Y-m-d G:i:s' );

return $response;
}

}

Hier geben wir unsere Daten, den Titel und die Nachricht usw. ein. Ziemlich einfach, oder?

Zurück zu NotificationController

In unserem notify Methode fügen Sie den folgenden Code unter data.

try {

$sender_id = "";
$receiver_id = "";

$firebase = new Firebase();
$push = new Push();

// optional payload
$payload = $notification_payload;

$title = $notification_title ?? '';

// notification message
$message = $notification_message ?? '';

// push type - single user / topic
$push_type = $notification_push_type ?? '';

$push->setTitle( $title );
$push->setMessage( $message );
$push->setPayload( $payload );

$json = '';
$response = '';

if ( $push_type === 'topic' ) {
$json = $push->getPush();
$response = $firebase->sendToTopic( 'global', $json );
} else if ( $push_type === 'individual' ) {
$json = $push->getPush();
$regId = $receiver_id ?? '';
$response = $firebase->send( $regId, $json );

return response()->json( [
'response' => $response
] );
}


} catch ( \Exception $ex ) {
return response()->json( [
'error' => true,
'message' => $ex->getMessage()
] );
}

Endlich

Wenn also alles gut gegangen ist und Sie es in Postman oder Ihrer Anwendung testen. Sie werden eine Antwort wie diese erhalten,

{
"response": {
"multicast_id": 7537747549381668791,
"success": 1,
"failure": 0,
"canonical_ids": 0,
"results": [
{
"message_id": "0:1562948236493630%12bb27e9f9fd7ecd"
}
]
}
}

Zusätzlich

Wenn Ihnen der CURL-Teil nicht gefällt. Wir haben hier etwas für Sie. Lassen Sie uns ein wenig refaktorisieren und den CURL-Aufruf in GuzzleHTTP umwandeln.

Installieren Sie das Paket durch Ausführen von

composer require guzzlehttp/guzzle

Jetzt ersetzen wir den Code in unserem sendPushNotification Funktion in Firebase.php

Aktualisiert sendPushNotification Funktion würde nun wie folgt aussehen:

private function sendPushNotification( $fields ) {

// Set POST variables
$url = 'https://fcm.googleapis.com/fcm/send';

$client = new Client();

$result = $client->post( $url, [
'json' =>
$fields
,
'headers' => [
'Authorization' => 'key='.env('FCM_LEGACY_KEY'),
'Content-Type' => 'application/json',
],
] );


return json_decode( $result->getBody(), true );

}

Ziemlich sauber? Vergessen Sie auch nicht, Folgendes zu verwenden GuzzleHttp\Client am Anfang der Klasse.

Schlussfolgerung

Nun, wir haben erfolgreich FCM-Benachrichtigungen mit Laravel implementiert. Wenn Sie zwischendurch auf Fehler gestoßen sind, lassen Sie es uns bitte in den Kommentaren unten wissen. Den kompletten Code finden Sie auf der Github.

Usama Muneer

Usama Muneer

A web enthusiastic, self-motivated & detail-oriented professional Full-Stack Web Developer from Karachi, Pakistan with experience in developing applications using JavaScript, WordPress & Laravel specifically. Loves to write on different web technologies with an equally useful skill to make some sense out of it.