使用PHP向Android推送带data字段的通知时遇类型错误
FCM v1 API发送data字段报错的解决方法
问题原因
错误提示明确指出message.data[5].value(对应memeID)、message.data[9].value(对应commentCount)、message.data[10].value(对应mentioned)这三个字段的值是整数类型,但FCM v1 API要求data字段的所有值必须是字符串类型。旧版FCM API可能会自动处理数值类型的转换,但新版API执行更严格的类型校验,因此直接传入整数会触发INVALID_ARGUMENT错误。
解决方法
将$data数组中所有整数类型的值转换为字符串即可,有两种常见处理方式:
方式1:批量转换所有整数字段
使用array_walk遍历数组,自动将整数转为字符串:
// 处理$data数组,将所有int类型值转为字符串 array_walk($data, function(&$value) { if (is_int($value)) { $value = (string)$value; } });
方式2:手动转换指定字段
如果只需要转换特定的几个字段,直接强制类型转换即可:
$data['memeID'] = (string)$data['memeID']; $data['commentCount'] = (string)$data['commentCount']; $data['mentioned'] = (string)$data['mentioned'];
修改后的完整代码示例
在原代码中加入类型转换逻辑即可:
// 先处理$data的类型转换 array_walk($data, function(&$value) { if (is_int($value)) { $value = (string)$value; } }); $fields = [ 'message' => [ 'token' => $deviceToken, 'notification' => [ 'title' => $notifTitle, 'body' => $notifDesc ], 'data' => $data ] ]; $ch = curl_init(); curl_setopt( $ch,CURLOPT_URL, 'https://fcm.googleapis.com/v1/projects/bla/messages: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 ) ); $result = curl_exec($ch) . '<br><br>'; print($result);
内容的提问来源于stack exchange,提问作者TheGreatCornholio
相关产品推荐
相关产品推荐

