30

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

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

4

14 回答 14

31

您是否将服务器的 IP 列入白名单?默认情况下,这对于浏览器密钥不是必需的,但对于服务器密钥是必需的。

你可以在这里查看:

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

于 2013-01-03T09:00:58.293 回答
19

另一个答案已经建议将 IP 地址列入白名单,这似乎很明显。为我解决的问题是将我的IPv6 地址列入白名单。那是关键!我希望这对其他人有帮助。

于 2013-03-11T18:17:57.097 回答
14

我尝试了这个线程中的所有内容,但仍然没有运气。

所以我检查了启用的 API(APIs and Auth -> APIs, Enabled APIs),并意识到我没有Google Cloud Messaging for Chrome启用Google Cloud Messaging for Android。一旦我启用后者,它就立即起作用。

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

于 2014-11-26T13:29:12.397 回答
3

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

curl_setopt($ch, CURLOPT_IPRESOLVE, CURL_IPRESOLVE_V4 );
于 2015-01-27T16:09:05.580 回答
2

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

于 2013-05-09T18:50:49.487 回答
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 ID、、服务器密钥时,我终于找到了 api 密钥;-)CertificateBrowser Key

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

于 2013-12-05T02:31:48.767 回答
1

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

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

于 2015-06-21T15:20:18.157 回答
0

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

但是,当我从生产服务器更改为我的 inet 地址时,它失败了。相反,我必须使用 inet6 addr: /64 Scope:Global 才能工作。如果遇到同样的问题,要获取该值,只需输入ifconfig,然后找到上面的条目。在允许的 IP 地址中输入该值,它将正常工作。

于 2014-10-31T10:19:08.433 回答
0

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

也尝试 var_dump($results) 看看你是否得到信息。

于 2012-09-27T10:58:23.853 回答
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);
}
于 2013-05-13T10:52:15.707 回答
0

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

于 2015-04-07T11:25:29.647 回答
0

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

于 2018-02-17T00:45:17.800 回答
-1

确保您启用了 API 调查密钥!

于 2015-08-17T18:55:41.447 回答
-1

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

于 2016-02-23T20:58:57.050 回答