Firebase Cloud Messaging浏览器推送通知未接收问题排查(PHP REST API)
解决FCM浏览器推送通知接收失败问题
针对你遇到的FCM显示已发送但浏览器无接收的问题,从操作流程和代码来看,存在几个关键排查点和代码修正项:
一、代码中的明显错误
1. 令牌被不必要转义
你的getUserToken函数使用htmlentities处理令牌,这会破坏FCM令牌的原始格式(令牌包含特殊字符时会被转义,比如&变成&),导致FCM无法匹配到正确设备。
修正:
function getUserToken( $userId ) { return $_POST['tokenDest']; // 移除htmlentities转义 }
2. CURLOPT_POST参数错误
CURLOPT_POST需要传入布尔值true表示启用POST请求,而非字符串'POST',虽然curl可能兼容,但不符合规范的写法可能导致请求异常。
修正:
CURLOPT_POST => true,
3. 未捕获FCM响应信息
当前代码只打印了请求体,没有输出FCM的返回响应,无法确认请求是否真的被正常处理(FCM报告显示已发送可能只是接收了请求,但实际可能存在令牌无效等隐性错误)。
添加响应捕获:
$response = curl_exec($curl); echo "FCM响应:" . $response; // 打印响应内容排查问题
二、浏览器与Service Worker配置检查
1. 浏览器状态与权限
- 确保浏览器未处于隐身模式,FCM推送无法在隐身窗口中接收
- 检查浏览器通知权限是否开启(设置→隐私与安全→通知,确认目标网站权限为允许)
- 浏览器需支持Service Worker和Push API(主流Chrome、Firefox等均支持,需确保版本不老旧)
2. Service Worker配置
FCM浏览器推送依赖Service Worker处理推送事件,必须满足:
- 存在
sw.js文件,放置在网站根目录(或配置正确的scope) sw.js中包含push事件监听,用于展示通知:
self.addEventListener('push', function(event) { const payload = event.data ? event.data.json() : {}; const notificationOptions = { body: payload.notification?.body || '新通知', title: payload.notification?.title || '通知', icon: '/path/to/your/icon.png' // 需替换为实际图标路径 }; event.waitUntil( self.registration.showNotification(notificationOptions.title, notificationOptions) ); });
- 页面中已正确注册Service Worker并初始化FCM:
// 注册Service Worker if ('serviceWorker' in navigator) { navigator.serviceWorker.register('/sw.js') .then(registration => { console.log('Service Worker注册成功:', registration); // 初始化FCM const messaging = firebase.messaging(); messaging.useServiceWorker(registration); // 请求通知权限并获取令牌 messaging.requestPermission() .then(() => messaging.getToken()) .then(token => { console.log('设备令牌:', token); // 将令牌发送到后端保存 }); }); }
三、FCM权限与请求验证
- 确认你的Bearer Token拥有
firebase.messaging.send权限,可通过Google Cloud IAM控制台检查服务账号权限 - 验证令牌有效性:可通过FCM v1 API的响应确认令牌是否仍有效,过期或失效的令牌会导致推送无法送达
内容的提问来源于stack exchange,提问作者Vivien
相关产品推荐
相关产品推荐

