FCM通知发送代码长期停用后突然返回301错误求助
错误原因分析
301状态码代表永久重定向,核心原因是你当前使用的FCM旧端点https://fcm.googleapis.com/fcm/send已被谷歌永久迁移,不再作为有效请求入口。谷歌在近期逐步完成了Legacy FCM HTTP API的退役前置配置,旧端点会被强制重定向到新的FCM HTTP v1 API端点。
修复方案
方案一:迁移至FCM HTTP v1 API(推荐,符合谷歌长期支持策略)
更新请求URL
将原URL替换为FCM v1 API的标准端点,格式如下:Uri.parse('https://fcm.googleapis.com/v1/projects/你的Firebase项目ID/messages:send')其中
你的Firebase项目ID需要替换为你在Firebase控制台中对应的项目ID。替换Authorization认证方式
Legacy API使用的key=你的服务器密钥已不再适用于v1 API,需要改用OAuth 2.0访问令牌。你可以通过两种方式获取:- 使用Firebase Admin SDK(推荐):SDK会自动处理令牌的获取与刷新,无需手动编写请求逻辑。
- 手动请求令牌:通过服务账号密钥向
https://oauth2.googleapis.com/token发送POST请求,grant_type指定为urn:ietf:params:oauth:grant-type:jwt-bearer,生成有效令牌后,将Authorization头设置为Bearer 你的访问令牌。
调整请求体格式
v1 API的请求体结构与Legacy API不同,示例格式如下:final data = { "message": { "token": "目标设备的FCM令牌", "notification": { "title": "通知标题", "body": "通知内容" }, "data": { "custom_key": "custom_value" } } };
方案二:临时兼容(不推荐,Legacy API即将停用)
若需临时恢复运行,可尝试将请求URL调整为https://fcm.googleapis.com/v1/fcm/send,但此方式仅为临时过渡,谷歌已宣布Legacy FCM HTTP API将于2024年6月20日完全停用,最终仍需迁移至v1 API。
代码示例(使用Firebase Admin SDK简化实现)
如果使用Flutter/Dart环境,可引入firebase_admin包,简化通知发送逻辑:
import 'package:firebase_admin/firebase_admin.dart'; import 'package:firebase_admin/messaging.dart'; void sendNotification() async { final app = FirebaseAdmin.instance.app(); final messaging = Messaging(app); try { await messaging.send(Message( token: "目标设备令牌", notification: Notification( title: "通知标题", body: "通知内容", ), data: {"key": "value"}, )); log.log('sendNotificationG successfully done'); } catch (e) { log.log('Error: sendNotificationG failed - $e'); } }
内容的提问来源于stack exchange,提问作者Jack
相关产品推荐
相关产品推荐

