谷歌GCM服务器返回未授权错误401。

30

我正在使用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;

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


请参考以下链接:https://dev59.com/M3bZa4cB1Zd3GeqPI7Vh#21628030 - appukrb
你能否列出一份谷歌配置的小步骤清单? - valeriocomo
对于那些正在浏览的人,如果您突然开始遇到此错误而没有进行任何特定更改(服务器密钥仍相同),则可能需要将项目导入Firebase。请参见我的答案这里 - AL.
14个回答

0
如果我没错的话,你的APIKEY需要进行base64编码。
另外,尝试使用var_dump($results)查看是否获取到了信息。

嘿,伊斯卡里奥特,在base64编码后它无法进行身份验证。而且在两种情况下var_dump($results)都显示为NULL - Sushil Kandola
POSTS 应该是 $fields 的数量。 - Case
我并不是对GCM了解得非常透彻,但我正在完成一个完整的Google Checkout接口的构建,而且大部分情况下,谷歌就是谷歌。 - Case
你尝试过将API密钥从浏览器API密钥更改为服务器API密钥吗? - jonaypelluz

0

我曾经遇到这个问题,我使用的是GCM(Google云消息)。但在2016年9月之后,GCM上的服务器密钥将不起作用,您必须使用FCM(Firebase云消息传递)。只能在设置面板的Cloud Messaging选项卡中使用Firebase控制台创建新的服务器密钥。我转到firebase控制台console.firebase.google.com(我还没有使用过),并被要求导入我的项目。突然,在GCM控制台上又出现了这个新的服务器密钥。如果使用GCM,请使用那里列出的“legacy key”。



-1

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接