GCM with PHP (Google Cloud Messaging)

后端 未结 13 1442
轮回少年
轮回少年 2020-11-22 04:48

Update: GCM is deprecated, use FCM

How can I integrate the new Google Cloud Messaging in a PHP backend?

相关标签:
13条回答
  • 2020-11-22 05:03
    <?php
        // Replace with the real server API key from Google APIs
        $apiKey = "your api key";
    
        // Replace with the real client registration IDs
        $registrationIDs = array( "reg id1","reg id2");
    
        // Message to be sent
        $message = "hi Shailesh";
    
        // Set POST variables
        $url = 'https://android.googleapis.com/gcm/send';
    
        $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);
    ?>
    
    0 讨论(0)
  • 2020-11-22 05:05

    I actually have this working now in a branch in my Zend_Mobile tree: https://github.com/mwillbanks/Zend_Mobile/tree/feature/gcm

    This will be released with ZF 1.12, however, it should give you some great examples on how to do this.

    Here is a quick demo on how it would work....

    <?php
    require_once 'Zend/Mobile/Push/Gcm.php';
    require_once 'Zend/Mobile/Push/Message/Gcm.php';
    
    $message = new Zend_Mobile_Push_Message_Gcm();
    $message->setId(time());
    $message->addToken('ABCDEF0123456789');
    $message->setData(array(
        'foo' => 'bar',
        'bar' => 'foo',
    ));
    
    $gcm = new Zend_Mobile_Push_Gcm();
    $gcm->setApiKey('MYAPIKEY');
    
    $response = false;
    
    try {
        $response = $gcm->send($message);
    } catch (Zend_Mobile_Push_Exception $e) {
        // all other exceptions only require action to be sent or implementation of exponential backoff.
        die($e->getMessage());
    }
    
    // handle all errors and registration_id's
    foreach ($response->getResults() as $k => $v) {
        if ($v['registration_id']) {
            printf("%s has a new registration id of: %s\r\n", $k, $v['registration_id']);
        }
        if ($v['error']) {
            printf("%s had an error of: %s\r\n", $k, $v['error']);
        }
        if ($v['message_id']) {
            printf("%s was successfully sent the message, message id is: %s", $k, $v['message_id']);
        }
    }
    
    0 讨论(0)
  • 2020-11-22 05:06

    This code will send a GCM message to multiple registration IDs via PHP CURL.

    // Payload data you want to send to Android device(s)
    // (it will be accessible via intent extras)    
    $data = array('message' => 'Hello World!');
    
    // The recipient registration tokens for this notification
    // https://developer.android.com/google/gcm/    
    $ids = array('abc', 'def');
    
    // Send push notification via Google Cloud Messaging
    sendPushNotification($data, $ids);
    
    function sendPushNotification($data, $ids) {
        // Insert real GCM API key from the Google APIs Console
        // https://code.google.com/apis/console/        
        $apiKey = 'abc';
    
        // Set POST request body
        $post = array(
                        'registration_ids'  => $ids,
                        'data'              => $data,
                     );
    
        // Set CURL request headers 
        $headers = array( 
                            'Authorization: key=' . $apiKey,
                            'Content-Type: application/json'
                        );
    
        // Initialize curl handle       
        $ch = curl_init();
    
        // Set URL to GCM push endpoint     
        curl_setopt($ch, CURLOPT_URL, 'https://gcm-http.googleapis.com/gcm/send');
    
        // Set request method to POST       
        curl_setopt($ch, CURLOPT_POST, true);
    
        // Set custom request headers       
        curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
    
        // Get the response back as string instead of printing it       
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    
        // Set JSON post data
        curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($post));
    
        // Actually send the request    
        $result = curl_exec($ch);
    
        // Handle errors
        if (curl_errno($ch)) {
            echo 'GCM error: ' . curl_error($ch);
        }
    
        // Close curl handle
        curl_close($ch);
    
        // Debug GCM response       
        echo $result;
    }
    
    0 讨论(0)
  • 2020-11-22 05:06

    A lot of the tutorials are outdated, and even the current code doesn't account for when device registration_ids are updated or devices unregister. If those items go unchecked, it will eventually cause issues that prevent messages from being received. http://forum.loungekatt.com/viewtopic.php?t=63#p181

    0 讨论(0)
  • 2020-11-22 05:08

    You can use this PHP library available on packagist:

    https://github.com/CoreProc/gcm-php

    After installing it you can do this:

    $gcmClient = new GcmClient('your-gcm-api-key-here');
    
    $message = new Message($gcmClient);
    
    $message->addRegistrationId('xxxxxxxxxx');
    $message->setData([
        'title' => 'Sample Push Notification',
        'message' => 'This is a test push notification using Google Cloud Messaging'
    ]);
    
    try {
    
        $response = $message->send();
    
        // The send() method returns a Response object
        print_r($response);
    
    } catch (Exception $exception) {
    
        echo 'uh-oh: ' . $exception->getMessage();
    
    }
    
    0 讨论(0)
  • 2020-11-22 05:11

    It's easy to do. The cURL code that's on the page that Elad Nava has put here works. Elad has commented about the error he's receiving.

    String describing an error that occurred while processing the message for that recipient. The possible values are the same as documented in the above table, plus "Unavailable" (meaning GCM servers were busy and could not process the message for that particular recipient, so it could be retried).

    I've got a service set up already that seems to be working (ish), and so far all I've had back are unavailable returns from Google. More than likely this will change soon.

    To answer the question, use PHP, make sure the Zend Framework is in your include path, and use this code:

    <?php
        ini_set('display_errors',1);
        include"Zend/Loader/Autoloader.php";
        Zend_Loader_Autoloader::getInstance();
    
        $url = 'https://android.googleapis.com/gcm/send';
        $serverApiKey = "YOUR API KEY AS GENERATED IN API CONSOLE";
        $reg = "DEVICE REGISTRATION ID";
    
        $data = array(
                'registration_ids' => array($reg),
                'data' => array('yourname' => 'Joe Bloggs')
        );
    
        print(json_encode($data));
    
        $client = new Zend_Http_Client($url);
        $client->setMethod('POST');
        $client->setHeaders(array("Content-Type" => "application/json", "Authorization" => "key=" . $serverApiKey));
        $client->setRawData(json_encode($data));
        $request = $client->request('POST');
        $body = $request->getBody();
        $headers = $request->getHeaders();
        print("<xmp>");
        var_dump($body);
        var_dump($headers);
    

    And there we have it. A working (it will work soon) example of using Googles new GCM in Zend Framework PHP.

    0 讨论(0)
提交回复
热议问题