成功发送FCM载荷后是否应收到确认ID?[HTTP V1 API]
Firebase FCM HTTP V1 API 推送通知问题解答
问题1:指定文档中的确认ID是否适用于Firebase HTTP V1 API?
Legacy API中的message_id(即你提到的确认ID)在V1 API中对应响应体的name字段,格式为projects/{PROJECT_ID}/messages/{MESSAGE_ID}。你未获取到该字段是因为代码存在三处关键错误:
- 模板字符串使用错误:单引号包裹的字符串无法解析
${PROJECT_ID}这类变量,需改用反引号` - 未等待请求完成:
correspond.post(...)未加await,导致feedback是未完成的Promise,feedback.body为空 - AccessToken未保存:
await getAccessToken().then(...)仅打印token,未将值存入变量,后续Authorization头的${accessToken}为空
问题2:V1 API下是否有消息接收确认机制?
有。V1 API返回200响应时,响应体中的name字段就是Firebase Messaging分配的唯一消息标识,这是官方的确认依据。只要收到带name的200响应,即可确认FCM服务器已成功接收并受理你的消息请求。
问题3:如何测试/验证FCM是否已被Firebase-Messaging接收?
- 修正代码获取响应:先修复代码错误,正确拿到响应体中的
name字段,这是最直接的服务器端确认方式 - 设备端日志验证:在Flutter应用中监听FCM消息接收事件,打印日志确认消息到达设备。示例代码:
FirebaseMessaging.onMessage.listen((RemoteMessage message) { print('收到FCM消息: ${message.notification?.title}'); }); - Firebase控制台统计:在控制台「云消息传递」→「报告」中查看发送数据(数据有延迟)
- 控制台测试对比:使用Firebase控制台「云消息传递」→「发送测试消息」功能,输入设备Token直接发送,对比代码发送结果
代码修正示例
const correspond = require('superagent'); exports.sendCloudMessageSO = functions.https.onRequest(async (req, res) => { const receivedToken = req.body.token; try { // 保存accessToken到变量 const accessToken = await getAccessToken(); console.log('Next Token:', accessToken); const fcmMessage = { notification: { title: 'Sparky says hello!' }, android: { notification: { imageUrl: 'https://foo.bar.pizza-monster.png' } }, token: receivedToken, }; // 用反引号包裹模板字符串,加await等待请求完成 const feedback = await correspond .post(`https://fcm.googleapis.com/v1/projects/${PROJECT_ID}/messages:send`) .set('Content-Type', 'application/json') .set('Authorization', `Bearer ${accessToken}`) .send(fcmMessage); console.log('FCM响应:', feedback.body); console.log('消息确认ID:', feedback.body.name); res.status(200).json({ message: 'Message sent to Firebase successfully', messageId: feedback.body.name }); } catch (error) { console.error('Error sending cloud message:', error); res.status(500).send('Error sending cloud message'); } });
V1 API迁移补充说明
你的场景(为Flutter应用发送确认类推送)完全可行。针对V1 API文档分散的问题,建议:
- 按需配置平台字段:比如仅针对Android推送,可删除
apns、webpush等无关配置 - 重点确认认证方式:V1 API使用OAuth2令牌(通过服务账号获取),和Legacy API的服务器密钥完全不同
内容的提问来源于stack exchange,提问作者mathems32
相关产品推荐
相关产品推荐

