URL编码与Curl PHP

时间:2018-04-23 01:17:09

标签: php curl urlencode url-encoding

我提出了更改建议,但仍然收到类似的错误:

{"错误":" invalid_request"," error_description":"无效的授权类型"}

如果未正确设置url-encoding,则可能会发生此错误。更新后的代码如下 任何帮助将不胜感激!

<?php

$client_id = '...';
$redirect_uri = 'http://website.com/foursquare2.php';
$client_secret = '...';
$code = $_REQUEST['code'];

$ch = curl_init();

curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: application/x-www-form-urlencoded'));
curl_setopt($ch, CURLOPT_URL, "https://id.shoeboxed.com/oauth/token");
curl_setopt($ch, CURLOPT_POST, TRUE);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($ch, CURLOPT_POSTFIELDS, array(
'grant_type' => 'authorization_code',
'code' => $code,
'client_id' => $client_id,
'client_secret' => $client_secret,
'redirect_uri' => $redirect_uri
));

$response = curl_exec($ch);

$err = curl_error($ch);
curl_close($ch);
if ($err) {
  echo "cURL Error #:" . $err;
} else {
  echo $response;
}
?>

1 个答案:

答案 0 :(得分:0)

您的代码以multipart/form-data格式发送数据。当您为CURLOPT_POST提供一个数组时,curl将自动以multipart/form-data格式对该数组中的数据进行编码。然后你用你的标题告诉服务器this data is in application/x-www-form-urlencoded format,服务器会尝试解析它,然后失败,从而收到你的错误。

首先,完全摆脱curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: application/x-www-form-urlencoded'));。如果您正在使用application / x-www-form-urlencoded,php / curl会自动为您添加该标题,与您不同,php / curl不会进行任何拼写错误(开发人员都有自动测试套装以确保这一点同样,如果你使用multipart/form-data格式,php / curl会为你添加那个标题,所以不要手动添加这两个特定的标题。

如果你想使用multipart/form-data格式,只需删除标题。但如果你想使用application/x-www-form-urlencoded格式,PHP有一个内置函数来编码为这种格式,称为http_build_query,所以

curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query(array(
'grant_type' => 'authorization_code',
'code' => $code,
'client_id' => $client_id,
'client_secret' => $client_secret,
'redirect_uri' => $redirect_uri
)));

(并且还会删除内容类型标题,它会自动添加。)