使用PHP将GCM通知发送到多个设备

时间:2017-03-04 04:43:49

标签: php android google-cloud-messaging

我需要将GCM通知发送到多个设备。在这里,我创建了PHP代码以从MySql获取注册ID数组,并尝试向多个设备发送通知,但这里存在一些问题。

我的PHP代码:

<?php 
if($_SERVER['REQUEST_METHOD']=='GET'){

$tags  = $_GET['tags'];
 $api_key = 'My OWN API KEY';   

//Getting registration token we have to make it as array 

//Getting the message 
$message = Testing GCM';
$title= 'Cuboid';
$vibrate= '1';
$sound= '1';


require_once('dbConnect.php');

$user_ids = array();

       foreach ($_REQUEST['tags'] as $key => $val) {
       $user_ids[$key] = filter_var($val, FILTER_SANITIZE_STRING);
        }
        $tagss = "'" . implode("','", $user_ids) . "'";
           $sql = "SELECT user_tags.user_id AS userID , gcm_token.regtoken AS regToken
                   FROM user_tags,gcm_token
                    WHERE tags IN ({$tagss}) AND user_tags.user_id=gcm_token.user_id";


$r = mysqli_query($con,$sql);

 //creating a blank array 
 $result = array();
 $reg_token = array();


 //looping through all the records fetched

    while ($row = mysqli_fetch_array($r)) {
    $result['regToken'][] = $row['regToken'];   
      }

     //Displaying the array in json format 

     echo json_encode(array('result'=>$result));

     $reg_token = (json_encode(array('result'=>$result)));
     //$reg_token = array('result'=>$result);


     $msg = array
(
    'message'   => $message,
    'title'     => $title,
    'subtitle'  => 'Android Push Notification using GCM Demo',
    'tickerText'    => 'Ticker text here...Ticker text here...Ticker text here',
    'vibrate'   => $vibrate,
    'sound'     => $sound,
    'largeIcon' => 'large_icon',
    'smallIcon' => 'small_icon'
);

//Creating a new array fileds and adding the msg array and registration token array here 
$fields = array
(
    'registration_ids'  => $reg_token,
    'data'          => $msg
);

//Adding the api key in one more array header 
$headers = array
(
    'Authorization: key=' . $api_key,
    'Content-Type: application/json'
); 

//Using curl to perform http request 
$ch = curl_init();
curl_setopt( $ch,CURLOPT_URL, 'https://android.googleapis.com/gcm/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 ) );

//Getting the result 
$results = curl_exec($ch );
curl_close( $ch );

//Decoding json from results 
$res = json_decode($results);

      mysqli_close($con);
    }

2 个答案:

答案 0 :(得分:2)

<强>更新

根据updated documentation发送推送通知的API端点已更改 https://android.googleapis.com/gcm/sendhttps://fcm.googleapis.com/fcm/send

旧端点仍然有效,但我建议使用最新端点。 这两个端点的代码保持不变。

试试这个, 声明一个发送通知的函数:

function sendfcmMessage($registrationIds, $msg)
{

    if (!defined('API_ACCESS_KEY')) define('API_ACCESS_KEY', '<PUT_YOUR_KEY_HERE>');
    $fields = array('registration_ids' => $registrationIds, 'data' => $msg, 'content-available' => 1, 'priority' => 'high'); //set priority as required
    $headers = array('Authorization: key=' . API_ACCESS_KEY, 'Content-Type: application/json');
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, 'https://android.googleapis.com/gcm/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;
}

使用它,

    $msg = array('message' => $message,
            'title' => $title, 
            'body' => $body,
            'subtitle' => $subtitle, 
            'tickerText' => $ticker_text, 
            'vibrate' => $vibrate, 
            'sound' => $sound, 
            'largeIcon' => 'large_icon', 
            'smallIcon' => 'small_icon');

    $registrationIds = array();

    while ($row = mysqli_fetch_array($r)) {
        array_push($registrationIdsIOS, $row['regToken'];);
    }

    sendfcmMessage($registrationIds, $msg);

您也可以通过打印此功能的结果进行调试,以了解是否已发送通知,还可以让您知道未发送通知的原因。

echo sendfcmMessage($registrationIds, $msg);

答案 1 :(得分:1)

您必须在JSON数组中获得结果。请尝试以下代码:

<?php

if($_SERVER['REQUEST_METHOD']=='GET'){

$tags  = $_GET['tags'];
// Replace with the real server API key from Google APIs
$apiKey = "YOUR_API_CODE";

$message = "Hello Raja";

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


require_once('dbConnect.php');

$user_ids = array();

       foreach ($_REQUEST['tags'] as $key => $val) {
       $user_ids[$key] = filter_var($val, FILTER_SANITIZE_STRING);
        }
        $tagss = "'" . implode("','", $user_ids) . "'";
           $sql = "SELECT user_tags.user_id AS userID , gcm_token.regtoken AS regToken
                   FROM user_tags,gcm_token
                    WHERE tags IN ({$tagss}) AND user_tags.user_id=gcm_token.user_id";

$r = mysqli_query($con,$sql);

$result = array();



 //looping through all the records fetched

  while ($row = mysqli_fetch_array($r)) {
    $result[] = $row['regToken'];   
}

 //Displaying the array in json format 

   //echo json_encode(array('result'=>$result));

     echo json_encode(($result));

            $registrationIDs = ($result);


    //echo json_encode(array('result'=>$result));


$fields = array(
    'registration_ids' => $registrationIDs,
    'data' => array( "message" => $message ),
);
$headers = array(
    'Authorization: key=' . $apiKey,
    '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);
//curl_setopt( $ch, CURLOPT_POSTFIELDS, json_encode( $fields));

curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
// curl_setopt($ch, CURLOPT_POST, true);
// curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode( $fields));

// Execute post
$result = curl_exec($ch);

// Close connection
curl_close($ch);
echo $result;
//print_r($result);
//var_dump($result);
      }

     ?>