php - 使用 Curl PHP 进行 URL 编码

标签 php curl urlencode url-encoding

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

{"error":"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;
}
?>

最佳答案

您的代码正在以 multipart/form-data 格式发送数据。当你给 CURLOPT_POST 一个数组时,curl 会自动以 multipart/form-data 格式对该数组中的数据进行编码。然后你用你的 header 告诉服务器,这个数据是 application/x-www-form-urlencoded 格式,服务器将尝试这样解析它,但失败了,因此你收到了错误。

首先,完全摆脱 curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: application/x-www-form-urlencoded'));。如果您使用的是 application/x-www-form-urlencoded,php/curl 会自动为您添加该 header ,并且与您不同的是,php/curl 不会出现任何拼写错误(开发人员使用自动化测试套件来确保这一点东西在每次发布之前都是正确的),同样,如果您使用 multipart/form-data 格式,php/curl 会为您添加该 header ,因此不要手动添加这 2 个特定 header 。

如果你想使用 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
)));

(同时去掉内容类型标题,它将自动添加。)

关于php - 使用 Curl PHP 进行 URL 编码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49972211/

相关文章:

PHP/PostgreSQL 数据库写入问题

PHP MySQL更新和奇怪的字符?

php - 如何仅对 url 字符串中的查询参数进行编码?

php - 如何解决 OAuth 1.0 中的 "Invalid signature. Expected signature base string"

php - 调用时找不到自定义 Twig 过滤器

php - 在php中用一个json更新多个mysql表

swift - 如何在 Swift 中执行curl 请求?

php - 下载期间如何解决 cUrl 损坏文件

ios - 对 url 字符串进行编码

php - 我如何在我的数据库中插入或更新一个条目,如果更新我如何添加到现有值