web-dev-qa-db-ja.com

Google GCMサーバーが不正なエラー401を返します

GCMサービスを使用して、サーバーから情報をプッシュしています。ブラウザキーを使用すると、次のような成功メッセージが表示されます。{"multicast_id":4849013215736515938、 "success":1、 "failure":0、 "canonical_ids":0、 "results":[{"message_id" : "0:1348742583011905%2adac3a0f9fd7ecd"}]}が、デバイスで通知を受け取らなかった。サーバーキーを使用すると、nauthorized Error 401と表示されます。私のコードは次のとおりです。

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

この問題について私を助けてください。前もって感謝します。

30
Sushil Kandola

サーバーのIPをホワイトリストに登録しましたか?これは、ブラウザキーにはデフォルトでは必要ありませんが、サーバーキーには必要です。

こちらで確認できます:

https://code.google.com/apis/console/#project:[YOUR PROJECT NUMBER]:access

31
Jos

別の回答では、すでにIPアドレスのホワイトリスト登録が提案されていますが、これは一種の明らかなようです。私にとってそれを修正したのは、私のIPv6アドレスをホワイトリストに登録することでした。それが鍵でした!これが他の人の助けになることを願っています。

19
DanO

私はこのスレッドですべてを試しましたが、それでも運はありません。

そこで、有効なAPI(APIと認証-> API、有効なAPI)を確認し、有効になったことに気付きましたGoogle Cloud Messaging for Chrome not Google Cloud Messaging for Android。後者を有効にするとすぐに、すぐに機能しました。

適切なAPIが有効になっていることを再確認してください!

14
Dan Bartlett

多くの人が書いているように、サーバーIPV4とIPV6をホワイトリストに登録する必要があります。 IPV4のみが必要な場合は、これをcurl php initに追加します。

curl_setopt($ch, CURLOPT_IPRESOLVE, CURL_IPRESOLVE_V4 );
3
Thomas Decaux

私は

$apiKey = "xxxxx"

Androidクライアントアプリに配置したプロジェクト番号(プロジェクトID)のように、サーバーで間違っていましたが、Googleクラウドコンソールからappkeyにする必要があります(アクティブにする場所Google Cloud Android向けメッセージング

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

私の場合、プラットフォームにデフォルトのプロジェクト「Service Account-project」がありました:「Web」ですが、Hosted Application sectionだけがあり、APIキーについての証拠はありませんでした。しかし、4つのセクションを含む「マイアプリ」と呼ばれる新しいWeb Appsを作成すると、OAuth 2.0 Client IDCertificateサーバーキーBrowser Keyが最終的に見つかりますAPIキー;-)

それを知らない私だけかもしれませんが、この答えは誰かにも役立つと信じています

2
m1uan

オプションを使用してブラウザキーを使用し、新しいブラウザキーを作成し、コードでこのキーを使用します。 https://code.google.com/apis/console/?pli=1#project:42053154xxxx:access

2
mayur bhagat

私にとって問題は、APIを有効にする必要があることでした。 APIをセットアップするだけでは十分ではありません。 AndroidのGoogle Cloud Messagingが、APIs-> enabled APIsの有効なAPIに表示されることを確認します。

そうでない場合は、APISの[APIライブラリ]タブをクリックして有効にします。 \

1
Nir

間違いない場合は、APIKEYをbase64でエンコードする必要があります。

また、var_dump($ results)を試して、情報が得られるかどうかを確認してください。

0
Case

デフォルトとは異なるプロジェクトが必要です。プロジェクトを作成してからキーを作成します。デフォルトのプロジェクトを使用しないでください。

0
Pavan Pyati

コードを見ると、これはオンラインのどこかに投稿されたphp-gcmサンプルからのものであることがわかります。これは非常に素晴らしいことであり、ブラウザキーとホワイトリストに登録されたIP(IPV6またはbas64 apikeyではない)の両方が機能することを保証できます。

メッセージが表示されない理由は、'data' => array("message"=>$message)を使用している送信通知関数が「メッセージ」のキーをターゲットにしているためです。これは、保留中のインテントに渡す必要があります。

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

これにより、インテントはこのキーの下に含まれるメッセージを読み取ることができます。メッセージ自体は、以下に貼り付けられたGCMIntentServiceメソッドから取得されます。

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

問題は次のとおりです。1台のステージングサーバーともう1台の運用サーバーの2台のサーバーを使用していました。 Digital Oceanを使用してホストされたステージングサーバーでは、サーバーアプリケーションのキー許可されたIPアドレスにinetアドレスを入力しましたが、正常に機能しました。

ただし、運用サーバーからinetアドレスに変更すると失敗しました。代わりに、これが機能するためにinet6 addr:/ 64 Scope:Globalを使用する必要がありました。同じ問題が発生した場合に値を取得するには、単にifconfigと入力して、上記のエントリを見つけます。許可されたIPアドレスにその値を入力すると、正常に機能します。

0
Qin Zhengquan

この問題が発生した場合、GCM(Googleクラウドメッセージング)を使用していました。ただし、2016年9月以降、GCMのサーバーキーは機能しなくなります。FCM(firebaseクラウドメッセージング)を使用する必要があります。 [設定]パネルの[クラウドメッセージング]タブを使用して、Firebase Consoleでのみ新しいサーバーキーを作成します。 firebaseコンソールconsole.firebase.google.comにアクセスし(まだ使用していませんでした)、プロジェクトのインポートを求められました。突然、この新しいサーバーキーがGCMコンソールに戻りました。 GCMを使用している場合は、そこにリストされている「レガシーキー」を使用します。

0
Nate Hammond