使用Retrofit调用FCM发送主题消息时持续返回401错误求助
解决FCM主题消息发送401错误的排查方案
最可能的直接问题:Authorization头格式错误
你的NotificationApi.kt里的授权头写法有问题:
@Headers("Authorization: key = ${Constants.SERVER_KEY}, " + "Content-Type: ${Constants.CONTENT_TYPE}")
FCM要求授权头的格式是Authorization: key=YOUR_SERVER_KEY,key和服务器密钥之间不能有空格。修正后的代码应该是:
@Headers("Authorization: key=${Constants.SERVER_KEY}, " + "Content-Type: ${Constants.CONTENT_TYPE}")
其他需要逐一排查的点
- 确认服务器密钥类型正确:别把Web API密钥当成服务器密钥用。正确的服务器密钥在Firebase控制台的「项目设置」→「云消息传递」里,找「服务器密钥」那一项。
- 检查FCM API是否启用:去Google Cloud控制台搜你的项目,找到「Firebase Cloud Messaging API」,确保它是启用状态——有时候新建项目默认没开这个API。
- IP限制是否拦截了请求:如果你的服务器密钥设置了IP白名单,调试阶段可以先关掉限制试试,确认是不是IP不在允许列表里导致的401。
- 主题格式是否正确:发送主题消息时,
to字段必须是"/topics/你的主题名",比如"/topics/sports",只写主题名会导致请求无效。 - Retrofit头是否被覆盖:检查有没有OkHttp拦截器修改了Authorization头,有些拦截器会自动添加或覆盖请求头,导致你的密钥没生效。
快速验证请求的方法
用Postman直接发请求测试,排除代码问题:
- 请求方式选POST,地址填
https://fcm.googleapis.com/fcm/send - 添两个请求头:
Authorization: key=你的服务器密钥Content-Type: application/json
- 请求体用JSON格式:
{ "data": { "title": "测试标题", "msg": "测试内容" }, "to": "/topics/你的主题" }
如果Postman能成功发送,那问题肯定在你的Android代码里;如果还是401,那就是密钥或云服务配置的问题。
内容的提问来源于stack exchange,提问作者Mohamed Hossam
相关产品推荐
相关产品推荐

