-
-
Save trbsi/44a52a7208661359bf35 to your computer and use it in GitHub Desktop.
Simple PHP script to send Android Push Notification, iOS Push Notification and Windows Phone 8 Push Notification
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?php | |
// Server file | |
class PushNotifications | |
{ | |
// (Android)API access key from Google API's Console. | |
private static $API_ACCESS_KEY = 'AIzaSyDG3fYAXXXXX-XXXXXJyJXiO5JagAsYI'; | |
// (iOS) Private key's passphrase. | |
private static $passphrase = 'joashp'; | |
// (Windows Phone 8) The name of our push channel. | |
private static $channelName = "joashp"; | |
// Change the above three vriables as per your app. | |
public function __construct() { | |
exit('Init function is not allowed'); | |
} | |
// Sends Push notification for Android users | |
public static function android($data, $reg_id) { | |
$url = 'https://android.googleapis.com/gcm/send'; | |
$message = array( | |
'title' => $data['mtitle'], | |
'message' => $data['mdesc'], | |
'subtitle' => '', | |
'tickerText' => '', | |
'msgcnt' => 1, | |
'vibrate' => 1 | |
); | |
$headers = array( | |
'Authorization: key=' .self::$API_ACCESS_KEY, | |
'Content-Type: application/json' | |
); | |
$fields = array( | |
'registration_ids' => $reg_id, | |
'data' => $message, | |
); | |
return self::useCurl($url, $headers, json_encode($fields)); | |
} | |
// Sends Push's toast notification for Windows Phone 8 users | |
public static function WP($data, $uri) { | |
$delay = 2; | |
$msg = "<?xml version=\"1.0\" encoding=\"utf-8\"?>" . | |
"<wp:Notification xmlns:wp=\"WPNotification\">" . | |
"<wp:Toast>" . | |
"<wp:Text1>".htmlspecialchars($data['mtitle'])."</wp:Text1>" . | |
"<wp:Text2>".htmlspecialchars($data['mdesc'])."</wp:Text2>" . | |
"</wp:Toast>" . | |
"</wp:Notification>"; | |
$sendedheaders = array( | |
'Content-Type: text/xml', | |
'Accept: application/*', | |
'X-WindowsPhone-Target: toast', | |
"X-NotificationClass: $delay" | |
); | |
$response = self::useCurl($uri, $sendedheaders, $msg); | |
$result = array(); | |
foreach(explode("\n", $response) as $line) { | |
$tab = explode(":", $line, 2); | |
if (count($tab) == 2) | |
$result[$tab[0]] = trim($tab[1]); | |
} | |
return $result; | |
} | |
public static function iOS($data, $deviceTokens) | |
{ | |
if(Api::SANDBOX==true) | |
{ | |
$applePushGateway="ssl://gateway.sandbox.push.apple.com:2195"; | |
$ckpem="ck_sandbox.pem"; | |
} | |
else | |
{ | |
$applePushGateway="ssl://gateway.push.apple.com:2195"; | |
$ckpem="ck_production.pem"; | |
} | |
$ctx = stream_context_create(); | |
// ck.pem is your certificate file | |
stream_context_set_option($ctx, 'ssl', 'local_cert', $ckpem); //PUT THIS .pem file IN A DIRECTORY WHERE YOU EXECUTE TestNotifications.php | |
stream_context_set_option($ctx, 'ssl', 'passphrase', self::$passphrase); | |
// Open a connection to the APNS server | |
$fp = stream_socket_client( | |
$applePushGateway, $err, | |
$errstr, 60, STREAM_CLIENT_CONNECT|STREAM_CLIENT_PERSISTENT, $ctx); | |
if (!$fp) | |
{ | |
return false; | |
exit("Failed to connect: $err $errstr" . PHP_EOL); | |
} | |
// Create the payload body | |
$body['aps'] = | |
[ | |
'alert' => | |
[ | |
'title' => $data['title'], | |
'body' => $data['body'], | |
], | |
'sound' => $data['sound'], | |
]; | |
//only if badge is set, send it | |
if(isset($data['badge'])) | |
$body['aps']['badge']=(int)$data['badge']; | |
// Encode the payload as JSON | |
$payload = json_encode($body); | |
//if you have multiple tokens for one user or if you want to send notifications to more user take all the tokens you need and put in array and use foreach to send notification, this way is faster because connection to apple server is opened during sending | |
foreach($deviceTokens as $deviceToken) | |
{ | |
// Build the binary notification | |
$msg = chr(0).pack('n', 32).pack('H*', $deviceToken).pack('n', strlen($payload)).$payload; | |
// Send it to the server | |
$result = fwrite($fp, $msg, strlen($msg)); | |
} | |
// Close the connection to the server | |
fclose($fp); | |
if (!$result) | |
return false; //return 'Message not delivered' . PHP_EOL; | |
else | |
return true; //return 'Message successfully delivered' . PHP_EOL; | |
} | |
// Curl | |
private static function useCurl($url, $headers, $fields = null) { | |
// Open connection | |
$ch = curl_init(); | |
if ($url) { | |
// 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); | |
if ($fields) { | |
curl_setopt($ch, CURLOPT_POSTFIELDS, $fields); | |
} | |
// Execute post | |
$result = curl_exec($ch); | |
if ($result === FALSE) { | |
die('Curl failed: ' . curl_error($ch)); | |
} | |
// Close connection | |
curl_close($ch); | |
return $result; | |
} | |
} | |
} | |
?> |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?php | |
require_once('PushNotifications.php'); | |
// Message payload | |
$msg_payload = array ( | |
'mtitle' => 'Test push notification title', | |
'mdesc' => 'Test push notification body', | |
); | |
// For Android | |
// get this from android, inside code | |
$regId[] = 'APA91bHdOmMHiRo5jJRM1jvxmGqhComcpVFDqBcPfLVvaieHeFI9WVrwoDeVVD1nPZ82rV2DxcyVv-oMMl5CJPhVXnLrzKiacR99eQ_irrYogy7typHQDb5sg4NB8zn6rFpiBuikNuwDQzr-2abV6Gl_VWDZlJOf4w'; | |
$regId[] = 'ADS546JRM1jvxmGqhComcpVFDqBcPfFGHGFjH68D1nPZ82rV2DxcyVv-oMMl5CJPhVXnLrzKiacR99eQ_irrYogy7typHQDb5sg4NB8zn6rFpiBuikNuwDQzrjJhvHJJHU7787'; | |
// For iOS | |
//get this from iOS, inside code | |
$deviceToken[] = 'FE66489F304DC75B8D6E8200DFF8A456E8DAEACEC428B427E9518741C92C6660'; | |
$deviceToken[] = 'FEdd56g4DC75B8D6E8200DFF8A456E8DAfdgfdjhfhhC428B45hddf5df92C6660'; | |
$deviceToken[] = 'dfgggt5677456E8DAfdgfdjhfhhCffndjjiweplk47snn444999sjjgnnmqww6660'; | |
// For WP8 | |
$uri = 'http://s.notify.live.net/u/1/sin/HmQAAAD1XJMXfQ8SR0b580NcxIoD6G7hIYP9oHvjjpMC2etA7U_xy_xtSAh8tWx7Dul2AZlHqoYzsSQ8jQRQ-pQLAtKW/d2luZG93c3Bob25lZGVmYXVsdA/EKTs2gmt5BG_GB8lKdN_Rg/WuhpYBv02fAmB7tjUfF7DG9aUL4'; | |
// Replace the above variable values | |
PushNotifications::android($msg_payload, $regId); | |
PushNotifications::WP8($msg_payload, $uri); | |
PushNotifications::iOS($msg_payload, $deviceToken); | |
?> |
Put ".pem" file in a folder where you execute TestNotifications.php
When I use your fork I get the following PHP error... any suggestions?
PHP Strict Standards: Non-static method PushNotifications::useCurl() should not be called statically
It should work, since useCurl is static method private static function useCurl()
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Little tutorial for Android Notifications
https://trinitytuts.com/android-push-notification-using-gcm/
In this tutorial you will be asked for GOOGLE_PROJECT_ID:
for iOS
http://www.raywenderlich.com/32960/apple-push-notification-services-in-ios-6-tutorial-part-1