Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/188.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php Google GCM服务器返回未经授权的错误401_Php_Android_Json_Google Cloud Messaging - Fatal编程技术网

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

Php Google GCM服务器返回未经授权的错误401,php,android,json,google-cloud-messaging,Php,Android,Json,Google Cloud Messaging,我正在使用GCM服务从服务器推送信息。如果我使用浏览器键,它将成功的消息显示为:{“多播id”:4849013215736515938,“成功”:1,“失败”:0,“规范id”:0,“结果”:[{“消息id”:“0:1348742583011905%2ADA3A0F9FD7ECD”} 但我并没有在设备上收到任何通知。 如果我使用服务器密钥,它会显示未经授权的错误401。我的代码如下所示: $apiKey = "xxxxx"; $registrationIDs = array("xxxxxxxx"

我正在使用GCM服务从服务器推送信息。如果我使用浏览器键,它将成功的消息显示为:{“多播id”:4849013215736515938,“成功”:1,“失败”:0,“规范id”:0,“结果”:[{“消息id”:“0:1348742583011905%2ADA3A0F9FD7ECD”} 但我并没有在设备上收到任何通知。 如果我使用服务器密钥,它会显示未经授权的错误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;

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

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


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

是否将服务器的IP列入白名单?默认情况下,浏览器密钥不需要此选项,但服务器密钥需要此选项

您可以在这里查看:


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

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

使用浏览器键使用选项创建新的浏览器键,并在代码中使用此键。

查看代码,我发现这是从网上某个地方发布的php gcm示例中获得的。这非常好,我可以向您保证,浏览器密钥和白名单ip(不是IPV6或bas64 apikey)都可以工作

没有显示消息的原因是您正在使用的发送通知功能
'data'=>数组(“message”=>$message)
以“消息”键为目标,这是您必须传递给待定意图的内容,即

notification.setLatestEventInfo(context, title, message, intent);
这将使intent能够读取此键下包含的消息。消息本身是从粘贴在下面的GCMinentService方法获得的:

 @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);
}
我过去常把它放在

$apiKey = "xxxxx"
就像我放在Android客户端应用程序中的项目编号(项目id),但我在服务器中出错了,必须是来自谷歌云控制台的appkey(在这里,您可以激活针对Android的谷歌云消息传递

在我的例子中,我在平台“Web”上有默认的项目“Service Account project”,但只有托管的应用程序部分,没有任何api密钥的证据。 但是,当我创建名为“我的应用程序”的新
Web应用程序时,它包含4个部分
OAuth 2.0客户端ID
证书
服务器密钥
浏览器密钥
,我最终找到了api密钥;-)


也许只有我自己不知道,但我相信这个答案对某些人也有帮助。问题是:我使用了两台服务器,一台是临时服务器,另一台是生产服务器。对于使用digital ocean托管的我的登台服务器,我在服务器应用程序的键中输入了inet地址允许的IP地址,它工作正常

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

我尝试了这条线的所有方法,但仍然没有成功

因此,我检查了启用的API(API和Auth->API,启用的API),并意识到我已经启用了针对Chrome的
谷歌云消息
而不是针对Android的
谷歌云消息
。一旦我启用了后者,它立即起作用


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

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

curl_setopt($ch, CURLOPT_IPRESOLVE, CURL_IPRESOLVE_V4 );

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

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

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

我们将在几天内寻找解决方案。更具体地说,添加这个curl选项:
curl\u setopt($ch,CURLOPT\u IPRESOLVE,curl\u IPRESOLVE\u V4)

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

Hey Iscario,base64编码后,它不会对其进行身份验证。var_dump($results)在这两种情况下都显示为空。帖子应该是count($fields)我不知道关于GCM的所有信息,但我正在完成整个googlecheckout界面的构建,大部分情况下google是google是google是google。您是否尝试将API键从浏览器API键更改为服务器API键?嘿,发生错误的原因是API键错误,现在一切正常:)很高兴听到你的声音,我很乐意帮忙;-)这就是我的问题所在,我试图使用服务器键而不是浏览器键,我想这更有意义,因为Curl更像是一个web浏览器,而不是直接的套接字连接。真不敢相信我浪费了多少时间,除了这张脸,我什么都试了。谢谢大家。由于浏览器键和API键,我面临这个问题。现在它与服务器API密钥一起工作非常好。如何将服务器的IP列入白名单?我得到了未经授权的401。谷歌更新了一点控制台,你会被重定向到我答案中的链接。您可以在那里看到“编辑允许的IP”按钮。我已经输入了“允许的任何IP”,这取决于我的密钥的保密性
curl_setopt($ch, CURLOPT_IPRESOLVE, CURL_IPRESOLVE_V4 );