2011-04-03 58 views
5

我试图根据Soundcloud登录授权我的网站上的用户。Soundcloud(Oauth2)API获取访问令牌失败

它使用Oauth身份验证。

用户必须点击我的网站按钮,会被重定向到的SoundCloud网站,它在日志中。

在此之后,用户重定向回我的网站,我必须得到的accessToken。

这种失败消息:请求的URL与HTTP响应代码0

我甩了卷曲的东西,如果你需要它:

[data]; False 
[info][url]     : https://api.soundcloud.com/oauth2/token 
     [content_type]   ; NULL 
     [http_code]    : 0 
     [header_size]   : 0 
     [request_size]   : 0 
     [filetime]    : -1 
     [ssl_verify_result]  : 0 
     [redirect_count]   : 0 
     [total_time]    : 0.031 
     [namelookup_time]  : 0 
     [connect_time]   : 0.031 
     [pretransfer_time]  : 0 
     [size_upload]   : 0 
     [size_download]   : 0 
     [speed_download]   : 0 
     [speed_upload]   : 0 
     [download_content_length]: -1 
     [upload_content_length] : -1 
     [starttransfer_time]  : 0 
     [redirect_time]   : 0 
     [certinfo]    [] 

的代码我执行:

$soundcloud = new SoundcloudModel('*****', '*****', '*****'); 

    try { 
     $accessToken = $soundcloud->accessToken($this->request['code']); 
    } catch (Services_Soundcloud_Invalid_Http_Response_Code_Exception $e) { 
     exit($e->getMessage()); 
    } 

Soundcloud API代码:

protected function _getAccessToken($postData, $curlOptions = array()) 
{ 
    $options = array(CURLOPT_POST => true, CURLOPT_POSTFIELDS => $postData); 
    $options += $curlOptions; 
    $response = json_decode(
     $this->_request($this->getAccessTokenUrl(), $options), 
     true 
    ); 

    if (array_key_exists('access_token', $response)) { 
     $this->_accessToken = $response['access_token']; 

     return $response; 
    } else { 
     return false; 
    } 
} 

protected function _request($url, $curlOptions = array()) 
{ 
    $ch = curl_init($url); 
    $options = $this->_curlOptions; 
    $options += $curlOptions; 

    if (array_key_exists(self::CURLOPT_OAUTH_TOKEN, $options)) { 
     $includeAccessToken = $options[self::CURLOPT_OAUTH_TOKEN]; 
     unset($options[self::CURLOPT_OAUTH_TOKEN]); 
    } else { 
     $includeAccessToken = true; 
    } 

    if (array_key_exists(CURLOPT_HTTPHEADER, $options)) { 
     $options[CURLOPT_HTTPHEADER] = array_merge(
      $this->_buildDefaultHeaders(), 
      $curlOptions[CURLOPT_HTTPHEADER] 
     ); 
    } else { 
     $options[CURLOPT_HTTPHEADER] = $this->_buildDefaultHeaders(
      $includeAccessToken 
     ); 
    } 

    curl_setopt_array($ch, $options); 

    $data = curl_exec($ch); 
    $info = curl_getinfo($ch); 

    print_r(array('ch'=>$ch, 'data'=>$data, 'info'=>$info)); 

    curl_close($ch); 

    $this->_lastHttpResponseHeaders = $this->_parseHttpHeaders(
     substr($data, 0, $info['header_size']) 
    ); 
    $this->_lastHttpResponseBody = substr($data, $info['header_size']); 
    $this->_lastHttpResponseCode = $info['http_code']; 

    if ($this->_validResponseCode($this->_lastHttpResponseCode)) { 
     return $this->_lastHttpResponseBody; 
    } else { 
     throw new Services_Soundcloud_Invalid_Http_Response_Code_Exception(
      null, 
      0, 
      $this->_lastHttpResponseBody, 
      $this->_lastHttpResponseCode 
     ); 
    } 
} 

对不起,对于这篇较长的文章,希望你们能帮助我!

回答

3

明白了。

我发现PHP使用的cURL使用过时的证书包(至少在Windows上)。

我从下载了最新的证书包:http://curl.haxx.se/docs/caextract.html 并添加以下卷曲选项:

curl_setopt($ch, CURLOPT_CAINFO, 'C:/absolute/path/to/cacert.pem');