Flutter Web FCM:控制台可收消息,REST API报InvalidRegistration失败
排查步骤
核对请求格式
单个token推送必须用to字段,别用批量的registration_ids数组。正确的请求体示例:{ "to": "你的设备注册token", "notification": { "title": "测试推送", "body": "测试内容" }, "webpush": { "headers": { "Urgency": "high" } } }把单个token塞到
registration_ids里会直接触发InvalidRegistration错误。检查token本身
确保复制的token和控制台测试的完全一致,没有多余空格、换行,代码里传递时也没被意外转义。可以直接把控制台用的token粘到Postman里发请求,排除复制或代码序列化问题。验证请求头权限
请求头的Authorization必须是key=你的服务器端密钥,这个密钥要从Firebase控制台「项目设置」→「云消息传递」里拿,别用Web应用的API密钥,必须用服务器专用的那个。匹配插件与Flutter版本
Flutter 3.0.7要搭配适配的firebase_messaging_web版本,比如锁定firebase_messaging: ^14.0.0,避免版本不兼容导致token生成异常。检查Firebase配置
确认firebase_options.dart里的Web应用配置正确,同时Firebase控制台中该Web应用的云消息传递功能已启用,传统API或HTTP v1 API权限正常。切换端点测试
如果用的是传统端点https://fcm.googleapis.com/fcm/send,可以试试HTTP v1端点https://fcm.googleapis.com/v1/projects/你的项目ID/messages:send,后者用OAuth2令牌授权,可能绕过一些格式或权限坑。
快速验证动作
- 用Postman手动发请求,排除代码里的请求组装错误;
- 调用
FirebaseMessaging.instance.getToken()重新拿一次token,替换后再测试; - 查看浏览器控制台的FCM日志,有没有服务工作者注册失败、token获取警告这类问题。
内容的提问来源于stack exchange,提问作者Hendrik

