Неверный/неподдерживаемый тип гранта PHP cURL

Я пытаюсь использовать php и cURL для запросов к API Fitbit oauth 2.0. Я могу получить свой код авторизации, но не могу обменять код на токен. Документы API Fitbit говорят (https://dev.fitbit.com/docs/oauth2/#access-token-request), который мне нужен для публикации кода, идентификатора клиента, перенаправления uri и типа предоставления, установленного на «authorization_code».

Однако я продолжаю получать сообщение об ошибке, когда печатаю ответ.

"errorType":"unsupported_grant_type","message":"Тип предоставления авторизации не поддерживается. Посетите https://dev.fitbit.com/docs/oauth2 для получения дополнительной информации о процессе авторизации Fitbit Web API."}],"success":false}

На всю жизнь я не могу понять, что я делаю неправильно с приведенным ниже кодом. Какие-либо предложения?

$code = $_GET['code'];
$url = 'https://api.fitbit.com/oauth2/token';

$curl = curl_init($url);
curl_setopt($curl, CURLOPT_POST, true);
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($curl, CURLOPT_HEADER, false);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_POSTFIELDS, array(
 'code=' . $code . '&' .
 'client_id=' . $oauth2_client_id . '&' .
 'redirect_uri=' . $oauth2_redirect . '&' .
 'grant_type=authorization_code'
                                            )
  );

curl_setopt($curl, CURLOPT_HTTPHEADER, array(
    'Authorization: Basic '. base64_encode($oauth2_client_id.':'.$oauth2_secret),
    'Content-Type: application/x-www-form-urlencoded'
));
$response = curl_exec($curl);
print_r($response);

person Robert Tedge    schedule 28.05.2016    source источник


Ответы (1)


Вы объединяете аргументы POST в одну строку, а затем включаете ее в массив, но они должны быть представлены по отдельности; это можно сделать следующим образом:

curl_setopt($curl, CURLOPT_POSTFIELDS, http_build_query(array(
 'code' => $code,
 'client_id' => $oauth2_client_id,
 'redirect_uri' => $oauth2_redirect,
 'grant_type' => 'authorization_code'
)));

См.: формат curl POST для CURLOPT_POSTFIELDS

person Hans Z.    schedule 28.05.2016
comment
Да спасибо! По какой-то причине даже при помещении их в правильный массив, как вы указали, это не сработало. Однако использование одной строки, а не массива, сработало отлично! - person Robert Tedge; 29.05.2016