迁移至FCM HTTP V1 API遇问题:现有注册被标记为未注册
FCM V1 API 报 UNREGISTERED 错误的解决方案
错误原因
你传入的是Web Push标准订阅的endpoint路径ID,但FCM V1 API的token字段要求的是FCM注册令牌——这是两个完全不同的标识体系,因此会返回UNREGISTERED错误。
旧版FCM Send API支持直接处理Web Push订阅对象,而V1 API仅兼容Firebase Messaging SDK生成的注册令牌,两者不互通。
解决方法
方案1:迁移到FCM V1 API(需重新收集用户订阅)
如果要完全切换到V1 API,需要让用户重新订阅以获取FCM注册令牌:
- 在Web应用中集成Firebase Messaging SDK。
- 用户授权通知权限后,调用SDK的
getToken()方法获取FCM注册令牌:
import { getMessaging, getToken } from "firebase/messaging"; const messaging = getMessaging(); async function saveFCMToken() { const token = await getToken(messaging, { vapidKey: "你的VAPID公钥" }); if (token) { // 将令牌发送到后端数据库存储,替换原有的Web Push订阅ID await fetch('/api/save-fcm-token', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ token }) }); } }
- 调用V1 API时,将这个令牌填入请求体的
message.token字段,即可正常发送通知。
方案2:保留现有Web Push订阅(无需重新收集)
如果不想强制用户重新订阅,可以继续使用标准Web Push协议直接推送,不受旧版FCM Send API弃用影响:
- 从数据库取出订阅对象的
endpoint、p256dh、auth字段。 - 使用VAPID密钥生成
Authorization头(或使用Firebase项目的服务器密钥,格式为Authorization: key=你的服务器密钥)。 - 按照Web Push标准加密payload(采用
aesgcm内容编码),直接向endpoint地址发送POST请求即可,无需使用V1 API。
额外注意事项
- 若用户清除浏览器数据、撤销通知权限或卸载PWA,原有订阅会失效,发送时会返回类似错误,需在后端捕获错误并从数据库中移除无效订阅。
内容的提问来源于stack exchange,提问作者prateek31
相关产品推荐
相关产品推荐

