2016-04-04 40 views
1

İlk Spotify uygulaımı yapıyorum ve şu anda yetkilendirme süreciyle uğraşıyorum.Spotify API - yetkilendirme işlemi sırasında erişim belirteci alınırken hata oluştu

Şimdiye kadar https://accounts.spotify.com/authorize

benim Devleti ve kod almak ve şimdi benim erişim belirteci elde etmek PHP CURL istek üzerinden bir POST isteği yolluyorum başarılı olmuştur.

Spotify's instructions for this step

benim grant_type geçerli olmadığını belirten aşağıdaki JSON hata yanıtını almaya devam ve üç geçerli seçenekler beni sunmaktadır:

{ "hata": "unsupported_grant_type", "ERROR_DESCRIPTION":" grant_type client_credentials, authorization_code veya refresh_token olmalıdır "} bool (true)

Aşağıdaki koduma bakarsanız," authorization_code "ifadesinin doğru grant_type değerini ayarladığımı, ancak hatayı alıyorum. Doğru kod satırı olduğuna inandığım şeyin kod snippet'ini '******' ile vurguladım.

Yanlış yaptığım şeyi herkes görebilir mi? İşte isteği göndermek için kullanıyorum kodu:

// 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); 
    } 

cevap

0

POST gövdesi doğru biçimlendirilmemiş gibi görünüyor, her şey iyi görünüyor.

PHP Benim sınırlı anlayış sizin POST vücut Elbette

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

benziyor söylüyor, ne göndermek istediğiniz nedenle sadece

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

olduğunu denemek $data nesnesini

$data['grant_type'] = "authorization_code"; $data['code'] = $authorizationCode; $data['redirect_uri'] = $callbackURL; ile ayarlamak için

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

Umut

ya da kısa bu yardım!

+0

Teşekkürler, Michael, bunun bir şeyleri değiştirip değiştirmediğini göreceğim. – Tobraham

+0

Hayır, aynı hata. – Tobraham

+0

Soruya json_encode ($ data) çıktısını ekleyebilir misiniz? –

-1

Tamam, bu yüzden biraz kazma kazdım ve PHP CURL manuel yorumlar bölümünde bir kod buldum. Spotify'ın belgelerine ilişkin sorun, gönderilecek POST verisinin biçimini belirtmiyor. Spotify'ın, JSON formatındaki verileri de JSON formatında göndermem gerektiğini düşündüğümden beri vardım. Bu yüzden gibi POST verilerini biçimlendirme edildi: Bunun yerine bu denemeye karar verdi

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

bazı belgelere okuduktan sonra:

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

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

Ben tam ihtiyacım sonuçlar elde ettim

Yardımcı olmaya çalıştığınız için teşekkürler Michael!

1

Spotify'ın tanınması için, http_build_query'a geçme hakkındaki son yoruma bir not olarak, URLDECODE verilerini vermem gerekiyordu. Bunun yerine bu satırı kullanmayı deneyin.

curl_setopt($ch, CURLOPT_POSTFIELDS, urldecode(http_build_query($data))); 
İlgili konular