Как отправить уведомление FCM с помощью PHP?

Я попытался отправить FCM с помощью PHP-кода/веб-браузера.

Но проблема в том, что я отправляю его с помощью веб-браузера PHP:

  • Уведомление FCM появляется только на виртуальных устройствах.
  • Уведомление FCM не отображается на реальных телефонных устройствах.

И я могу отправлять уведомления FCM только на реальные телефонные устройства с помощью Firebase Console.

Кто-нибудь может помочь? Код ниже.

<?php
require "init.php";
global $con;
    if(isset($_POST['Submit'])){
        $message     = $_POST['message'];
        $title       = $_POST['title'];
        $path_to_fcm = 'https://fcm.googleapis.com/fcm/send'; 
        $server_key  = "AAAA2gV_U_I:APA91bHA28EUGmA3BrDXFInGy-snx8wW6eZ_RUE7EtOyM99pbfrVZU_ME-FU0O9_dUxYpM30OYF8KWYlixod_PfwbgLNoovzdkdJ4F-30vY8X_tBz0CMrajCIAgbNVRfw203YdRGli";    
        $sql     = "SELECT fcm_token FROM fcm_table";
        $result  = mysqli_query($con, $sql);
        $row     = mysqli_fetch_row($result);
            $key = $row[0];
        $headers = array('Authorization:key=' .$server_key, 'Content-Type:application/json');
        $fields  = array('to' => $key, 'notification' => array('title' => $title, 'body'=> $message));
        $payload = json_encode($fields);
        $curl_session = curl_init();
        curl_setopt($curl_session, CURLOPT_URL, $path_to_fcm);
        curl_setopt($curl_session, CURLOPT_POST, true);
        curl_setopt($curl_session, CURLOPT_HTTPHEADER, $headers);
        curl_setopt($curl_session, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($curl_session, CURLOPT_SSL_VERIFYPEER, false);
        curl_setopt($curl_session, CURLOPT_IPRESOLVE, CURL_IPRESOLVE_V4);
        curl_setopt($curl_session, CURLOPT_POSTFIELDS, $payload);
        $result = curl_exec($curl_session);
        curl_close($curl_session);
        mysqli_close($con);
    }   
?>
<!DOCTYPE html>
<html>
<head>
    <title>FCM Notification</title>
</head>
<body>
    <form action='fcm_notification.php' method="POST">
        <table>
            <tr>
                <td>Title : </td>
                <td><input type="text" name="title" required="required" /></td>
            </tr>
            <tr>
                <td>Message : </td>
                <td><input type="text" name="message"  required="required" /></td>
            </tr>
            <tr>
                <td><input type="submit" name="Submit" value="Send notification"></td>

            </tr>
        </table> 
    </form>
</body>
</html>

Спасибо.


person Jamilah    schedule 06.12.2016    source источник
comment
Под устройством вы имеете в виду Android, верно?   -  person AL.    schedule 06.12.2016
comment
ага. андроид устройства   -  person Jamilah    schedule 06.12.2016
comment
Можете ли вы правильно получить регистрационные токены для эмуляторов? Вы пытались отправить сообщение, используя простой ответ cURL, и посмотреть, не получает ли я все еще никаких сообщений?   -  person AL.    schedule 06.12.2016
comment
да . токен регистрации работает от эмулятора к базе данных.   -  person Jamilah    schedule 06.12.2016


Ответы (3)


Следующим способом вы можете отправить push-уведомление на мобильный телефон с помощью Google FCM. Для меня это работает, как и ожидалось. Добавьте ключ 'priority' => 'high'

function sendPushNotification($fields = array())
{
    $API_ACCESS_KEY = 'YOUR KEY';
    $headers = array
    (
        'Authorization: key=' . $API_ACCESS_KEY,
        'Content-Type: application/json'
    );
    $ch = curl_init();
    curl_setopt( $ch,CURLOPT_URL, 'https://fcm.googleapis.com/fcm/send' );
    curl_setopt( $ch,CURLOPT_POST, true );
    curl_setopt( $ch,CURLOPT_HTTPHEADER, $headers );
    curl_setopt( $ch,CURLOPT_RETURNTRANSFER, true );
    curl_setopt( $ch,CURLOPT_SSL_VERIFYPEER, false );
    curl_setopt( $ch,CURLOPT_POSTFIELDS, json_encode( $fields ) );
    $result = curl_exec($ch );
    curl_close( $ch );
    return $result;
}

$title = 'Whatever';
$message = 'Lorem ipsum';
$fields = array
(
    'registration_ids'  => ['deviceID'],
    'data'          => '',
    'priority' => 'high',
    'notification' => array(
        'body' => $message,
        'title' => $title,
        'sound' => 'default',
        'icon' => 'icon'
    )
);

sendPushNotification($fields);
person Bokul    schedule 06.12.2016
comment
идентификатор устройства ? это то же самое с идентификатором отправителя из FCM? - person Jamilah; 06.12.2016
comment
С мобильного устройства, когда вы пытаетесь подключиться к Google FCM, он отправляет вам Registration_id/deviceID, как бы вы его ни называли. Это выглядит ниже fxRKtQfyP5Y:APA91bGkjkerOGAVCdZFy6f9G-gmXHJwRNAeKELIWMgddDKQW34MZw0LQPPluM1hKCzYsfcVVnuwbSJEjctAKs2JAaCLUEeSM6QEW7qVZ281O9TUOa8mJ4Hb8qNo_qHoc9eSNvsGjrKY - person Bokul; 06.12.2016

вы можете создать функцию, которая отправляет push-уведомление для устройств.

// firebase access key
define( 'API_ACCESS_KEY', 'AAAAAG78XmM:APA91bFRHpzuEIgiQRmPUm4uRy8bygNGr1h2Oq3ydc5WtKbrfJA8NVAaGIAxbQELfcOWwN2OR4pf5NzSRuuWOYj_P-XXXXXXXX');        
// target device 'fcm' id
$device[0]='JI8YHo7GEo:APA9-aGWOU3U3CXXXXXXXXXXX';
$device[1]='JI8YHo7GEo:APA9-aGWOU3U3CXXXXXXXXXXX';

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

    // "to": "e1w6hEbZn-8:APA91bEUIb2JewYCIiApsMu5JfI5Ak...",   // for single device (insted of "registration_ids"=>"$device"  )
    $data = array("registration_ids" => $device,            // for multiple devices 
        "notification" => array( 
        "title" => "Party Night", 
        "body" => "Invitation for pool party!",
        "message"=>"Come at evening...",
        'icon'=>'https://www.example.com/images/icon.png'
    ),
        "data"=>array(
        "name"=>"xyz",
        'image'=>'https://www.example.com/images/minion.jpg'
        ) 
    ); 

    $data_string = json_encode($data); 
    $headers = array ( 'Authorization: key=' . API_ACCESS_KEY, 'Content-Type: application/json' ); 
    $ch = curl_init(); 
    curl_setopt( $ch,CURLOPT_URL,$url ); 
    curl_setopt( $ch,CURLOPT_POST, true ); 
    curl_setopt( $ch,CURLOPT_HTTPHEADER, $headers ); 
    curl_setopt( $ch,CURLOPT_RETURNTRANSFER, true ); 
    curl_setopt( $ch,CURLOPT_POSTFIELDS, $data_string); 
    $result = curl_exec($ch); 

для более подробной информации обратитесь к этому

to – введите строку – (необязательно) [Получатель сообщения]. Значением должен быть один токен регистрации, ключ уведомления или тема. Не устанавливайте это поле при отправке в несколько тем

registration_ids – тип массива строк – (необязательно) [Получатели сообщения] Несколько токенов регистрации, минимум 1, максимум 1000.

priority– Type String – (Необязательно) [по умолчанию нормальный] Допустимые значения нормальный и высокий.

delay_while_idle — тип boolean — (необязательно) [значение по умолчанию false] true указывает, что сообщение не следует отправлять, пока устройство не станет активным.

time_to_live — введите номер JSON — (необязательно) [значение по умолчанию: 4 недели, максимум 4 недели]. Этот параметр указывает, как долго (в секундах) сообщение должно храниться в хранилище FCM, если устройство находится в автономном режиме.

data — Type JSON Object Указывает пользовательские пары ключ-значение полезной нагрузки сообщения. например. {"post_id":"1234","post_title":"Заголовок сообщения в блоге"}

person Rakyesh Kadadas    schedule 23.05.2018

В Android вы можете получить его в onMessageReceived() как данные карты…

В фоновом режиме: приложения получают полезные данные уведомлений на панели уведомлений и обрабатывают полезные данные только тогда, когда пользователь нажимает на уведомление.

Когда на переднем плане — приложение получает объект сообщения с обеими доступными полезными нагрузками.

public class FcmMessageService extends FirebaseMessagingService{
@Override
public void onMessageReceived(RemoteMessage remoteMessage) {
    //onMessageReceived will be called when ever you receive new message from server.. (app in background and foreground )
    Log.d("FCM", "From: " + remoteMessage.getFrom());

    if(remoteMessage.getNotification()!=null){
    Log.d("FCM", "Notification Message Body: " + remoteMessage.getNotification().getBody());
    }

    if(remoteMessage.getData().containsKey("post_id") && remoteMessage.getData().containsKey("post_title")){
        Log.d("Post ID",remoteMessage.getData().get("id").toString());
        Log.d("Post Title",remoteMessage.getData().get("post_title").toString());
        // eg. Server Send Structure data:{"post_id":"12345","post_title":"A Blog Post"}
    }
}}
person Rakyesh Kadadas    schedule 23.05.2018