Home » Php » android – How to send push notifications to multiple devices using php script using FCM?

android – How to send push notifications to multiple devices using php script using FCM?

Posted by: admin July 12, 2020 Leave a comment

Questions:

I’m new to push notifications using FCM from php to Android devices. From android side I have generated FCM reg_id & send it over php script & store into mysql database. Now, I would like to send notifications from php script to multiple android devices simultaneously.

Here is the php scripts that are used during sending push notifications :

1.firebase.php (reference link)

 <?php

class Firebase {

// sending push message to single user by firebase reg id
public function send($to, $message) {
    $fields = array(
        'to' => $to,
        'data' => $message,
    );
    return $this->sendPushNotification($fields);
}

// sending push message to multiple users by firebase registration ids
public function sendMultiple($registration_ids, $message) {
    $fields = array(
        'registration_ids' => $registration_ids,
        'data' => $message,
    );

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

// function makes curl request to firebase servers
private function sendPushNotification($fields) {
    
    require_once('config.php');

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

    $headers = array(
        'Authorization: key=' . FIREBASE_API_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);
    // echo "Result".$result;
    if ($result === FALSE) {
        die('Curl failed: ' . curl_error($ch));
    }

    // Close connection
    curl_close($ch);

    return $result;
   }
 }

?>

2.push.php : (reference link)

<?php

class Push {

// push message title
private $title;
private $message;
private $image;
// push message payload
private $data;
// flag indicating whether to show the push
// notification or not
// this flag will be useful when perform some opertation
// in background when push is recevied
private $is_background;

function __construct() {
    
}

public function setTitle($title) {
    $this->title = $title;
}

public function setMessage($message) {
    $this->message = $message;
}

public function setImage($imageUrl) {
    $this->image = $imageUrl;
}

public function setPayload($data) {
    $this->data = $data;
}

public function setIsBackground($is_background) {
    $this->is_background = $is_background;
}

public function getPush() {
    $res = array();
    $res['data']['title'] = $this->title;
    $res['data']['is_background'] = $this->is_background;
    $res['data']['message'] = $this->message;
    $res['data']['timestamp'] = date('Y-m-d G:i:s');
    return $res;
}

}

3.test.php

