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

我正在使用GCM服务来从服务器推送信息。 如果我使用浏览器键,它显示成功mesaage为: {“multicast_id”:4849013215736515938,“成功”:1,“失败”:0,“canonical_ids”:0,“results”:[{“message_id”:“ 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; 

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

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

你可以在这里查看:

https://code.google.com/apis/console/#project:%5BYOUR PROJECT NUMBER]:访问

另一个答案已经build议白名单IP地址,这似乎很明显。 什么修复了我的白名单我的IPv6地址 。 这是关键! 我希望这可以帮助别人。

我在这个线程中尝试了一切,仍然没有运气。

因此,我查看了启用的API( API和Auth – > API,启用的API ),并且意识到我已启用Google Cloud Messaging for Chrome而不是Google Cloud Messaging for Android 。 只要我启用后者,它立即工作。

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

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

 curl_setopt($ch, CURLOPT_IPRESOLVE, CURL_IPRESOLVE_V4 ); 

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

我曾经投入的

 $apiKey = "xxxxx" 

像我把Android客户端应用程序的项目编号(项目ID),但我一直在服务器错误,必须从谷歌云控制台,(你激活谷歌云消息传递的Android

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

在我的情况下,我有平台上的默认项目“服务帐户项目”:“networking”,但只有Hosted Application section ,没有关于任何API密钥的证据。 但是当我创build新的Web Apps名为“我的应用程序”,其中包含4个部分OAuth 2.0 Client IDCertificate服务器密钥Browser Key我finfinfindAPI密钥;-)

可能只是我谁不知道,但我相信这个答案也可以帮助一些人

对我来说,问题是你必须启用api。 build立一个API是不够的。 请检查“适用于Android的Google云消息传递”是否出现在“启用了API的API”中的已启用API上。

如果它不在APIS中单击API库选项卡并启用它。 \

如果我没有错,你的APIKEY需要被base64编码。

也尝试var_dump($结果),看看你是否获得信息。

看代码,我认识到这是从一个在网上发布的php-gcm示例。 它相当不错,我可以向你保证,浏览器的键和白名单IP(不是IPV6或BAS64 apikey)的工作。

没有消息显示的原因是因为你使用'data' => array("message"=>$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); } 

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

但是,当我从生产服务器更改为我的inet地址时,它失败了。 相反,我不得不使用inet6 addr:/ 64 Scope:Global来工作。 如果遇到相同的问题,要获得值,只需inputifconfig ,并find上面的条目。 在允许的IP地址中input该值,它将正常工作。

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

确保你启用了API Survery Key

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