Spotify API — ошибка при получении токена доступа в процессе авторизации

Я создаю свое первое приложение Spotify и сейчас занимаюсь процессом авторизации.

До сих пор я успешно извлекал свой штат и код из https://accounts.spotify.com/authorize

и теперь я отправляю POST-запрос через PHP CURL-запрос для получения моего токена доступа.

Инструкция Spotify для этого шага

Я продолжаю получать следующий ответ об ошибке JSON, указывающий, что мой grant_type недействителен, и он предлагает мне три допустимых варианта:

{«error»: «unsupported_grant_type», «error_description»: «grant_type должен быть client_credentials, authorization_code или refresh_token»} bool (true)

Если вы посмотрите на мой код ниже, я полагаю, что я установил правильный grant_type для «authorization_code», но я получаю ошибку. Я выделил «******» фрагмент кода, который я считаю верной строкой кода.

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

    //  Get access tokens
$ch = curl_init();
// Specify the HTTP headers to send.
//Authorization: Basic <base64 encoded client_id:client_secret>
$ClientIDSpotify = "[my spotify app id]";
$ClientSecretSpotify = "[my secret code]";
$authorization = base64_encode ( "{$ClientIDSpotify}:{$ClientSecretSpotify}" );
$http_headers = array(
"Authorization: Basic {$authorization}");
curl_setopt( $ch, CURLOPT_HTTPHEADER, $http_headers );
curl_setopt( $ch, CURLOPT_POST, true);

$spotify_url = "https://accounts.spotify.com/api/token";
curl_setopt( $ch, CURLOPT_URL, $spotify_url );// *************************************************
// HERE'S WHERE I CORRECTLY SPECIFY THE GRANT TYPE
// *************************************************
$data['grant_type'] = "authorization_code";
$data['code'] = $authorizationCode;
$callbackURL = "[my callback URL]";
$data['redirect_uri'] = $callbackURL;

curl_setopt($ch, CURLOPT_SAFE_UPLOAD, false);
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data));
$response_json = curl_exec( $ch );
curl_close( $ch );
}

1

Решение

Так же, как примечание к последнему комментарию о переходе на http_build_query, Мне пришлось URLDECODE данные, чтобы Spotify мог их распознать. Попробуйте использовать эту строку вместо.

curl_setopt($ch, CURLOPT_POSTFIELDS, urldecode(http_build_query($data)));
1

Другие решения

Мне кажется, что тело POST не отформатировано правильно, все остальное выглядит хорошо.

Мое ограниченное понимание PHP говорит мне, что ваше тело POST выглядит


{
"fields" : {
"code" : $authorizationCode,
"grant_type" : "authorization_code",
"redirect_uri" : "http://www.example.com/spotify/callback/index.php"}
}

Конечно, то, что вы хотели бы отправить, это просто


{
"code" : $authorizationCode,
"grant_type" : "authorization_code",
"redirect_uri" : "http://www.example.com/spotify/callback/index.php"}

Поэтому попробуйте установить $data объект с


$data['grant_type'] = "authorization_code";
$data['code'] = $authorizationCode;
$data['redirect_uri'] = $callbackURL;

или даже короче


$data = array("grant_type" => "authorization_code", "code" => $authorizationCode, "redirect_uri" => $callbackURL);

Надеюсь, это помогло!

0

Хорошо, я немного покопался и нашел код в разделе комментариев к PHP CURL. Проблема с документацией Spotify заключается в том, что она не определяет формат отправляемых данных POST. Я предполагал, что с тех пор, как Spotify отправлял мне данные JSON, я должен также отправлять свои данные в формате JSON. Поэтому я форматировал данные POST как таковой:

        curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data));

Прочитав некоторую документацию, я решил попробовать это:

        curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($data));

Я получил именно те результаты, которые мне были нужны:

        {"access_token":"[long access token]","token_type":"Bearer","expires_in":3600,"refresh_token":"[long refresh token]"}

Спасибо, Майкл, за попытку помочь!

-1
По вопросам рекламы [email protected]