webman需直调fcm v1 rest api实现推送,因google已弃用kreait/firebase-php的admin功能且旧sdk不支持jwt认证;关键步骤包括用serviceaccountkey.json生成access token、正确构造payload、设置http头,并注意404/403/400等错误排查。

Webman 本身不内置 Firebase 推送能力,PHP 侧必须通过 Firebase Admin SDK 的 HTTP API(即 https://fcm.googleapis.com/v1/projects/{project_id}/messages:send)发送消息,不能直接用官方 PHP Admin SDK(Google 已于 2023 年正式弃用并归档 firebase-php 项目)。绕过 SDK、直调 REST API 是当前最稳定、可控、可调试的方案。
为什么 PHP 不能用 firebase-admin 官方 SDK?
Google 官方在 2023 年 8 月宣布停止维护 kreait/firebase-php 的 Admin 功能(v6.0+ 彻底移除 FirebaseMessaging),且 Google Cloud 的 IAM 权限模型已全面转向 Service Account + OAuth2 bearer token 认证。旧版 SDK 依赖的 legacy HTTP v1 接口(/fcm/send)已关闭,强制要求使用 v1 REST API + JWT 签名认证。
- 你若在 Composer 中安装
kreait/firebase-php并调用send(),大概率收到401 Unauthorized或403 Permission denied - 即使配置了
serviceAccountKey.json,旧 SDK 不生成符合新 API 要求的 JWT bearer token - Webman 是 Swoole 基础的常驻内存框架,需手动管理 HTTP client 生命周期,不适合封装不可控的旧 SDK
Webman 中安全调用 FCM v1 REST API 的关键步骤
核心是:用 serviceAccountKey.json 生成短期有效的 access token,再用该 token 请求 https://fcm.googleapis.com/v1/...。不要硬编码 token,也不要复用过期 token。
- 将
serviceAccountKey.json放在 Webman 项目外(如/etc/webman-fcm-key.json),避免误提交到 Git - 使用
google/auth库获取 access token:use Google\Auth\ApplicationDefaultCredentials; $credentials = ApplicationDefaultCredentials::getCredentials( 'https://www.googleapis.com/auth/firebase.messaging', '/etc/webman-fcm-key.json' ); $accessToken = $credentials->fetchAuthToken()['access_token']; - 构造 JSON payload 时,
message.token字段填设备的 FCM registration token;若推主题,用message.topic(如"news") - HTTP 请求头必须含:
Authorization: Bearer {access_token}和Content-Type: application/json - 推荐用 Webman 自带的
support/http-client(基于 Swoole\Coroutine\Http\Client),设置timeout=5防卡死
常见错误和对应修复
发不出消息?90% 出现在这几个地方:
-
404 Not Found:检查 URL 中的{project_id}是否与 Firebase 控制台「项目设置 → 通用」里的Project ID完全一致(不是 Web App 的appId) -
403 Permission denied:Service Account 必须拥有Firebase Messaging Admin角色(控制台 → IAM → 添加成员 → 选择该账号 → 赋予角色) -
400 InvalidArgument:payload 中message.data键名含空格或点号(.),FCM v1 不允许;改用下划线_ - 收不到通知(Android/iOS):确认客户端 token 未过期;iOS 需额外上传 APNs Auth Key 到 Firebase 控制台;Android 检查是否调用了
messaging.getToken()且用户授权了通知 - Web 端收不到后台通知:Service Worker 文件(
firebase-messaging-sw.js)必须部署在站点根目录,且 MIME 类型为text/javascript;Chrome 要求 HTTPS
真正麻烦的不是调通一次推送,而是 token 过期自动刷新、设备批量失败重试、主题订阅状态同步——这些逻辑得自己在 Webman 的 Job 或定时任务里补全,别指望一个 HTTP 请求就搞定海外推送的稳定性。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











