我正在构建我的第一个Spotify应用程序,现在我正在处理授权过程。
到目前为止,我已成功从https://accounts.spotify.com/authorize
检索我的州和代码现在我通过PHP CURL请求发送POST请求以获取我的访问令牌。
Spotify's instructions for this step
我一直收到以下JSON错误响应,表明我的grant_type无效,它为我提供了三个有效选项:
{“error”:“unsupported_grant_type”,“error_description”:“grant_type必须是client_credentials,authorization_code或refresh_token”} bool(true)
如果您查看下面的代码,我相信我已经设置了“authorization_code”的正确grant_type但是我收到了错误。我用'******'突出显示了我认为正确的代码行的代码片段。
任何人都可以看到我做错了什么吗?这是我用来发送请求的代码:
// 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 );
}
答案 0 :(得分:1)
正如关于切换到http_build_query
的最后评论的注释,我必须URLDECODE
数据,以便Spotify识别它。请尝试使用此行。
curl_setopt($ch, CURLOPT_POSTFIELDS, urldecode(http_build_query($data)));
答案 1 :(得分:0)
在我看来,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);
希望这有帮助!
答案 2 :(得分:-1)
好的,所以我挖了一点,在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]"}
谢谢Michael,他试图提供帮助!