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
相关产品推荐
相关产品推荐

