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.
- El LED de notificación de Firebase parpadea
- Notificación de 10 días de la infracción a término de desarrollador de Google Play con respecto al servicio de notificación push de OneSignal
- GET_ACCOUNTS durante el uso de GCM - ¿Por qué es necesario?
- El dispositivo deja de recibir emisiones de GCM hasta que la red se conmuta
- GCM y el conflicto de notificación de Parse
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?
- GCM cómo anular el registro de un dispositivo con GCM y servidor de terceros
- ¿Es necesaria una cuenta de Google para GCM (Google Cloud Messaging)?
- Cadena Spannable con imagen que no funciona con la notificación push
- Ionic Push notificación: ¿Cómo manejar onClick?
- Notificaciones Locales en Cordova 3.0.0
- ¿Cuáles son las consecuencias de tener el ID de SENDER de GCM expuesto?
- Xiaomi no recibe notificación cuando la aplicación no se está ejecutando
- Enviar notificación múltiple a GCM usando JSON
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