Search code examples
phpandroidpush-notificationandroid-c2dm

C2DM implementation PHP code


I am creating the Android application where C2DM push notification is used. But i have a problem in creating the php code to use c2dm for sending messages. please guide me how to use the php code to send the messages. Actually there is a problem regarding this that how to get client auth token. I have seen the http://code.google.com/android/c2dm/index.html#server url but according to this i have created the android application and i got the registration id also and i also send to the user but how server uses this to send the application.

is there anything needed for the server from the android device to send the messages?.


Solution

  • To register your own server system and obtain the Authorise Tokens (this is what Cpt. Ohlund proposed):

    function googleAuthenticate($username, $password, $source="Company-AppName-Version", $service="ac2dm") {    
    
    
            session_start();
            if( isset($_SESSION['google_auth_id']) && $_SESSION['google_auth_id'] != null)
                return $_SESSION['google_auth_id'];
    
            // get an authorization token
            $ch = curl_init();
            if(!ch){
                return false;
            }
    
            curl_setopt($ch, CURLOPT_URL, "https://www.google.com/accounts/ClientLogin");
            $post_fields = "accountType=" . urlencode('HOSTED_OR_GOOGLE')
                . "&Email=" . urlencode($username)
                . "&Passwd=" . urlencode($password)
                . "&source=" . urlencode($source)
                . "&service=" . urlencode($service);
            curl_setopt($ch, CURLOPT_HEADER, true);
            curl_setopt($ch, CURLOPT_POST, true);
            curl_setopt($ch, CURLOPT_POSTFIELDS, $post_fields);
            curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
            curl_setopt($ch, CURLOPT_FRESH_CONNECT, true);    
            curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_ANY);
            curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
    
            // for debugging the request
            //curl_setopt($ch, CURLINFO_HEADER_OUT, true); // for debugging the request
    
            $response = curl_exec($ch);
    
            //var_dump(curl_getinfo($ch)); //for debugging the request
            //var_dump($response);
    
            curl_close($ch);
    
            if (strpos($response, '200 OK') === false) {
                return false;
            }
    
            // find the auth code
            preg_match("/(Auth=)([\w|-]+)/", $response, $matches);
    
            if (!$matches[2]) {
                return false;
            }
    
            $_SESSION['google_auth_id'] = $matches[2];
            return $matches[2];
        }
    

    To send a message to a phone:

    // $msgType: all messages with same type may be "collapsed": if multiple are sent,
    // only the last will be received by phone. 
    function sendMessageToPhone($authCode, $deviceRegistrationId, $msgType, $messageText) {
    
                $headers = array('Authorization: GoogleLogin auth=' . $authCode);
                $data = array(
                    'registration_id' => $deviceRegistrationId,
                    'collapse_key' => $msgType,
                    'data.message' => $messageText //TODO Add more params with just simple data instead           
                );
    
                $ch = curl_init();
    
                curl_setopt($ch, CURLOPT_URL, "https://android.apis.google.com/c2dm/send");
                if ($headers)
                curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
                curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
                curl_setopt($ch, CURLOPT_POST, true);
                curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
                curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
    
    
                $response = curl_exec($ch);
    
                curl_close($ch);
    
                return $response;
            }