FCM推送需用PHP cURL向https://fcm.googleapis.com/fcm/send发送POST请求,设置Authorization:key=SERVER_KEY与Content-Type:application/json,JSON中包含to字段(FCM token)及notification或data至少一项,注意超时设为15秒并处理响应状态码。

PHP 本身不直接发送推送通知,它需要调用第三方推送服务的 HTTP API(如 Apple APNs、Google FCM、华为 HMS、极光、个推等)。你真正要做的,是用 PHP 发起一个带特定格式和认证头的 POST 请求。
FCM 的 send 接口怎么调用(PHP cURL)
这是目前最常用的安卓+Web 推送通道。关键不是“发没发”,而是请求是否被 FCM 接收并返回 200 或有效错误码。
- 必须使用
https://fcm.googleapis.com/fcm/send(注意路径末尾是/send,不是/v1/projects/.../messages:send—— 后者需 OAuth2,前者只需Authorization: key=YOUR_SERVER_KEY) -
Content-Type必须设为application/json,且 JSON body 中to字段填设备的 FCM token(不是 App ID),或用condition/topic群发 - 别漏掉
notification或data至少一个字段;纯data消息在后台可能被系统丢弃(尤其 Android 8+) - 示例片段:
curl -X POST https://fcm.googleapis.com/fcm/send \
-H "Authorization: key=AAAAxyz..." \
-H "Content-Type: application/json" \
-d '{
"to": "fcm_token_here",
"notification": {"title": "Hi", "body": "From PHP"},
"data": {"click_action": "FLUTTER_NOTIFICATION_CLICK"}
}'
APNs 报错 403 Forbidden 怎么排查
这不是 PHP 代码问题,而是证书或 JWT 认证配置不对。APNs 不接受 key=xxx 这种方式。
- 确认你用的是
https://api.push.apple.com(生产)或https://api.development.push.apple.com(开发),端点写错直接 404 或 403 - JWT 必须包含
alg: "ES256"、kid(密钥 ID)、iss(Team ID),且签名用 .p8 私钥生成 —— 不能用 PEM 格式证书 - PHP 中推荐用
firebase/php-jwt库生成 token,手动拼接容易出错(比如时间戳用time()但没减去时区偏移) - 常见坑:
iat(issued at)必须是整数秒,且不能早于当前时间 60 秒或晚于 60 秒,否则 APNs 拒绝
为什么本地测试能发,上线后 500 或超时
多数情况是服务器环境限制,而非 PHP 逻辑错误。
立即学习“PHP免费学习笔记(深入)”;
- 检查
allow_url_fopen是否为On(影响file_get_contents);更推荐统一用cURL,可控性更强 - 确认服务器能访问外网:执行
curl -I https://fcm.googleapis.com看是否通;有些 IDC 或云主机默认屏蔽 443 出向 - PHP 超时设置太短:
curl_setopt($ch, CURLOPT_TIMEOUT, 10)容易中断,FCM 在高负载时响应可能达 3–5 秒,建议设为 15 - 别在 Web 请求中同步等待推送结果 —— 应该记录日志 + 异步重试,否则用户会感知卡顿
真正难的不是写那几行 cURL,而是 token 生命周期管理、失败重试策略、多平台消息格式适配,以及——你得确保前端每次登录/重装都把最新 token 上报到你的 PHP 后端。



















