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

从MySQL读取设备Token推送FCM通知失败求助

问题排查方案

可能的原因及解决方法

  • 隐形空白字符干扰:数据库读取的Token可能包含换行、空格、制表符等不可见字符,视觉上和手动输入一致但实际长度不同,导致FCM验证失败。

    • 验证方式:对比手动输入与数据库读取Token的长度:
      echo "手动Token长度:" . strlen($manualToken) . "\n";
      echo "数据库Token长度:" . strlen($dbToken) . "\n";
      
    • 解决办法:读取Token后立即去除首尾空白:
      $dbToken = trim($dbToken);
      
  • 数据库连接编码不匹配:即使数据表编码是utf8_general_ci,PHP连接数据库时若未明确指定编码,可能导致读取时出现隐性编码转换错误。

    • 解决办法:在数据库连接成功后设置编码:
      // mysqli 示例
      mysqli_set_charset($conn, 'utf8');
      // PDO 示例
      $pdo = new PDO('mysql:host=localhost;dbname=your_db;charset=utf8', $username, $password);
      
  • 数组结构差异:手动构造的数组与数据库读取生成的数组可能存在结构差异(比如关联数组嵌套、多余键值),导致FCM无法正确解析目标设备列表。

    • 验证方式:用var_dump()替代print_r()查看数组的详细结构:
      var_dump($manualDeviceTokens);
      var_dump($dbDeviceTokens);
      
    • 解决办法:确保从数据库读取后生成纯索引数组:
      $dbDeviceTokens = [];
      while ($row = mysqli_fetch_assoc($result)) {
          $dbDeviceTokens[] = trim($row['device_token']);
      }
      
  • FCM请求JSON格式异常:组装FCM请求数据时,数据库读取的Token若存在隐藏问题,可能导致JSON序列化出错。

    • 验证方式:打印最终发送给FCM的JSON字符串,与手动成功的请求对比:
      $fcmPayload = json_encode([
          'registration_ids' => $dbDeviceTokens,
          'notification' => ['title' => '测试通知', 'body' => '内容']
      ]);
      echo "FCM请求JSON:" . $fcmPayload . "\n";
      
    • 解决办法:若JSON存在转义问题,添加序列化参数:
      $fcmPayload = json_encode($data, JSON_UNESCAPED_UNICODE);
      

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 16:05:00