Я создаю свое первое приложение 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 );
}
Так же, как примечание к последнему комментарию о переходе на http_build_query
, Мне пришлось URLDECODE
данные, чтобы Spotify мог их распознать. Попробуйте использовать эту строку вместо.
curl_setopt($ch, CURLOPT_POSTFIELDS, urldecode(http_build_query($data)));
Мне кажется, что тело 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);
Надеюсь, это помогло!
Хорошо, я немного покопался и нашел код в разделе комментариев к 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]"}
Спасибо, Майкл, за попытку помочь!