 <?php
include_once('config.php');
require_once('DB_Functions.php');
require_once('firebase.php');
require_once('push.php');
$db = new DB_Functions();
$firebase = new Firebase();
$push = new Push();
if(isset($_POST['send']))
{
// $sendvalue = $_POST['send'];
ChromePhp::log('send it '.$_POST['send']." user 
category:".$_POST['user_category']." Title : ".$_POST['message_title']." Message : ".$_POST['message_to_send']);
$ucategory = $_POST['user_category'];
ChromePhp::log('U category '.$ucategory);
// notification title
$messageTitle = isset($_POST['message_title']) ? $_POST['message_title'] : '';
// notification message
$messageToSend = isset($_POST['message_to_send']) ? $_POST['message_to_send'] : '';
ChromePhp::log('Message Title '.$messageTitle." Message:".$messageToSend);
$userslist_with_fcm_id = $db->getUsersFCMId($ucategory);
ChromePhp::log('FCM LIST  '.$userslist_with_fcm_id->num_rows);
// var_dump($userslist_with_fcm_id);
$push->setTitle($messageTitle);
$push->setMessage($messageToSend);
$push->setIsBackground(FALSE);
$json = '';
$response = '';
if ($userslist_with_fcm_id->num_rows > 0) {
while ($row = mysqli_fetch_array($userslist_with_fcm_id)){
ChromePhp::log('FCM ID  '.$row['fcm_id']);
$json = $push->getPush();
$regId = $row['fcm_id'];
$response = $firebase->send($regId, $json);
}
}
else{
echo '<h3>Oops ! You got empty data</h3>';
}
var_dump($response);       
}
?>
<!DOCTYPE html>
<html>
<head>
<title>Admin Panel</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<!-- jQuery UI -->
<link href="https://code.jquery.com/ui/1.10.3/themes/redmond/jquery-ui.css" rel="stylesheet" media="screen">
<!-- Bootstrap -->
<link href="bootstrap/css/bootstrap.min.css" rel="stylesheet">
<!-- styles -->
<link href="css/styles.css" rel="stylesheet">
<link href="//netdna.bootstrapcdn.com/font-awesome/4.0.3/css/font-awesome.css" rel="stylesheet">
<link href="vendors/form-helpers/css/bootstrap-formhelpers.min.css" rel="stylesheet">
<link rel="stylesheet" href="css/pure-min.css">
<link href="css/forms.css" rel="stylesheet">
<!-- HTML5 Shim and Respond.js IE8 support of HTML5 elements and media queries -->
<!-- WARNING: Respond.js doesn't work if you view the page via file:// -->
<!--[if lt IE 9]>
<script src="https://oss.maxcdn.com/libs/html5shiv/3.7.0/html5shiv.js"></script>
<script src="https://oss.maxcdn.com/libs/respond.js/1.3.0/respond.min.js"></script>
<![endif]-->
<style type="text/css">
body{
}
div.container{
width: 1000px;
margin: 0 auto;
position: relative;
}
legend{
font-size: 30px;
color: #555;
}
.btn_send{
background: #00bcd4;
}
label{
margin:10px 0px !important;
}
textarea{
resize: none !important;
}
.fl_window{
width: 400px;
position: absolute;
right: 0;
top:100px;
}
pre, code {
padding:10px 0px;
box-sizing:border-box;
-moz-box-sizing:border-box;
webkit-box-sizing:border-box;
display:block; 
white-space: pre-wrap;  
white-space: -moz-pre-wrap; 
white-space: -pre-wrap; 
white-space: -o-pre-wrap; 
word-wrap: break-word; 
width:100%; overflow-x:auto;
}
</style>
<script type="text/javascript">
function sendMessage()
{
// alert("method called");
var chx = document.getElementsByTagName('input');
for (var i=0; i<chx.length; i++) 
{
// If you have more than one radio group, also check the name attribute
// for the one you want as in && chx[i].name == 'choose'
// Return true from the function on first match of a checked item
if (chx[i].type == 'radio' && chx[i].checked) 
{
// alert("checked: "+chx[i].value);
$.ajax({
url: 'test.php',
type: 'post',
data: {
send:"true",
user_category :chx[i].value,
message_title : document.getElementById('title').value,
message_to_send : document.getElementById('message').value
},
success: function(data, textStatus, jqXHR)
{
//data - response from server
// alert("success  :".textStatus);
},
error: function (jqXHR, textStatus, errorThrown)
{
// alert("failed :".textStatus);
}   
});
}
}
}
</script>
</head>
<body>
<div class="header">
<div class="container">
<div class="row">
<div class="col-md-5">
<!-- Logo -->
<div class="logo">
<h1><a href="index.php">Admin Panel</a></h1>
</div>
</div>
<div class="col-md-5">
</div>
<div class="col-md-6">
<div class="navbar navbar-inverse" role="banner">
<nav class="collapse navbar-collapse bs-navbar-collapse navbar-right" role="navigation">
<ul class="nav navbar-nav">
<li class="dropdown">
<a href="#" class="dropdown-toggle" data-toggle="dropdown">My Account <b class="caret"></b></a>
<ul class="dropdown-menu animated fadeInUp">
<li><a href="updateProfile.php">Update Profile</a></li>
<li><a href="logout.php">Logout</a></li>
</ul>
</li>
</ul>
</nav>
</div>
</div>
</div>
</div>
</div>
<div class="page-content">
<div class="row">
<div class="col-md-2">
<div class="sidebar content-box" style="display: block;">
<ul class="nav">
<!-- Main menu -->
<li><a href="index.php"><i class="glyphicon glyphicon-tasks"></i>App Users</a></li>
<li><a href="halt_sponsors_senate.php"><i class="glyphicon glyphicon-tasks"></i>Senate HALT Supporters</a></li>
<li><a href="halt_sponsors_assembly.php"><i class="glyphicon glyphicon-tasks"></i>Assembly HALT Supporters</a></li>
<li><a href="brief_call_history.php"><i class="glyphicon glyphicon-tasks"></i>Call History</a></li>                   
<li><a href="send_message.php"><i class="glyphicon glyphicon-tasks"></i>Send Messages</a></li>                   
<!-- <li><a href="voice_prompt_form.php"><i class=class="glyphicon glyphicon-tasks"></i>Voice Prompt</a></li> -->
</li>
</ul>
</div>
</div>
<div class="col-md-10">
<div class="row">
<div class="col-md-12">
<div class="content-box-large">
<div class="panel-body">
<form class="pure-form pure-form-stacked" method="POST">
<fieldset>
<legend>Create Message</legend>
<label for="title">Title</label>
<input type="text" value="Support Halt" id="title" name="title" class="pure-input-1-2" placeholder="Enter title">
<label for="message">Message</label>
<textarea class="pure-input-1-2" name="message" id="message" placeholder="Notification message!" rows="5" >Hello World</textarea>
<br>
<h5> 
<input type="radio" id="user_category" name="user_category" value="userswithopponents"> Users with opponents<br>
<br>
<input type="radio" id="user_category" name="user_category" value="userswithsupporters"> Users with supporters<br>
<br>
<input type="radio" id="user_category" name="user_category" value="everyone"> Everyone <br>                                            
<br>
<input type="radio" id="user_category" name="user_category" value="nyresidentsonly"> NY residents only </h5>
</br>
<input type="hidden" name="push_type" value="individual"/>
<button type="submit" class="btn btn-primary" onclick="sendMessage()">Send</button>
</fieldset>
</form>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<link href="vendors/datatables/dataTables.bootstrap.css" rel="stylesheet" media="screen">
<!-- jQuery (necessary for Bootstrap's JavaScript plugins) -->
<script src="https://code.jquery.com/jquery.js"></script>
<!-- jQuery UI -->
<script src="https://code.jquery.com/ui/1.10.3/jquery-ui.js"></script>
<!-- Include all compiled plugins (below), or include individual files as needed -->
<script src="bootstrap/js/bootstrap.min.js"></script>
<script src="vendors/datatables/js/jquery.dataTables.min.js"></script>
<script src="vendors/datatables/dataTables.bootstrap.js"></script>
<script src="js/custom.js"></script>
<script src="js/tables.js"></script>

So, as of now I have tried to iterate over all reg_ids from database & call send method but it didn’t send notifications to any devices .

How to&Answers:

Try to send device ID of multiple devices as an array. In your case,

$registration_ids must be an array of device IDs.

E.g

$registration_ids = array('Device ID 1', 'Device ID 2'); 

Answer:

If you were to send notification via terminal the data part of the curl command would look like this:

{ "registration_ids": ["device_token_1", "device_token_2"], "notification": { "body": "Hello", "title": "Hello", "vibrate": 1, "sound": 1 } } 

PHP code:

$body = array( 'registration_ids' => array("device_token_1", "device_token_2"), 'notification' => array('body' => 'Hello', 'title' => 'Hello', 'vibrate' => 1, 'sound' => 1) ); 

Answer:

$notification_data = $this->common->get_all_record('table name',array()); //get all id from table if($notification_data != NULL){ foreach ($notification_data as $notification_data_row) { $registrationIds = $notification_data_row['token']; #prep the bundle $msg = array ( 'body' => 'body msg', 'title' => 'title', 'icon' => 'myicon',/*Default Icon*/ 'sound' => 'mySound'/*Default sound*/ ); $fields = array ( 'to' => $registrationIds, 'notification' => $msg ); $headers = array ( 'Authorization: key=' . "your key", 'Content-Type: application/json' ); #Send Reponse To FireBase Server $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 ); // echo "<pre>";print_r($result);exit; curl_close ( $ch ); } } 

Answer:

Below is the simple script to send notification. Try this.

<?php $tokens = array('token_1','token_2','token_3'); $title = "Title Here"; $msg = "Subtitle or description Here"; //Custom Parameters if any $customParam = array( 'redirection_id' => '2', 'redirection_type' => 'post_page' //'post_page','category_page','blog_page' ); push_notification_android($tokens,$title,$msg,$customParam); function push_notification_android($tokens,$title,$msg,$customParam) { $url = 'https://fcm.googleapis.com/fcm/send'; $api_key = 'fcm_server_api_key'; $messageArray = array(); $messageArray["notification"] = array ( 'title' => $title, 'message' => $msg, 'customParam' => $customParam, ); $fields = array( 'registration_ids' => $tokens, 'data' => $messageArray, ); $headers = array( 'Authorization: key=' . $api_key, //GOOGLE_API_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) { echo 'Android: Curl failed: ' . curl_error($ch); } // Close connection curl_close($ch); return $result; } ?>