Android推送通知PHP代码在第三方服务器中不起作用,在本地服务器中工作

Posted

技术标签:

【中文标题】Android推送通知PHP代码在第三方服务器中不起作用,在本地服务器中工作【英文标题】:Android push notification PHP code not working in 3rd party server, working in local server 【发布时间】:2011-11-06 12:24:48 【问题描述】:

我只是想测试一个带有 android 推送通知 (C2DM) 的应用程序,我确信 android 代码没有任何问题。我正在使用 php 代码连接到推送服务器并发送消息,它在我的本地服务器上工作正常。

但如果我在第三方服务器上运行相同的程序,它就不会运行。它没有给我任何错误消息。它显示“HTTP 状态 200 OK”作为响应。

我正在添加代码供您参考,我是从某个网站获得的。

<?php    
    $username ="push_enabled_email_id@gmail.com";  
    $password = "password"; 
    $source="My-Server-Event-Alerter"; //anything that says about ur app  
    $service="ac2dm";  

    // local server
    $message =$_GET ['message']; 

    if ($_GET ['message'] != '' )  
      
        $message =$_GET ['message']; 
        echo 'Message sent to server '.$message;  

        $post_params = array( 
                        "Email" => $username, 
                        "Passwd" => $password, 
                        "accountType"=>"HOSTED_OR_GOOGLE", 
                        "source" => $source,
                        "service"=>$service 
                        );   

        $first = true;  
        $data_msg = "";  

        foreach ($post_params as $key => $value)
          

            if ($first)  
                $first = false;  
            else  
                $data_msg .= "&";  

            $data_msg .= urlencode($key) ."=". urlencode($value);  
        

        $ch = curl_init();
        curl_setopt($ch, CURLOPT_URL, "https://www.google.com/accounts/ClientLogin");  

        $data = array(
                    'accountType' => HOSTED_OR_GOOGLE,  
                    'Email' => $username,
                    'Passwd' => $password,
                    'source'=> $source, 
                    'service'=>$service
                    ); 

        curl_setopt($ch, CURLOPT_HEADER, true);
        curl_setopt($ch, CURLOPT_POST, true);
        curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
        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
        $response = curl_exec($ch);

        curl_close($ch);   
        echo $response;   
        $pos = strpos($response, "Auth=");  
        $authKey = trim(substr($response, 5+$pos));  
        echo $authKey;  

        echo 'Device Token: '. $deviceToken . '';  
        $data = array(  
        'registration_id' => $deviceToken,  
        'collapse_key' => 'ck_' . 'col_key',  
        'data.message' => $message,  
        'data.title' =>'Request Push Demo'
        );  

        //$data = (is_array($data)) ? http_build_query($data) : $data;   

        $ch = curl_init();  

        curl_setopt($ch, CURLOPT_URL, "https://android.apis.google.com/c2dm/send");  
        echo 'Content-Length:'.strlen($data);  
        $headers = array('Authorization: GoogleLogin auth=' . $authKey,'Content-Length:'.strlen($data));  
        if($headers)
          
            curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);  
        

        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);  
        curl_setopt($ch, CURLOPT_POST, true);  
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);  
        curl_setopt($ch, CURLOPT_POSTFIELDS, $data);  
        curl_setopt($ch, CURLINFO_HEADER_OUT, true);
        $messagedata = curl_exec($ch);
        //var_dump(curl_getinfo($ch)); //for debugging the request
        //var_dump($messagedata); 
        // echo $messagedata;  
        curl_close($ch);  
      
?>  



<html>
<form action ="./c2dmtest2.php" method="get" enctype="application/x-www-form-urlencoded" name="Send Notification" target="_self">  
<label>Push Message  
<input name="message" type="text" size="50" maxlength="50"></label>  
<input name="Send Message" type="submit" value="Send Message">  
</form>
</html>

【问题讨论】:

您是否确认两台服务器都安装了相同的扩展?特别是卷曲?无效或不受信任的 SSL 连接是否存在问题?您可能必须将 CURL 设置为接受任何 SSL 证书而不对其进行验证。 您是否从 curl_error() 收到任何 CURL 消息? try GCM.time 已更改。 您能否将示例代码中注释的 var_dump 的输出排除在外? 【参考方案1】:

您能否在代码顶部添加以下行,以便查看潜在错误:

error_reporting(E_ALL);
ini_set('display_errors', '1');

【讨论】:

以上是关于Android推送通知PHP代码在第三方服务器中不起作用,在本地服务器中工作的主要内容,如果未能解决你的问题,请参考以下文章

推送通知在android studio中不起作用

2195端口是强制要求开放的吗? IOS 推送通知在 php 中不起作用,而 Ios 推送通知在 laravel 中没有进入移动设备

JSON对象压缩同时使用php发送推送通知ios/android

FCM 推送通知在 android 中不起作用(使用 cordova-plugin-fcm 2.1.1 的 Ionic 项目)

推送通知在android中获得多次

推送通知在 Iphone 中不起作用