Кодирование URL с помощью Curl PHP

Я внес предложенное изменение, но все еще получаю аналогичную ошибку:

{"error": "invalid_request", "error_description": "недопустимый тип предоставления"}

Эта ошибка может произойти, если кодировка URL-адреса установлена ​​неправильно. Обновленный код ниже Любая помощь будет принята с благодарностью!

<?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;
}
?>
array("application/x-www-form-urlencoded") может понадобиться array("Content-Type: application/x-www-form-urlencoded")? В любом случае, я подумал, что curl должен автоматически обрабатывать этот заголовок.
Scuzzy 23.04.2018 03:58

Возможный дубликат размещение curl с заголовком application / x-www-form-urlencoded

Scuzzy 23.04.2018 03:59

Спасибо, но необходимы другие изменения. Я внес предложенное изменение в массив («Content-Type: application / x-www-form-urlencoded»). Теперь я получаю сообщение об ошибке {"error": "invalid_request", "error_description": "invalid grant type"} эта ошибка может произойти, если urlencode установлен неправильно. Любые предложения по выполнению этой работы приветствуются.

Rick 23.04.2018 05:17
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
1
3
3 120
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

ваш код отправляет данные в формате 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 добавит этот заголовок за вас, поэтому не добавляйте эти 2 конкретных заголовка вручную.

если вы хотите использовать формат 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
)));

(а также избавьтесь от заголовка типа содержимого, он будет добавлен автоматически.)

Другие вопросы по теме