Я хочу отправить сообщение с моего сервера на телефон, через PHP. Вот мой код:
$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 – это только регистрация, которую я отправляю на сервер с телефона. В результате я получаю (в переменной $ result):
<HTML> <HEAD> <TITLE>Not Found</TITLE> </HEAD> <BODY BGCOLOR="#FFFFFF" TEXT="#000000"> <H1>Not Found</H1> <H2>Error 404</H2> </BODY> </HTML>
И я не знаю, почему. Может ли кто-нибудь помочь? Документация ничего не говорит о коде 404, поэтому я действительно не знаю, что происходит.
О, я совсем забыл об этом вопросе, извините за это. Я уже выяснил, в чем проблема. Раньше я использовал этот код, который я разместил ранее, чтобы отправлять сообщения через C2DM. Я сделал несколько улучшений, чтобы настроить его на GCM. И одна из переменных ($ msgExtra) в некотором случае может равняться нулю. Это было намеренное поведение, и с C2DM он работал просто отлично. К сожалению, когда вы пытаетесь передать null в JSON через GCM, вы получаете ошибку 404, хотя в документации GCM ничего не говорится об этом … Так что код, который я опубликовал, хорош, если вы не пытаетесь отправить null. Решение моей проблемы – заменить нулевое значение чем-то вроде «». И еще раз – жаль, что я публикую его сейчас, я совсем забыл об этом вопросе.
Создайте ключ API браузера из консоли API Google и используйте его вместо ключа сервера в заголовке «Авторизация». Как только вы это сделаете, эта ошибка исчезнет.
Это вызвано серьезной ошибкой в документации GCM, в которой говорится, что вы должны использовать ключ сервера в заголовке авторизации (как написано здесь ).
может быть уже разрешено для вас. Но вот рабочая версия вашего кода, которую я тестировал на устройстве.
<?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.