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

PHP开发FCM推送时数据库register_id字段存入{符号异常

FCM推送功能register_id字段仅存储{符号问题排查

核心错误原因

问题来自对json_encode()返回值的错误使用,逻辑链路如下:

  1. 代码中$register = json_encode($data['registrationId']);执行后,$register是JSON格式的字符串类型,不是可按键访问的PHP关联数组
  2. 后续赋值时写的$register['token']属于对字符串类型使用非数字键访问,PHP会自动将字符串键名token隐式转换为整数0,最终取到字符串索引为0的第一个字符,也就是JSON串开头的{,这就是数据库中仅存入单个{的直接原因。

可以用最小代码复现这个现象:

// 复现逻辑
$jsonStr = '{"token":"test_fcm_token"}';
var_dump($jsonStr['token']);
// 输出结果为 string(1) "{",和你遇到的存储异常完全一致

修复方案

二选一即可,核心是不要对JSON字符串直接用数组键取值:

  • 方案1(推荐,逻辑最简):去掉多余的encode步骤,直接从原始POST数组取值
// 删除无意义的提前json_encode逻辑,直接读取原始请求数组字段
$fcm = array(
    'register_id' => $data['registrationId']['token'],
    'platform' => $data['device']['platform'],
    'version' => $data['device']['version'],
    'uuid' => $data['device']['uuid'],
    'model' => $data['device']['model'],
    'manufacturer' => $data['device']['manufacturer'],
    'app_version' => $data['app_version'],
    'added_at' => date('Y-m-d H:i:s'),
);
  • 方案2:如果确实需要提前把registrationId转成JSON字符串做其他处理,取值前先把JSON解码为PHP数组
$register = json_encode($data['registrationId']);
// 解码为关联数组后再访问内部字段
$registerArr = json_decode($register, true);
$fcm = array(
    'register_id' => $registerArr['token'],
    // 其余字段和原有逻辑一致
);

额外优化提示

从你打印的请求参数看,当前POST payload中没有device层级的字段,代码中直接访问$data['device']['platform']等字段会触发Undefined array key警告,建议后续增加字段存在性校验,避免产生其他非预期运行异常。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 17:25:34