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

PHP使用最新HTTP发送FCM多令牌通知失败求助

问题描述

我用PHP向单个FCM令牌发送通知完全正常,但批量发送给多个令牌时总是失败,以下是我的批量发送代码,恳请帮忙解决:

我的批量发送代码:

$deviceTokens = $token_ids; // 存储设备令牌的数组

$fcmNotifications = [];

foreach ($deviceTokens as $token_indv) {
    $fcmNotifications[] = [
        'message' => [
            'token' => $token_indv,
            'notification' => $notification,
        ],
    ];
}

$headers = [
    'Authorization: Bearer ' . $accessToken,
    'Content-Type: application/json'
];

echo json_encode($fcmNotifications);

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL,$fcmUrl);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS,json_encode($fcmNotifications));  //Post Fields
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
$server_output = curl_exec ($ch);
curl_close ($ch);
echo $server_output;

解决方案

你当前的请求体格式不符合FCM批量发送的规范,FCM的批量发送接口要求请求体是一个包含messages键的对象,而非直接的消息数组,且每个消息不需要嵌套在message字段里。

修正后的代码如下:

$deviceTokens = $token_ids; // 存储设备令牌的数组

// 构造符合要求的消息数组
$fcmMessages = [];
foreach ($deviceTokens as $token_indv) {
    $fcmMessages[] = [
        'token' => $token_indv,
        'notification' => $notification,
    ];
}

// 包裹成FCM要求的请求体结构
$requestBody = [
    'messages' => $fcmMessages
];

$headers = [
    'Authorization: Bearer ' . $accessToken,
    'Content-Type: application/json'
];

$ch = curl_init();
// 确保使用FCM的批量发送端点:https://fcm.googleapis.com/v1/projects/{你的项目ID}/messages:sendAll
curl_setopt($ch, CURLOPT_URL, $fcmUrl);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($requestBody));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
// 可选:开启curl错误捕获,方便排查问题
curl_setopt($ch, CURLOPT_VERBOSE, true);
$server_output = curl_exec($ch);

// 检查curl请求是否失败
if(curl_errno($ch)){
    echo 'Curl error: ' . curl_error($ch);
}

curl_close($ch);
echo $server_output;

关键修正点:

  • 请求体结构:将原本的消息数组包裹在messages键下,每个消息直接包含token和notification字段,不需要嵌套message层级。
  • 端点验证:确保$fcmUrl使用的是FCM的批量发送端点https://fcm.googleapis.com/v1/projects/{你的项目ID}/messages:sendAll,而非单个消息的发送端点。
  • 错误排查:添加了curl错误捕获,方便定位请求过程中出现的网络或协议错误。

另外,注意FCM批量发送的消息数量上限是500条,如果你的$deviceTokens数组长度超过500,需要拆分批次发送。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 22:30:09