Я знаю, что есть много сообщений с той же проблемой, но после прочтения их я не мог найти причину проблемы.
Я написал GCM-клиент для регистрации моего устройства для приема сообщений с моего сервера. Он работает, и я могу сохранить идентификатор регистрации в моей базе данных.
Моя проблема связана с сервером. Я использую скрипт, найденный где-то в googling, но всегда получаю сообщение об ошибке:
{"multicast_id":7341760174206782539,"success":0,"failure":1,"canonical_ids":0,"results":[{"error":"InvalidRegistration"}]}
PHP-код (я использую BROWSER API вместо 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 символа между двумя тире, как у вас в вашем Идентификаторе регистрации: ...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, и обнаружил, используя указанную выше эхо-строку, что было добавлено пространство в начало и конец идентификатора. Как только я удалил пробелы, сообщение было отправлено без ошибок.
Эта ошибка возникает только тогда, когда токен вашего устройства неверен . Я изучаю это, и это окончательное решение. Ваш код выглядит отлично . Измените токен вашего устройства, на который отправляется уведомление. Убедитесь, что ваш токен устройства прав.