使用GuzzleHttp调用FCM时遇INVALID_ARGUMENT错误:消息未设置
问题排查与修复
你的代码存在两个关键问题,导致FCM返回INVALID_ARGUMENT错误:
1. Guzzle请求参数嵌套错误
$client->post()的第二个参数需要是单层关联数组,但你额外嵌套了一层数组,导致Guzzle无法正确解析请求配置,最终发送的请求体不符合FCM的格式要求。
2. 手动JSON编码冲突
Guzzle的json选项会自动将PHP数组编码为JSON字符串,你手动用json_encode()处理$data后,会导致发送的内容是转义后的JSON字符串,FCM无法从中识别出合法的message字段。
修正后的代码
public function send(){ putenv('GOOGLE_APPLICATION_CREDENTIALS=<path-to-json-file>.json'); $scopes = ['https://www.googleapis.com/auth/firebase.messaging']; $middleware = ApplicationDefaultCredentials::getMiddleware($scopes); $stack = HandlerStack::create(); $stack->push($middleware); // 创建HTTP客户端 $client = new Client([ 'handler' => $stack, 'base_uri' => 'https://fcm.googleapis.com', 'auth' => 'google_auth' ]); // 直接使用PHP数组,无需手动json_encode $data = [ "message" => [ "topic" => "availableProviders", "notification" => [ "title" => "New Order", "body" => "New Order to accept", ], "data" => [ "service_id" => '1' ], ], "validateOnly" => false, ]; // 修正请求参数结构,直接传递单层关联数组 $response = $client->post('/v1/projects/<Project-id>/messages:send', [ 'json' => $data, 'headers' => [ 'accept' => 'application/json', 'Content-Type' => 'application/json', ], ]); dd($response); }
额外验证点
- 确认
<path-to-json-file>.json是正确的服务账号密钥路径,文件存在且具备可读权限。 - 确认
<Project-id>已替换为你的实际Firebase项目ID,避免路径中空缺或格式错误。
内容的提问来源于stack exchange,提问作者hkmbkjkj
相关产品推荐
相关产品推荐

