向FCM API发送请求时收到无效的JSON有效负载

时间:2019-12-05 09:25:08

标签: php json curl firebase-cloud-messaging

我正在通过我的PHP应用程序向FCM发送请求,但它返回以下错误:

{ 
"code": 400,
"message": "Invalid JSON payload received. 
    Unknown name \"{\"validateOnly\":true,\"message\":{\"name\":\"testName\",\"token\":\"validToken\"}}\":
    Cannot bind query parameter. Field '{\"validateOnly\":true,\"message\":{\"name\":\"testName\",\"token\":\"validToken\"}}' 
    could not be found in request message.",
"status": "INVALID_ARGUMENT",
"details": [ { "@type": "type.googleapis.com/google.rpc.BadRequest",
"fieldViolations": [ 
   { "description": "Invalid JSON payload received. 
       Unknown name \"{\"validateOnly\":true,\"message\":{\"name\":\"testName\",\"token\":\"validToken\"}}\":
       Cannot bind query parameter.
       Field '{\"validateOnly\":true,\"message\":{\"name\":\"testName\",\"token\":\"validToken\"}}' could not be found in request message."
} ] } ] } }

我的通知

$notification = [
    'validateOnly' => true,
    'message' => [
        'name' => $name,
        'token' => "validToken"
    ]
];

$notification = json_encode($notification)

作为JSON:

{ 
   "validateOnly":true,
   "message":{ 
      "name":"testName",
      "token":"validToken"
   }
}

我的http标头

$header = [
        'Accept' => 'application/json',
        'Content-Length' => strlen($notification),
        'Content-Type' => 'application/json',
];

$header = json_encode($header, JSON_UNESCAPED_SLASHES);

作为JSON:

{ 
   "Accept":"application/json",
   "Content-Length":72,
   "Content-Type":"application/json"
}

我的cURL代码

$curl_session = curl_init();
try {
    curl_setopt($curl_session, CURLOPT_URL, $this->_apiUrl);
    //_api_Url = https://fcm.googleapis.com/v1/projects/projectName/messages:send?access_token=$access_token
    curl_setopt($curl_session, CURLOPT_POST, true);
    curl_setopt($curl_session, CURLOPT_HTTPHEADER, $header);
    curl_setopt($curl_session, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($curl_session, CURLOPT_SSL_VERIFYPEER, false);
    curl_setopt($curl_session, CURLOPT_IPRESOLVE, CURL_IPRESOLVE_V4);
    curl_setopt($curl_session, CURLOPT_POSTFIELDS, $notification);
} catch (Exception $e) {
    print_r($e);
}
$result = curl_exec($curl_session);
curl_close($curl_session);

我的猜测是,导致问题的原因是\"{\"validateOnly\"...中的前两个引号。 那可能吗?如果是这样,您如何建议我修复它? 还有其他想法吗?据HTTP v1 docs

,据我所知我的所有代码都是正确的

1 个答案:

答案 0 :(得分:1)

您的标题错误。这不是php-curl期望的,因此,您的请求内容类型将是默认的application/x-www-form-urlencoded,而不是将其视为json。它应该看起来像这样:

$header = [
    'Accept:application/json',
    'Content-Length:'.strlen($notification),
    'Content-Type:application/json',
];
curl_setopt($curl_session, CURLOPT_HTTPHEADER, $header);

不要对它进行json编码,只需将其传递给curl。

您可以在此处找到此文档:https://www.php.net/manual/en/function.curl-setopt.php

  

要设置的HTTP标头字段数组,格式为   array('Content-type:text / plain','Content-length:100')