Firebase:使用PHP发送通知失败问题求助
我之前踩过这个坑!那个AndroidHive的教程是好几年前针对GCM的版本,现在GCM早就被Firebase Cloud Messaging(FCM)取代了,直接沿用原来的PHP代码肯定发不出通知。给你梳理几个必须调整的点,一步步来排查修复:
1. 替换API密钥为FCM服务器密钥
原来教程里的GCM API密钥已经失效,得换成FCM的服务器密钥:
- 登录Firebase控制台进入你的项目
- 点击右上角齿轮图标,选「项目设置」
- 切换到「云消息传递」标签,复制里面的「服务器密钥」
- 把PHP代码里原来的GCM密钥替换成这个新密钥
2. 更新请求的API端点
GCM的旧端点是https://android.googleapis.com/gcm/send,现在FCM要用新的端点:
https://fcm.googleapis.com/fcm/send
直接修改PHP中curl请求的URL即可。
3. 调整请求的JSON payload格式
FCM的消息格式和GCM有细微差异,比如推荐用to字段指定单设备令牌(原来的registration_ids也支持,但单设备用to更简洁),同时通知结构要符合FCM要求。示例代码如下:
$fields = array( 'to' => '你的设备注册令牌', 'notification' => array( 'title' => '测试通知标题', 'body' => '这是一条来自PHP的FCM通知', 'sound' => 'default' ), // 如果需要传递自定义数据,保留data字段 'data' => array( 'custom_key' => 'custom_value' ) );
4. 确认请求头设置正确
FCM要求请求头必须包含两个关键项,确保你的PHP curl代码里的头是这样的:
$headers = array( 'Authorization: key=' . '你的FCM服务器密钥', 'Content-Type: application/json' );
5. 开启调试查看错误信息
很多时候失败是因为有具体的错误但没被捕获,给PHP代码加上错误调试:
$ch = curl_init(); curl_setopt($ch, CURLOPT_URL, 'https://fcm.googleapis.com/fcm/send'); curl_setopt($ch, CURLOPT_POST, true); curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($fields)); $result = curl_exec($ch); // 捕获curl错误 if (curl_errno($ch)) { echo 'Curl错误: ' . curl_error($ch); } curl_close($ch); // 打印FCM返回的结果 var_dump($result);
运行后根据返回的错误信息(比如令牌无效、密钥错误等)针对性修复。
6. 验证设备注册令牌有效性
如果上面都调整了还是失败,先确认设备的注册令牌是否有效:用Firebase控制台的「测试消息」功能,输入这个令牌测试能否收到通知。如果收不到,说明令牌过期或无效,需要在Android端重新获取最新的FCM令牌。
内容的提问来源于stack exchange,提问作者SD Burman
相关产品推荐
相关产品推荐

