php - example - El servidor de Google GCM devuelve el error 401 no autorizado
send android notifications php (14)
Estoy usando servicios de GCM para enviar información desde el servidor. Si uso la clave del navegador, muestra el mensaje de éxito como: {"multicast_id": 4849013215736515938, "success": 1, "failure": 0, "canonical_ids": 0, "results": [{"message_id": "0: 1348742583011905% 2adac3a0f9fd7ecd "}]} pero no recibí ninguna notificación en el dispositivo. Y si uso la clave del servidor, muestra Error no autorizado 401 . Mi código se muestra a continuación:
$apiKey = "xxxxx";
$registrationIDs = array("xxxxxxxx");
$message = "testing Process";
$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''
);
$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_VERIFYHOST, 0);
curl_setopt ($ch, CURLOPT_SSL_VERIFYPEER, 0);
curl_setopt( $ch, CURLOPT_POSTFIELDS, json_encode($fields) );
$result = curl_exec($ch);
if(curl_errno($ch)){ echo ''Curl error: '' . curl_error($ch); }
curl_close($ch);
echo $result;
Por favor, ayúdame para este problema. Gracias por adelantado.
¿Incluiste en la lista blanca el IP de tu servidor? Esto no es necesario por defecto para la clave del navegador, pero es para la clave del servidor.
Puede comprobar aquí:
https://code.google.com/apis/console/#project:[YOUR NÚMERO DE PROYECTO]: acceso
Al mirar el código, reconozco que se trata de una muestra de php-gcm publicada en algún lugar en línea. Es bastante agradable y puedo asegurarle que funcionan tanto las teclas del navegador como las listas blancas de la IP (no IPV6 o apikey bas64).
La razón por la cual no se muestra ningún mensaje es porque la función de notificación de envío que está usando ''data'' => array("message"=>$message)
apunta a una clave de "mensaje", esto es lo que debe pasar a su intento pendiente es decir
notification.setLatestEventInfo(context, title, message, intent);
Esto permitirá la intención de leer el mensaje contenido bajo esta clave ... el mensaje en sí se obtiene del método GCMIntentService pegado a continuación:
@Override
protected void onMessage(Context context, Intent intent) {
Log.i(TAG, "Received message");
String message = intent.getExtras().getString("message");
Log.d(TAG, "The intent contains: " + intent.getExtras());
displayMessage(context, message);
// notifies user
generateNotification(context, message);
}
Aquí está el problema: yo estaba usando 2 servidores, 1 puesta en escena y el otro el servidor de producción. Para mi servidor de almacenamiento intermedio, que se alojó utilizando digital ocean, ingresé la dirección de entrada en la clave para que las aplicaciones del servidor permitieran direcciones IP, y funcionó bien.
Sin embargo, falló cuando cambié a mi dirección de inicio de mi servidor de producción. En cambio, tuve que usar inet6 addr: / 64 Scope: Global para que esto funcione. Para obtener el valor si se encuentra con el mismo problema, simplemente ingrese ifconfig , y encuentre la entrada anterior. Ingrese ese valor en las direcciones IP permitidas y funcionará bien.
Como mucha gente escribió, debe incluir en la lista blanca su servidor IPV4 e IPV6. Si solo quieres IPV4, agrégalo a tu curl php init:
curl_setopt($ch, CURLOPT_IPRESOLVE, CURL_IPRESOLVE_V4 );
Debe tener un proyecto diferente al predeterminado. Crea un proyecto y luego crea una clave. No use el proyecto predeterminado.
Estamos buscando soluciones en días. Más específicamente, agregue esta opción de curl: curl_setopt($ch, CURLOPT_IPRESOLVE, CURL_IPRESOLVE_V4 );
Intenté todo en este hilo, y todavía no tuve suerte.
Así que revisé las API habilitadas ( API y Auth -> API, API habilitadas ), y me di cuenta de que había habilitado Google Cloud Messaging for Chrome
no Google Cloud Messaging for Android
. Tan pronto como habilité este último, funcionó de inmediato.
¡Verifica que tienes habilitada la API correcta!
Otra respuesta ya sugería incluir en la lista blanca la dirección IP, lo que parece bastante obvio. Lo que lo solucionó fue incluir mi dirección IPv6 como lista blanca. Esa fue la clave! Espero que esto ayude a alguien más.
Si no me equivoco, su APIKEY debe estar codificada en base64.
Pruebe también var_dump ($ resultados) para ver si obtiene información.
Solía poner al
$apiKey = "xxxxx"
como el número de proyecto (identificación del proyecto) que puse a la aplicación Android Client, pero me he equivocado en el servidor tiene que ser una aplicación desde la consola de la nube de Google (donde activas Google Cloud Messaging para Android )
ProjectXXX -> APIs & auth -> Registered Apps -> Web App -> Server Key
-> Api key
en mi caso, tuve el proyecto predeterminado ''Proyecto de Cuenta de Servicio'' en la plataforma: ''Web'', pero solo había una Hosted Application section
y ninguna evidencia sobre ninguna clave de API. pero cuando creo nuevas Web Apps
llamadas ''Mi aplicación'' que contenían 4 secciones OAuth 2.0 Client ID
, Certificate
, Clave del servidor , Browser Key
, finalmente encuentro la clave de la API ;-)
solo yo, que no lo sé, pero creo que esta respuesta también podría ayudar a alguien
Tuve este problema, estaba usando GCM (Google Cloud Messaging). Pero después de septiembre de 2016, la clave del servidor en el GCM no funcionará, debe usar FCM (mensajes en la nube de Firebase). Cree nuevas claves de servidor solo en la consola de Firebase usando la pestaña Mensajería en la nube del panel Configuración. Fui a la consola firebase console.firebase.google.com (no la había usado todavía) y me pidió que importara mi proyecto. De repente, apareció esta nueva clave de servidor en la consola de GCM. Si usa GCM, use la "clave heredada" que ve allí.
para mí, el problema es que debes habilitar la API. Tener una API configurada no es suficiente. Verifique que Google Cloud Messaging for Android aparezca en las API habilitadas en APIs habilitadas para API.
Si no es así, haga clic en la pestaña de la biblioteca API en APIS y habilítelo. /
use la tecla del navegador usando la opción crear nueva clave del navegador y use esta clave en su código. https://code.google.com/apis/console/?pli=1#project:42053154xxxx:access