Сценарий GoogleCloudMessaging PHP всегда возвращает неверную регистрацию

Я знаю, что есть много сообщений с той же проблемой, но после прочтения их я не мог найти причину проблемы.

Я написал GCM-клиент для регистрации моего устройства для приема сообщений с моего сервера. Он работает, и я могу сохранить идентификатор регистрации в моей базе данных.

Моя проблема связана с сервером. Я использую скрипт, найденный где-то в googling, но всегда получаю результат ошибки:

{"multicast_id":7341760174206782539,"success":0,"failure":1,"canonical_ids":0,"results":[{"error":"InvalidRegistration"}]} 

PHP-код (я использую API BROWSER вместо API SERVER, как сказано в учебнике, но попытка обоих ключей возвращает одно и то же сообщение):

 <?php // Replace with real BROWSER API key from Google APIs $apiKey = "AIzaSyACln4edhSZW30XcmYpqoMz_gcRCC1iFjY"; // Replace with real client registration IDs $registrationIDs = array( "APA91bEdf1w4dQtsUqPT1jHhWEpvrpxzB1yrpL3RVtKrVxfzxfg2-Yl-pwHorsnmSnkqywQ8G90YcGEBoqCjgQU8CnjA0N7mOWF8bHMhHAs4ty46PPTX8yh6eSaSqvU3JTMmb-P0ma90EBG0rsQQbUh3aX895KxitI3LCiGOYqRfE5pZQ"); // Message to be sent $message = "this is a test"; // Set POST variables $url = 'https://android.googleapis.com/gcm/send'; $fields = array( 'registration_ids' => $registrationIDs, 'data' => array( "message" => $message ), ); $headers = array( 'Authorization: key=' . $apiKey, 'Content-Type: application/json' ); // Open connection $ch = curl_init(); // Set the url, number of POST vars, POST data curl_setopt( $ch, CURLOPT_URL, $url ); curl_setopt( $ch, CURLOPT_POST, true ); curl_setopt( $ch, CURLOPT_HTTPHEADER, $headers); curl_setopt( $ch, CURLOPT_RETURNTRANSFER, true ); curl_setopt( $ch, CURLOPT_POSTFIELDS, json_encode( $fields ) ); // Execute post $result = curl_exec($ch); // Close connection curl_close($ch); echo $result; ?> 

Я положил настоящие идентификаторы и ключ, чтобы посмотреть, правильно ли я поступаю. Есть идеи?

У меня была такая же проблема пару минут назад.

Изменить это

 $fields = array( 'registration_ids' => $registrationIDs, 'data' => array( "message" => $message ), ); 

к этому:

 $fields = array( 'registration_ids' => array($registrationIDs), 'data' => array( "message" => $message ), ); 

Я нашел свою проблему. Моя библиотека PHP удалила некоторые символы из сообщения или получила переменные. И один из этих символов – «_», потому что он может использоваться как SQL-инъекция. Это была моя проблема. Исправлена!

У меня та же проблема. Моя проблема была в моем gcm_regid. Длина gcm_regid составляет 183 байта. Однако для хранения этого значения моя база данных использует 150 байтов. Конечно, сохраненный gcm_regid является неполным. Я исправил проблему, увеличив размер хранилища для ключа. Тогда проблема решена.

Просто замените код на это, и он будет работать. Убедитесь, что вы заменили YOUR_REGISTRATION_ID , YOUR_MESSAGE , YOUR_API_KEY , REGISTRATION_IDS и другие комментарии с оригиналом.

 <?php $regId=YOUR_REGISTRATION_ID; $msg=YOU_MESSAGE; $message = array("message" => $msg); $regArray[]=REGISTRATION_IDS; $url = 'https://android.googleapis.com/gcm/send'; $fields = array('registration_ids' => $regArray, 'data' => $message,); $headers = array( 'Authorization: key=YOUR_API_KEY','Content-Type: application/json'); $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_POST, true); curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($fields)); $result=curl_exec($ch); echo $result; if($result==FALSE) { die('Curl Failed'); } curl_close($ch); } ?> 

Вы уверены, что значение идентификатора регистрации, отправляемого в Google, является правильным?

Недопустимый идентификатор регистрации

Проверьте форматирование идентификатора регистрации, который вы передаете серверу. Убедитесь, что он соответствует идентификатору регистрации, который получает телефон, в намерении com.google.android.c2dm.intent.REGISTRATION и что вы не усекаете его или не добавляете дополнительные символы. Случается, когда код ошибки является InvalidRegistration.

Хотя я не знаю, какой формат действительного регистрационного идентификатора, я никогда не видел идентификатор регистрации с разделом из двух символов между двумя тире, как у вас в вашем идентификаторе регистрации: ...2-Yl-p... ,

Опубликуйте данные массива.

Ex:

 $registatoin_ids = array($regId); $message = array( "msg_category" => "cat001", "msg_identifier" => "msg01", "user_id" => "1234", "title" => $title, ); 

А затем вызовите функцию.

 $result = $gcm->send_notification($registatoin_ids, $message); 

 public function send_notification($registatoin_ids, $message) { // include config include_once './config.php'; // Set POST variables $url = 'https://android.googleapis.com/gcm/send'; $fields = array( 'registration_ids' => $registatoin_ids, 'data' => $message, ); $headers = array( 'Authorization: key=' . GOOGLE_API_KEY, 'Content-Type: application/json' ); // Open connection $ch = curl_init(); // Set the url, number of POST vars, POST data curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_POST, true); curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt ($ch, CURLOPT_SSL_VERIFYHOST, 0); // Disabling SSL Certificate support temporarly curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($fields)); // Execute post $result = curl_exec($ch); if ($result === FALSE) { die('Curl failed: ' . curl_error($ch)); } // Close connection curl_close($ch); echo $result; } 

Аналогичная проблема и в конце был получен плохой идентификатор регистрации (токен).

Я добавил следующую строку

 echo "id=[$id]"; 

К PHP-коду, чтобы убедиться, что идентификатор точно совпадает с маркером, напечатанным в logcat, и обнаружил, используя указанную выше эхо-строку, что было добавлено пространство в начале и конце идентификатора. Как только я удалил пробелы, сообщение было отправлено без ошибок.

Эта ошибка возникает только тогда, когда токен вашего устройства неверен . Я изучаю это, и это окончательное решение. Ваш код выглядит отлично . Измените токен вашего устройства, на который отправляется уведомление. Убедитесь, что ваш токен устройства прав.