我刚刚将我的应用程序中的推送通知与Firebase集成在一起。我已经阅读了FCM docs中的整个说明。
它只是自动生成了服务器密钥,并提供了我放在应用程序根文件夹中的google-services.json
文件。以下是按键的屏幕截图。
然后我在“密钥限制”下的Android应用中添加了我的包名和SHA1-Fingerprints以及选择。我还在控制台中启用了GCM。
让我发疯的事情是,当我从控制台发送通知时,我收到了通知,但是当我尝试从服务器发送通知时,它显示错误401 Unauthorized
。
所以我需要在后端更改我的代码吗?我在后端使用服务器密钥发送推送通知,我是否也需要将发件人ID发送到后端?谷歌是否改变了它的机制?
我的FCM后端代码:
$fields = array (
'registration_ids' => array (
$id
),
'data' => array (
"message" => $message
)
);
$fields = json_encode ( $fields );
$headers = array (
'Authorization: key=' . "YOUR_KEY_HERE",
'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_POSTFIELDS, $fields );
$result = curl_exec ( $ch );
echo $result;
curl_close ( $ch );
对于GCM:
static function send_notifications($registatoin_ids, $messages) {
$url = 'https://android.googleapis.com/gcm/send';
$fields = array(
'registration_ids' => $registatoin_ids,
'data' => $messages,
);
$apiKey='AIzaSyDzto66Dq0neU3AKjujr0eCEn2glWuk0-E';
$headers = array(
//'Authorization: key = AIzaSyBpZ3t68mtXRa4oRft9fmbaHaXFb-H_k-8',
'Authorization: key=' . $apiKey,
'Content-Type: application/json'
);
$ch = curl_init();
// Set the url, number of POST vars, POST data
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
// Disabling SSL Certificate support temporarly
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($fields));
// Execute post
$result = curl_exec($ch);
//echo "<pre>";
//print_r($result);die;
if ($result === FALSE) {
die('Curl failed: ' . curl_error($ch));
}
// Close connection
curl_close($ch);
return $result;
}
感谢。
答案 0 :(得分:1)
你提到了
然后我刚刚在密钥限制下的 Android应用中添加了我的包名和SHA-Fingerprints。我还在控制台中启用了GCM。
使用Google Developers Console中的新界面,似乎不再有选择要生成的API密钥类型的选项,但是,您仍然可以提供一些限制。根据您的说法,由于您选择了Android限制,因此API密钥被视为Android密钥。
关于FCM(甚至GCM)的事情是必须使用的API密钥是服务器密钥。我建议尝试将限制更改为IP服务器地址,添加服务器IP地址,然后测试推送通知。
答案 1 :(得分:0)
它现在开始工作,我刚刚找到了一个链接,因为我认为我应该与大家分享: - https://firebase.google.com/docs/cloud-messaging/server#implementing-http-connection-server-protocol