2011-02-06 70 views
2

我正在建立我自己的C2DM應用程序。我首先從一個小的Android應用程序開始測試推送功能。如果我只是在我的shell中使用正確的設置調用curl命令,它就可以工作。C2DM服務器與PHP 401錯誤

現在爲服務器部分我想使用PHP,但因爲它看起來我做錯了什麼,因爲當我嘗試發送消息到客戶端時,我總是收到401錯誤消息。首先,代碼由兩部分組成。第一個curl請求請求服務器令牌。這工作,我得到一個真正的響應從谷歌與工作令牌!

第二個捲曲請求以401錯誤消息結束。任何想法我做錯了什麼?

$post_params = array ("Email" => $MY_GOOGLE_ACC, "Passwd" => $MY_GOOGLE_PWD, "accountType"=>"GOOGLE", "source=" . $MY_GOOGLE_SRC, "service=ac2dm"); 

    $first = true; 
    $data_msg = ""; 

    foreach ($post_params as $key => $value) { 
    if ($first) 
     $first = false; 
    else 
     $data_msg .= "&"; 

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

    $x = curl_init("https://www.google.com/accounts/ClientLogin"); 

    curl_setopt($x, CURLOPT_HEADER, 1); 
    curl_setopt($x, CURLOPT_POST, 1); 
    curl_setopt($x, CURLOPT_POSTFIELDS, $data_msg); 
    curl_setopt($x, CURLOPT_RETURNTRANSFER, 1); 
    $data = curl_exec($x); 
    curl_close($x); 
    $response = $data; 

    $authKey = trim(substr($response, 4+strpos($response, "SID="))); 

    echo $authKey; 
    $collapse_key = 'something'; 

    $post_params = array ("registration_id" => $DEVICE_TOKEN, "collapse_key" => $collapse_key, "data.payload"=>"cakephp"); 

    $first = true; 
    $data_msg = ""; 

    foreach ($post_params as $key => $value) { 
    if ($first) 
     $first = false; 
    else 
     $data_msg .= "&"; 

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

    $size=strlen($data_msg); 


    $x = curl_init("https://android.apis.google.com/c2dm/send"); 
    curl_setopt($x, CURLOPT_HTTPHEADER, array('Content-Type: application/x-www-form-urlencoded', 'Content-Length:'. $size, 'Authorization: GoogleLogin auth=' . $authKey)); 
    curl_setopt($x, CURLOPT_HEADER, 1); 
    curl_setopt($x, CURLOPT_POST, 1); 
    curl_setopt($x, CURLOPT_POSTFIELDS, $data_msg); 
    curl_setopt($x, CURLOPT_RETURNTRANSFER, 1); 
    $data = curl_exec($x); 
    curl_close($x); 
    $response = $data; 
+0

好的。我不知道爲什麼,但沒有任何工作了。即使我捲曲的例子,我總是得到一個401錯誤。現在,如果我嘗試認證自己,我會得到一個SID,LSID和Auth Token。我不確定昨天是否一樣?我想昨天我只拿回了1個令牌。但我必須稍後再檢查一次。 什麼改變也許是我換電腦。我再也不在同一臺計算機上了,因爲我昨天嘗試了所有工作。這可能需要做些什麼嗎? – nino 2011-02-07 13:04:59

+0

嗨,尼諾!我只是複製你在網上發佈的代碼,而且我也遇到同樣的401問題。所以......你能告訴我你是如何解決這個問題的,或者你可以發佈你的工作代碼給我嗎?謝謝你的幫助!你的 – 2011-02-14 12:56:41

回答

2

key'd數組使用捲曲的示例。這幾乎是我正在工作的確切代碼(爲了清晰起見進行了細微的更改)。

$headers = array('Authorization: GoogleLogin auth=' . $authcode); 
$data = array(
    'registration_id' => $device_registration_id, 
    'collapse_key' => 'ck_' . $device_id, 
    'data.arg' => 'arrrrghhh' 
); 

$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, 0); 
curl_setopt($ch, CURLOPT_POST, true); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
curl_setopt($ch, CURLOPT_POSTFIELDS, $data); 

curl_exec($ch); 

$ authcode是ClientLogin返回的SID。 $ device_registration_id是我們做C2DM_REGISTER時手機上的客戶端應用程序給我們的註冊ID。

希望有所幫助。

0

我不完全確定這裏發生了什麼,但這裏有一點區別,我從我的應用程序服務器注意到工作正常。

在curl_setopt調用CURLOPT_HTTPHEADER時,內容長度和大小之間沒有空格。這'不應該引起問題,但我已經看到網絡服務器之前像這樣愚蠢的東西得到tempremental。

另外,CURLOPT_POSTFIELDS是一個字符串,而我將它作爲key'd數組發送。

除此之外,我看起來與我的工作代碼相同。

+0

我在內容長度和大小之間添加了空格,但仍然沒有任何內容。 你能告訴我一個關於如何在CURL中使用key'd數組的例子嗎? – nino 2011-02-07 10:14:55

1

嘗試註冊您的應用程序here。我有同樣的問題。