Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
.settings/
.project
.buildpath
226 changes: 119 additions & 107 deletions GCMPushMessage.php
Original file line number Diff line number Diff line change
@@ -1,111 +1,123 @@
<?php
/*
Class to send push notifications using Google Cloud Messaging for Android

Example usage
-----------------------
$an = new GCMPushMessage($apiKey);
$an->setDevices($devices);
$response = $an->send($message);
-----------------------

$apiKey Your GCM api key
$devices An array or string of registered device tokens
$message The mesasge you want to push out

@author Matt Grundy

Adapted from the code available at:
http://stackoverflow.com/questions/11242743/gcm-with-php-google-cloud-messaging

*/
/**
* Class to send push notifications using Google Cloud Messaging for Android
*
* Example usage
* -----------------------
* $an = new GCMPushMessage($apiKey);
* $an->setDevices($devices);
* $response = $an->send($message);
* -----------------------
*
* $apiKey Your GCM api key
* $devices An array or string of registered device tokens
* $message The mesasge you want to push out
*
* @author Matt Grundy
*
* Adapted from the code available at:
* http://stackoverflow.com/questions/11242743/gcm-with-php-google-cloud-messaging
*
* Modify: Artem Yankovskiy ([email protected])
*
**/
class GCMPushMessage {

var $url = 'https://android.googleapis.com/gcm/send';
var $serverApiKey = "";
var $devices = array();

/*
Constructor
@param $apiKeyIn the server API key
*/
function GCMPushMessage($apiKeyIn){
$this->serverApiKey = $apiKeyIn;
}

/*
Set the devices to send to
@param $deviceIds array of device tokens to send to
*/
function setDevices($deviceIds){

if(is_array($deviceIds)){
$this->devices = $deviceIds;
} else {
$this->devices = array($deviceIds);
}

}

/*
Send the message to the device
@param $message The message to send
@param $data Array of data to accompany the message
*/
function send($message, $data = false){

if(!is_array($this->devices) || count($this->devices) == 0){
$this->error("No devices set");
}

if(strlen($this->serverApiKey) < 8){
$this->error("Server API Key not set");
}

$fields = array(
'registration_ids' => $this->devices,
'data' => array( "message" => $message ),
);

if(is_array($data)){
foreach ($data as $key => $value) {
$fields['data'][$key] = $value;
}
}

$headers = array(
'Authorization: key=' . $this->serverApiKey,
'Content-Type: application/json'
);

// Open connection
$ch = curl_init();

// Set the url, number of POST vars, POST data
curl_setopt( $ch, CURLOPT_URL, $this->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 ) );

// Avoids problem with https certificate
curl_setopt( $ch, CURLOPT_SSL_VERIFYHOST, false);
curl_setopt( $ch, CURLOPT_SSL_VERIFYPEER, false);

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

// Close connection
curl_close($ch);

return $result;
}

function error($msg){
echo "Android send notification failed with error:";
echo "\t" . $msg;
exit(1);
}
private $url = 'https://android.googleapis.com/gcm/send';
private $serverApiKey = "";
private $devices = array();

/**
* Constructor
* @param $apiKeyIn the server API key
*/
function __construct($apiKeyIn) {
$this->serverApiKey = $apiKeyIn;
}

/**
* Set the devices to send to
* @param mixed $deviceIds array of devices tokens for send to
*/
public function setDevices($deviceIds) {

if (is_array($deviceIds)) {
$this->devices = $deviceIds;
} else {
$this->devices = array($deviceIds);
}
}

/**
* Send data to the device
* @param string $message data for send
* @param mixed $data (optional) array of data to accompany the message
* @param string $collapseKey (optional) collapse key for message
* @return assoc array ("body", "http_code")
*/
public function send($message, $data = false, $collapseKey = null) {

if (!is_array($this->devices) || count($this->devices) == 0) {
$this->error("No devices set");
}

if (strlen($this->serverApiKey) < 8) {
$this->error("Server API Key not set");
}

$fields = array(
'registration_ids' => $this->devices,
'data' => array( "message" => $message )
);

if (isset($collapseKey)) {
$fields["collapse_key"] = $collapseKey;
}

if (is_array($data)) {
foreach ($data as $key => $value) {
$fields['data'][$key] = $value;
}
}

$headers = array(
'Authorization: key=' . $this->serverApiKey,
'Content-Type: application/json'
);

// Open connection
$ch = curl_init();

// Set the url, number of POST vars, POST data
curl_setopt( $ch, CURLOPT_URL, $this->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 ) );

// Avoids problem with https certificate
curl_setopt( $ch, CURLOPT_SSL_VERIFYHOST, false);
curl_setopt( $ch, CURLOPT_SSL_VERIFYPEER, false);

// Execute post
$httpBody = curl_exec($ch);
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);

// Close connection
curl_close($ch);

return array("http_body" => $httpBody, "http_code" => $httpCode);
}

/**
* Prints error message to screen and exit from app
* @param string $msg error message
*/
private function error($msg) {
echo "Android send notification failed with error:";
echo "\t" . $msg;
exit(1);
}
}