Script de GoogleCloudMessaging PHP siempre devolviendo invalidregistration

Sé que hay un montón de mensajes con el mismo problema, pero después de leer todos ellos no pude encontrar la razón del problema.

Escribí un cliente GCM para registrar mi dispositivo para recibir mensajes de mi servidor. Está funcionando y puedo almacenar el ID de registro en mi base de datos.

Mi problema está en el lado del servidor. Estoy usando un script encontrado en algún sitio de Google, pero siempre recibo un resultado de error:

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

El código PHP es (estoy usando BROWSER API en lugar de SERVER API como se ha dicho en tutorial, pero al intentar ambas claves se devuelve el mismo mensaje):

 <?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; ?> 

Pongo los identificadores reales y la clave para ver si estoy haciendo bien. ¿Algunas ideas?

Tuve el mismo problema hace un par de minutos.

Cambia esto

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

a esto:

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

Encontré mi problema. Mi biblioteca de PHP eliminó algunos caracteres de las variables post o get. Y uno de esos caracteres es '_', porque puede ser utilizado como inyección de SQL. Ese era mi problema. ¡Fijo!

Tengo el mismo problema. Mi problema era mi gcm_regid. La longitud de gcm_regid es de 183 bytes. Sin embargo, mi base de datos utiliza 150 bytes para almacenar este valor. Ciertamente el gcm_regid almacenado es incompleto. He arreglado el problema mediante el aumento del tamaño de almacenamiento para la clave. Entonces el problema resolvió.

Simplemente reemplace el código con esto y funcionará. Asegúrese de reemplazar YOUR_REGISTRATION_ID , YOUR_MESSAGE , YOUR_API_KEY , REGISTRATION_IDS y otros comentarios con original.

 <?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); } ?> 

¿Estás seguro de que el valor del ID de registro que estás enviando a Google es correcto?

ID de registro no válido

Compruebe el formato del ID de registro que pasa al servidor. Asegúrese de que coincide con el ID de registro que el teléfono recibe en la intención de com.google.android.c2dm.intent.REGISTRATION y que no lo está truncando o añadiendo caracteres adicionales. Sucede cuando el código de error es InvalidRegistration.

Aunque no sé cuál es el formato de un ID de registro válido, nunca he visto un ID de registro con una sección de 2 caracteres entre dos guiones como lo has hecho en tu Id de registro: ...2-Yl-p... .

Publicar una matriz de datos a la misma.

Ex

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

Y luego llamar a la función ..

 $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; } 

Problema similar y al final fue el mal registro de identificación (token) recibido.

He añadido la siguiente línea

 echo "id=[$id]"; 

Al código PHP para verificar que el ID es exactamente como el token impreso en el logcat y averiguó, utilizando la línea de eco anterior, que había un espacio añadido al principio y al final del id. Una vez que quité los espacios el mensaje fue enviado sin error.

Este error sólo se produce cuando el token del dispositivo no es correcto . Yo investigo sobre esto y esto es la solución final. Su código está bien . Cambie el token del dispositivo donde se va a enviar la notificación. Asegúrese de que el token del dispositivo esté correcto.

  • ¿Qué puerto y protocolo utiliza Google Cloud Messaging (GCM)?
  • Registrar un dispositivo en GCM cada vez que se inicia la aplicación es el enfoque correcto?
  • Notificaciones Locales en Cordova 3.0.0
  • Android - No se puede iniciar el receptor com.parse.ParsePushBroadcastReceiver
  • Mostrar notificación push sólo cuando la aplicación no está ejecutando android
  • Push notificación de UrbanAirship no funciona con servidor en vivo (es decir, con la clave de producción) en android
  • Lados negativos de C2dM
  • ¿Por qué obtengo "MismatchSenderId" desde el lado del servidor GCM?
  • Cómo activar una actividad mediante una notificación local creada a partir de una notificación remota
  • GCM: java.lang.noclassdeffounderror: com.google.android.gcm.GCMRegistrar
  • ID del remitente del GCM / número del proyecto
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.