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.
- GCM, ID de registro y manejo de inicio de sesión / cierre de sesión de usuario
- ¿La carga útil 4096 bytes incluye la longitud registration_id?
- Notificación Push de Android
- Cómo utilizar con eficacia XMPP persistente con android
- ¿Cómo suprimir la notificación push se muestra cuando la aplicación se está ejecutando?
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?
- Notificación de envío cuando se carga un video nuevo en el canal de Youtube
- Android push notificación servicio comparision
- Obtenga el ID de registro canónico de GCM sin enviar un mensaje
- Cambiar el nombre del paquete de Android para el proyecto de phonegap
- Validación de Token GCM
- Animación en la barra de notificaciones Vista personalizada
- ¿Qué es el ID de registro de GCM?
- Cómo enviar notificación push en dos segmentos en momentos diferentes en un día en analizar
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.
- NameValuePair, HttpParams, HttpConnection Parámetros obsoletos en la clase de solicitud del servidor para la aplicación de inicio de sesión
- El cuadro de diálogo no muestra el botón positivo y negativo