Der Google GCM-Server gibt den nicht autorisierten Fehler 401 zurück

Ich verwende GCM-Dienste, um Informationen vom Server zu übertragen. Wenn ich den Browser-Schlüssel verwende zeigt er das Erfolgs-Mesage als: {“multicast_id”: 4849013215736515938, “Erfolg”: 1, “Fehler”: 0, “canonical_ids”: 0, “Ergebnisse”: [{“message_id”: “0: 1348742583011905% 2adac3a0f9fd7ecd “}]}, aber ich habe keine Benachrichtigungen auf dem Gerät erhalten. Und wenn ich den Serverschlüssel verwende, zeigt es Unauthorized Error 401 an . Mein Code ist unten gezeigt:

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

Bitte helfen Sie mir für dieses Problem. Danke im Voraus.

   

Haben Sie die IP Ihres Servers auf die weiße Liste gesetzt? Dies ist nicht standardmäßig für den Browserschlüssel erforderlich, sondern für den Serverschlüssel.

Sie können es hier überprüfen:

https://code.google.com/apis/console/#project:%5BIhre Projektnummer]: Zugriff

Eine andere Antwort schlug bereits vor, die IP-Adresse aufzulisten, was offensichtlich erscheint. Was es für mich behoben hat, war die Whitelist meiner IPv6-Adresse . Das war der Schlüssel! Ich hoffe, das hilft jemand anderem.

Ich habe alles in diesem Thread versucht und immer noch kein Glück.

Also überprüfte ich die aktivierten APIs ( APIs und Auth -> APIs, Aktivierte APIs ) und erkannte, dass ich Google Cloud Messaging for Chrome nicht Google Cloud Messaging for Android aktiviert hatte. Sobald ich letzteres aktiviert habe, hat es sofort funktioniert.

Überprüfen Sie, ob Sie die richtige API aktiviert haben!

Wie viele Leute geschrieben haben, müssen Sie Ihren Server IPV4 und IPV6 auf die weiße Liste setzen. Wenn du nur IPV4 willst, füge das zu deinem curl php init hinzu:

 curl_setopt($ch, CURLOPT_IPRESOLVE, CURL_IPRESOLVE_V4 ); 

Verwenden Sie den Browserschlüssel mit der Option “Neuen Browserschlüssel erstellen” und verwenden Sie diesen Schlüssel in Ihrem Code. https://code.google.com/apis/console/?pli=1#project:42053154xxxx:access

Ich pflegte zu setzen

 $apiKey = "xxxxx" 

wie die Projektnummer (Projekt-ID), die ich in die Android-Client-App gestellt habe, aber ich bin falsch im Server gewesen, muss appkey von Google Cloud-Konsole sein (wo Sie Google Cloud Messaging für Android aktivieren)

  ProjectXXX -> APIs & auth -> Registered Apps -> Web App -> Server Key -> Api key 

In meinem Fall hatte ich dort das Standard-Projekt ‘Service Account-Projekt’ auf der Plattform: ‘Web’, aber es gab nur den Bereich Hosted Application section und keinen Hinweis auf einen API-Schlüssel. aber wenn ich neue Web Apps Namen ‘Meine App’ erstelle, die 4 Sektionen OAuth 2.0 Client ID , Certificate , Server Schlüssel , Browser Key enthalten, finde ich endlich den API Schlüssel 😉

kann nur ich, wer es nicht weiß, aber ich glaube, dass diese Antwort auch jemandem helfen könnte

Für mich war das Problem, dass Sie die API aktivieren müssen. Ein API-Setup ist nicht genug. Stellen Sie sicher, dass Google Cloud Messaging für Android auf den aktivierten APIs in APIs -> aktivierte APIs angezeigt wird.

Wenn dies nicht der Fall ist, klicken Sie in APIS auf die Registerkarte API-Bibliothek und aktivieren Sie sie. \

Wenn ich mich nicht irre, muss Ihr APIKEY base64-kodiert sein.

Probieren Sie var_dump ($ results) aus, um zu sehen, ob Sie Informationen erhalten.

Wenn ich mir den Code anschaue, erkenne ich, dass dies aus einem php-gcm-Beispiel stammt, das irgendwo online veröffentlicht wurde. Es ist ziemlich nett und ich kann Ihnen versichern, dass sowohl Browser-Schlüssel als auch IPs auf der weißen Liste (nicht IPV6 oder bas64 apikey) funktionieren.

Der Grund, warum keine Nachricht angezeigt wird, liegt darin, dass die Sendebenachrichtigungsfunktion 'data' => array("message"=>$message) auf einen Schlüssel von “Nachricht” abzielt. Dies müssen Sie an Ihre ausstehende Absicht weitergeben dh

 notification.setLatestEventInfo(context, title, message, intent); 

Dies ermöglicht die Absicht, die unter diesem Schlüssel enthaltene Nachricht zu lesen. Die Nachricht selbst wird von der unten eingefügten GCMIntentService-Methode erhalten:

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

Hier ist das Problem: Ich habe 2 Server benutzt, 1 Staging und den anderen Produktionsserver. Für meinen Staging-Server, der mit Digital Ocean gehostet wurde, habe ich die inet-Adresse in den für Key-Server-Anwendungen zugelassenen IP-Adressen eingetragen, und es hat gut funktioniert.

Es ist jedoch fehlgeschlagen, als ich von meinem Produktionsserver zu meiner inet-Adresse gewechselt habe. Stattdessen musste ich inet6 addr: / 64 Scope: Global dafür verwenden. Um den Wert zu erhalten, wenn das gleiche Problem auftritt , geben Sie einfach ifconfig ein und finden den obigen Eintrag. Geben Sie diesen Wert in die zulässigen IP-Adressen ein und es funktioniert einwandfrei.

Sie müssen ein anderes Projekt als das Standardprojekt haben. Erstellen Sie ein Projekt und erstellen Sie einen Schlüssel. Verwenden Sie kein Standardprojekt.

Hatte dieses Problem, ich benutzte GCM (Google Cloud Messaging). Aber nach September 2016 wird der Serverschlüssel auf dem GCM nicht funktionieren, Sie müssen FCM (Firebase Cloud Messaging) verwenden. Erstellen Sie neue Serverschlüssel nur in der Firebase-Konsole mithilfe der Registerkarte “Cloud Messaging” im Bereich “Einstellungen”. Ich ging zur Firebase-Konsole console.firebase.google.com (ich hatte sie noch nicht benutzt) und bat mich, mein Projekt zu importieren. Plötzlich war dieser neue Serverschlüssel auf der GCM-Konsole. Wenn Sie GCM verwenden, verwenden Sie den dort angezeigten “Legacy Key”.

Stellen Sie sicher, dass Sie Ihren API Survery Key aktiviert haben!

Wir suchen nach Lösungen in Tagen. Genauer gesagt, füge diese Curl-Option hinzu: curl_setopt($ch, CURLOPT_IPRESOLVE, CURL_IPRESOLVE_V4 );