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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 17:36:24