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.

  • Notificación push de Android GCM para aplicaciones de localización
  • ¿Debo solicitar un nuevo token cada vez que lance mi aplicación para Android?
  • Mostrar notificaciones push cuando la aplicación se abre / cierra de manera diferente
  • Desactivar el registro de Android Azure Notification
  • Enviar notificación de carga con nodo-gcm al dispositivo android
  • Mensajería en la nube de Google, incapaz de inicializar el receptor
  • Solicitud del ID de registro de Google Cloud Messaging (GCM) cada vez que se inicia la aplicación
  • PARSE: Notificaciones push "deviceToken" undefined
  • ¿Es posible utilizar GCM sin la cuenta de Google y Google Play Services en el dispositivo?
  • ¿Cómo mostrar la imagen en notificación push (Gcm) android?
  • ¿Existen alternativas a Google Cloud Messaging para las compilaciones personalizadas de Android?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.