从MySQL读取设备Token推送FCM通知失败求助
问题排查方案
可能的原因及解决方法
隐形空白字符干扰:数据库读取的Token可能包含换行、空格、制表符等不可见字符,视觉上和手动输入一致但实际长度不同,导致FCM验证失败。
- 验证方式:对比手动输入与数据库读取Token的长度:
echo "手动Token长度:" . strlen($manualToken) . "\n"; echo "数据库Token长度:" . strlen($dbToken) . "\n"; - 解决办法:读取Token后立即去除首尾空白:
$dbToken = trim($dbToken);
- 验证方式:对比手动输入与数据库读取Token的长度:
数据库连接编码不匹配:即使数据表编码是
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);
- 验证方式:打印最终发送给FCM的JSON字符串,与手动成功的请求对比:
内容的提问来源于stack exchange,提问作者jaime aparicio
相关产品推荐
相关产品推荐

