You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PHP端发送FCM消息无法送达设备,控制台发送正常,请求协助排查

兄弟,我之前踩过一模一样的坑!你这种情况太典型了——拿到了message_id但设备收不到,核心问题就是FCM消息类型不匹配:你用控制台发的是「通知消息」,但PHP代码里只传了data字段,而很多客户端默认只处理notification类型的消息,没做data消息的接收逻辑。

问题根源

FCM有两种核心消息类型:

  • 通知消息:由FCM SDK自动处理,会直接在系统通知栏弹出,不需要客户端额外写代码(只要正常集成了FCM),控制台发送的就是这种。
  • 数据消息:完全由客户端代码处理,FCM不会自动展示通知,需要你在onMessageReceived(Android)或者didReceiveRemoteNotification(iOS)里手动编写展示逻辑。

你的代码里只填了data字段,所以即使FCM返回了message_id(说明接口调用成功),但客户端如果没处理数据消息,就不会显示通知。

解决方案:调整消息结构

把消息内容放到notification字段里,或者同时包含notification和data(兼顾通知展示和自定义数据传递)。修改后的PHP代码如下:

public function send_fcm() { 
    $API_ACCESS_KEY = '*****************************'; 

    // 通知消息(对应控制台发送的通知,会自动在系统栏弹出)
    $notification = array(
        'title' => 'This is a title. title',
        'body' => 'here is a message. message', // 注意:控制台的"消息内容"对应这里的body,不是你原来的message
        'subtitle' => 'This is a subtitle. subtitle',
        'ticker' => 'Ticker text here...',
        'sound' => 'default', // 用字符串"default"而不是数字1,符合FCM规范
        'vibrate' => true // 布尔值比数字更规范
    );

    // 可选:自定义数据,如果需要给客户端传额外业务参数可以保留
    $data = array(
        'custom_param' => 'any_value_you_need'
    );

    $fields = array(
        'to' => '/topics/mytopic', 
        'priority' => 'high', 
        'notification' => $notification, // 关键:加上这个字段
        'data' => $data // 可选保留
    ); 

    $headers = array(
        'Authorization: key=' . $API_ACCESS_KEY, 
        'Content-Type: application/json'
    ); 

    $ch = curl_init(); 
    curl_setopt($ch, CURLOPT_URL, 'https://fcm.googleapis.com/fcm/send'); 
    curl_setopt($ch, CURLOPT_POST, true); 
    curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); 
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); 
    curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($fields)); 
    
    $pushResult = curl_exec($ch); 
    // 建议打印返回结果,排查潜在问题(比如部分设备未成功订阅topic)
    var_dump($pushResult);
    
    curl_close($ch); 
}

额外检查点

  1. 客户端接收逻辑:如果确实需要用data消息,确保客户端代码里处理了数据消息的接收。比如Android的FirebaseMessagingService中,不管是通知还是数据消息,都要在onMessageReceived里手动编写展示通知的代码。
  2. 字段名正确性:FCM的notification字段有固定键名,比如内容是body而不是你原来的message,ticker而不是tickerText,这些细节错了也会导致通知不显示。
  3. Topic订阅状态:确认设备已经成功订阅了/topics/mytopic,可以在客户端代码里加订阅成功的日志验证。

内容的提问来源于stack exchange,提问作者aj888

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 08:48:41