使用CURL检索授权代码的Instagram API调用返回空



我正在尝试用PHP中的CURL设置Instagram API提要,但当尝试检索auth代码时,字符串返回空,然后成功调用以检索用户的内容:

$uri = 'https://api.instagram.com/oauth/authorize/';
$data = [
'client_id' => $client_id,
'redirect_uri' => $redirect_uri,
'response_type' => 'code'
];
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $uri);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_NOBODY, 0);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
$result = curl_exec($ch);
curl_close($ch);
var_dump($result);

然而,当我直接在浏览器中访问URL时,它会返回到重定向URI,并带有我需要的代码:

https://api.instagram.com/oauth/authorize/?client_id=CLIENT_ID_HERE&redirect_uri=redirect_HERE&response_type=代码

即浏览器成功重定向(包括"代码"GET数据(到http://REDIRECT_HERE/?code=XXXXXXXXXXXX

我基本上想把auth代码存储在一个变量中以备将来使用,而不是使用通过浏览器重定向手动获取代码的方式。

您的浏览器使用GET请求以url RFC-1738样式发送数据,而php curl代码使用multipart/form-data编码的POST请求发送数据,难怪服务器会感到困惑。要像浏览器一样使用php在url中发送数据,请去掉curl_setopt($ch, CURLOPT_POST, true);(因为它告诉curl做POST请求,而不是默认的get请求,所以浏览器会做get请求(和curl_setopt($ch, CURLOPT_POSTFIELDS, $data);(因为它告诉curl在请求体中发送,而浏览器在url中进行发送(,并将CURLOPT_url更改为

curl_setopt($ch, CURLOPT_URL, $uri."?".http_build_query($data));

那么您的php-ccurl请求应该与您的浏览器请求大致匹配,并得到相同的响应。(仍然会有一些细微的差异,比如不同的User Agent标头、Accept标头和Accept Encoding标头,但这通常无关紧要(

最新更新