如何用PHP服务端实现Firebase带大图的推送通知?
解决PHP服务端发送带大图的Firebase推送通知问题
问题分析
你之前的代码只定义了推送的payload结构,但缺少了发起HTTP请求的核心环节,另外还有几个容易踩坑的点可能导致大图不显示:比如图片URL不是HTTPS协议、请求头配置错误、FCM服务器权限不足等。
完整可行代码示例
下面是经过验证的完整实现,包含了所有必要的请求配置:
<?php // 基础配置信息 $serverKey = '你的Firebase服务器密钥'; // 从Firebase控制台获取 $targetToken = '目标设备的FCM令牌'; $notifyTitle = '你的通知标题'; $notifyContent = '你的通知内容'; $bigImageUrl = 'https://你的大图地址(必须是HTTPS可访问)'; $clickRedirectUrl = '点击通知跳转的目标URL'; // 构建FCM推送Payload $pushPayload = [ 'to' => $targetToken, 'notification' => [ 'title' => $notifyTitle, 'body' => $notifyContent, 'click_action' => $clickRedirectUrl, 'image' => $bigImageUrl // 这个字段用于指定通知栏显示的大图 ], // 可选:添加自定义业务数据,客户端可自行解析 'data' => [ 'custom_id' => '123', 'extra_info' => '自定义内容' ] ]; // 初始化CURL请求 $curl = curl_init(); curl_setopt($curl, CURLOPT_URL, 'https://fcm.googleapis.com/fcm/send'); curl_setopt($curl, CURLOPT_POST, true); curl_setopt($curl, CURLOPT_HTTPHEADER, [ 'Authorization: key=' . $serverKey, 'Content-Type: application/json' ]); curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); curl_setopt($curl, CURLOPT_POSTFIELDS, json_encode($pushPayload)); // 执行请求并处理响应 $response = curl_exec($curl); $curlError = curl_error($curl); curl_close($curl); // 调试输出结果 if ($curlError) { echo '请求错误: ' . $curlError; } else { echo 'FCM返回响应: ' . $response; } ?>
关键注意事项
- 服务器密钥获取:登录Firebase控制台 → 进入项目设置 → 选择「云消息传递」标签 → 复制「服务器密钥」
- 图片要求:必须使用HTTPS协议的公开可访问链接,图片尺寸建议适配通知栏(比如宽高比2:1),避免防盗链限制导致FCM无法拉取图片
- 如果notification的image字段不生效:可以改用data字段传递大图地址,然后在客户端(Android/iOS)自定义通知显示逻辑,示例payload调整如下:
$pushPayload = [ 'to' => $targetToken, 'notification' => [ 'title' => $notifyTitle, 'body' => $notifyContent, 'click_action' => $clickRedirectUrl ], 'data' => [ 'big_image_url' => $bigImageUrl, 'custom_data' => '自定义内容' ] ];
这种方式需要客户端配合,比如Android在FirebaseMessagingService中读取data字段,手动构建带大图的通知。
常见排查要点
- 检查服务器密钥是否正确,是否有云消息传递的权限
- 直接在浏览器打开图片URL,确认能正常加载(必须是HTTPS)
- 查看FCM返回的响应信息,根据错误提示调整(比如令牌无效、权限不足等)
内容的提问来源于stack exchange,提问作者Vejzovic Mersad
相关产品推荐
相关产品推荐

