2012-07-12 161 views
1

我想通過PHP將我的服務器發送的消息發送到手機。 這裏是我的代碼:Google GCM服務器返回404錯誤

$apiKey = "AIxxxxxxxxxxxxxxxxxxxx"; 

    $registrationIDs = array($c2dmId); 

    $url = "https://android.googleapis.com/gcm/send"; 

    $headers = array( 
         'Authorization: key='.$apiKey, 
         'Content-Type: application/json' 
        ); 

    $fields = array(
        'collapse_key'  => $collapseKey, 
        'data'    => array( 
         "type"  => $msgType, 
         "extra"  => $msgExtra, 
         "uuid"  => $uuid, 
         "user_id" => $userId), 
        'registration_ids' => $registrationIDs, 
        ); 

    print (json_encode($fields)); 
    echo "<br/>"; 

    $ch = curl_init(); 

    curl_setopt($ch, CURLOPT_URL, $url); 

    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); 
    curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); 
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 

    curl_setopt($ch, CURLOPT_POST, true); 
    curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($fields)); 

    $result = curl_exec($ch); 
    $resultInfo = curl_getinfo($ch); 

    echo "resultinfo: $resultInfo <br>"; 
    foreach ($resultInfo as $key => $value) { 
     echo "$key => $value <br>"; 
    } 

    curl_close($ch); 
    die ("Result: $result"); 

其中$ c2dmId只是registrationId我發送到服務器的電話。因此,我得到(在$結果變量):

<HTML> 
<HEAD> 
<TITLE>Not Found</TITLE> 
</HEAD> 
<BODY BGCOLOR="#FFFFFF" TEXT="#000000"> 
<H1>Not Found</H1> 
<H2>Error 404</H2> 
</BODY> 
</HTML> 

我不知道爲什麼。誰能幫忙?文檔沒有說404代碼的任何內容,所以我真的不知道發生了什麼。

+0

404表示您嘗試連接的服務url不存在。 http://en.wikipedia.org/wiki/HTTP_404 – sunil 2012-07-12 12:10:21

+0

嗯...我知道,但我真的不知道它爲什麼說這在我的情況。我從[鏈接](http://developer.android.com/guide/google/gcm/gcm.html)獲得網址,所以它應該是好的,不是嗎?我真的不知道爲什麼我會得到404 :( – anula 2012-07-12 12:48:48

回答

4

哦,我完全忘了這個問題,抱歉了點。我已經找出問題所在。 早些時候,我使用了之前發佈的通過C2DM發送消息的代碼。我只做了一些改進,將其調整爲GCM。其中一個變量($ msgExtra)在某些情況下可能等於null。這是預期的行爲,並與C2DM它工作得很好。 不幸的是,當你嘗試通過GCM在JSON傳遞空你得到404錯誤,儘管GCM文件沒有提到這... 所以我貼的代碼是很好的,只要你不嘗試發送無效。 我的問題的解決方案是用類似「」的東西來替換空值。 再次 - 抱歉,我剛剛發佈它,我完全忘了這個問題。

+0

感謝張貼答案。我相信這將有助於人很多。 – dnkoutso 2012-08-10 22:57:33

+0

確認這有助於這是GCM中的一個重大缺陷,就我而言,它並不真正支持JSON,如果它在你發送一個有效的序列化的值給你的應用程序使用時這樣翻轉,某些字段爲空(而不是0或''或另一個空模仿者)可能正是你需要推送到你的應用程序的東西。 – jeffcook2150 2012-09-10 22:31:42

+1

經過幾個小時的調試,我在這裏找到了我的答案,該死的GCM,你應該編寫適當的JSON解析器。 – est 2012-09-21 01:21:43

0

生成從谷歌API控制檯瀏覽器的API密鑰,並在「授權」頭用它代替服務器密鑰。一旦你這麼做,這個錯誤就會消失。

這是通過在規定你應該使用在Authorization頭一個服務器密鑰(如書面Over here)的GCM文件一個嚴重的錯誤造成的。

+0

不幸的是它並沒有幫助,我已經閱讀了關於StackOverflow的這個錯誤,所以我使用了「Key for browser apps(with referers)」,當我打開GCM。您的文章後,我產生新的密鑰,但它也這麼想的工作。不過404,但感謝您的幫助 – anula 2012-07-12 13:20:50

0

可它已經解決了you.But這裏是你的代碼,我在測試設備的工作版本。

<?php 

$apiKey = "AI....."; 

$registrationIDs = array("You registration key" ); 

$url = "https://android.googleapis.com/gcm/send"; 

$headers = array( 
        'Authorization: key='.$apiKey, 
        'Content-Type: application/json' 
       ); 

$msgType = "hello"; 
$msgExtra = "rock"; 
$uuid = '1234'; 
$userId = '5678'; 

/* data you need to define message you want to send in APP.For ex: here myssg in what i am fetching at client side, so in notification it will show hello. You can change accordingly. */ 
$fields = array(
       'collapse_key'  => $collapseKey, 
       'data'    => array( 
        "mymsg"  => $msgType, 
        "extra"  => $msgExtra, 
        "uuid"  => $uuid, 
        "user_id" => $userId), 
       'registration_ids' => $registrationIDs, 
       ); 

print (json_encode($fields)); 
echo "<br/>"; 

$ch = curl_init(); 

curl_setopt($ch, CURLOPT_URL, $url); 

curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); 
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 

curl_setopt($ch, CURLOPT_POST, true); 
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($fields)); 

$result = curl_exec($ch); 
$resultInfo = curl_getinfo($ch); 

echo "resultinfo: $resultInfo <br>"; 
foreach ($resultInfo as $key => $value) { 
    echo "$key => $value <br>"; 
} 

curl_close($ch); 
die ("Result: $result"); 
?> 

這不會給你404錯誤。希望這會幫助你或者一些在PHP中尋找服務器端的實現。

相關問題