Google GCM服务器返回未经授权的错误401

时间:2012-09-27 10:56:06

标签: php android json google-cloud-messaging

我正在使用GCM服务从服务器推送信息。如果我使用浏览器密钥,它将成功显示为: {“multicast_id”:4849013215736515938,“success”:1,“failure”:0,“canonical_ids”:0,“results”:[{“message_id”: “0:1348742583011905%2adac3a0f9fd7ecd”}]} 但我没有在设备上收到任何通知。 如果我使用服务器密钥,则显示未授权错误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;

请帮我解决这个问题。提前谢谢。

14 个答案:

答案 0 :(得分:31)

您是否将服务器的IP列入白名单?默认情况下,浏览器密钥不需要这样做,但它适用于服务器密钥。

您可以在此处查看:

https://code.google.com/apis/console/#project:[您的项目编号]:访问

答案 1 :(得分:19)

另一个答案已经建议将IP地址列入白名单,这似乎很明显。修复它的原因是将 IPv6地址列入白名单。那是关键!我希望这有助于其他人。

答案 2 :(得分:14)

我在这个帖子中尝试了一切,但仍然没有运气。

所以我检查了启用的API( API和Auth - > API,启用的API ),并意识到我已启用Google Cloud Messaging for Chrome而非Google Cloud Messaging for Android。一旦我启用后者,它立即起作用。

仔细检查您是否启用了正确的API!

答案 3 :(得分:3)

许多人写道,您必须将服务器IPV4和IPV6列入白名单。如果你只想要IPV4,请将它添加到你的curl php init:

curl_setopt($ch, CURLOPT_IPRESOLVE, CURL_IPRESOLVE_V4 );

答案 4 :(得分:2)

使用浏览器密钥使用选项创建新的浏览器密钥并在代码中使用此密钥。 https://code.google.com/apis/console/?pli=1#project:42053154xxxx:access

答案 5 :(得分:2)

我曾经加入

$apiKey = "xxxxx"

就像我投放到Android客户端应用程序的项目编号(项目ID),但我在服务器中出错了必须是谷歌云控制台的appkey,(你激活 Google Cloud Messaging for Android

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

在我的情况下,我在平台上有默认项目“服务帐户 - 项目”:'Web',但只有Hosted Application section并且没有关于任何api密钥的证据。 但是当我创建名为“我的应用”的新Web Apps时,其中包含4个部分OAuth 2.0 Client IDCertificate服务器密钥Browser Key我最终找到了api key; - )

可能只是我不知道但我相信这个答案对某些人也有帮助

答案 6 :(得分:1)

对我来说问题是你必须启用api。设置API是不够的。检查Google Cloud Messaging for Android是否出现在API中启用的API上 - >启用API。

如果没有单击APIS中的API库选项卡并启用它。 \

答案 7 :(得分:0)

如果我没弄错,您的APIKEY需要进行base64编码。

还可以尝试使用var_dump($ results)查看是否获得了信息。

答案 8 :(得分:0)

查看代码,我发现这是来自某个在线发布的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);
}

答案 9 :(得分:0)

问题在于:我使用的是2台服务器,1台登台,另一台是生产服务器。对于我使用数字海洋托管的登台服务器,我输入了服务器应用程序密钥允许的IP地址中的inet地址,它运行得很好。

然而,当我从生产服务器更改为我的inet地址时失败了。相反,我不得不使用 inet6 addr:/ 64范围:全球性的工作。要在遇到相同问题时获取该值,只需输入 ifconfig ,然后找到上述条目。在允许的IP地址中输入该值,它将正常工作。

答案 10 :(得分:0)

您必须拥有与默认项目不同的项目。创建一个项目&然后创建一个密钥。不要使用默认项目。

答案 11 :(得分:0)

遇到这个麻烦,我正在使用GCM(谷歌云消息)。但是在2016年9月之后,GCM上的服务器密钥将无法运行,您必须使用FCM(firebase云消息传递)。仅使用“设置”面板的“云消息传递”选项卡在Firebase控制台中创建新的服务器密钥。我去了firebase控制台console.firebase.google.com(我还没用过),它让我导入我的项目。突然,GCM控制台上出现了这个新的服务器密钥。如果使用GCM,请使用您在此处列出的“旧密钥”。

答案 12 :(得分:-1)

答案 13 :(得分:-1)

我们正在寻找解决方案。更具体地说,添加此卷曲选项​​:curl_setopt($ch, CURLOPT_IPRESOLVE, CURL_IPRESOLVE_V4 );