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.



