Php 另一个twitter oAuth cURL访问令牌请求失败

Php 另一个twitter oAuth cURL访问令牌请求失败,php,curl,twitter,Php,Curl,Twitter,以下函数给出验证错误,而不是令牌: 无法验证oAuth签名和令牌 功能请求\u令牌() { //设置url $url=$this->site.$this->request\u token\u path;//http://api.twitter.com/oauth/request_token //要传递到twitter并创建签名的参数 $params['oauth\u consumer\u key']=$this->consumerKey; $params['oauth_token']=''; $

以下函数给出验证错误,而不是令牌:

无法验证oAuth签名和令牌

功能请求\u令牌()
{
//设置url
$url=$this->site.$this->request\u token\u path;//http://api.twitter.com/oauth/request_token
//要传递到twitter并创建签名的参数
$params['oauth\u consumer\u key']=$this->consumerKey;
$params['oauth_token']='';
$params['oauth_nonce']=SHA1(time());
$params['oauth_timestamp']=time();
$params['oauth\u signature\u method']=$this->signatureMethod;//HMAC-SHA1;
$params['oauth_version']=$this->version;//1.0
ksort($params);
//打印“”;打印($params);打印“”;
//创建签名
$concatatedParams='';
foreach($k=>v的参数){
$concatenatedParams.=“{$k}={$v}&”;
}
$concatatedParams=substr($concatatedParams,0,-1);
$signatureBaseString=“POST&.”.urlencode($url)。“&”.urlencode($concatatedParams);
$params['oauth_signature']=base64_编码(hash_hmac('SHA1',$signatureBaseString,$this->secret.&',TRUE));
//卷曲
$ch=curl_init();
curl_setopt($ch,CURLOPT_URL,$URL);
curl_setopt($ch,CURLINFO_HEADER_OUT,0);
curl_setopt($ch,CURLOPT_HTTPHEADER,数组('Expect:');
curl_setopt($ch,CURLOPT_头,1);
卷曲设置($ch,卷曲设置桩,1);
curl_setopt($ch,CURLOPT_POSTFIELDS,$params);
curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);
curl_setopt($ch,CURLOPT_FOLLOWLOCATION,1);
$exec=curl\u exec($ch);
$info=curl\u getinfo($ch);
卷曲关闭($ch);
打印$exec;
//打印“”;打印($info);打印“”;
}

我承认这不是一个真正的答案,但如果可以,请使用PECL OAuth包。这让我想起了同一个问题。

下面是我到目前为止总结的内容,它是有效的:-)


我不确定你是否还在研究这个问题,或者它是否适合你,但我有一个类似的设置,也有同样的问题。我最终发现我是一到很多次的。 请尝试注释此部分:


我也遇到了同样的问题,我缺少的是将头传递给curl请求。如本问题所示,我还发送了$header=array('Expect:'),这就是我的问题所在。我开始发送签名头和其他数据如下,它解决了我的情况


只是一个提醒。Twitter与oAuth之间存在问题。这可能不是你的问题。谢谢-我不认为这是…好!它是有效的,在getRequestToken方法的末尾有一个“print”而不是“return”。我正试图用C#(不懂PHP)来实现这一点,所以我有点困惑。var$secret是来自twitter的消费者密钥吗?我有点晚了,但是如果(is#array($input)){return array#map(array)){code>if(is#array($input))有什么意义呢('Twitauth','uUrlEncode_rfc3986'),$input);除非您按照Holy Moly的其他说明操作,否则这不起作用!谢谢!我一直在寻找一个不用cURL就可以使用的函数,我只是删除了
\uHTTP
函数中的所有内容,并将其替换为
$response=file\u get\u contents($url)
让我惊讶的是,它居然奏效了!!应该修改他的帖子,谢谢你对他的答案的洞察!
 function request_token()
 {
  // Set url
  $url = $this->site.$this->request_token_path; // http://api.twitter.com/oauth/request_token

  // Params to pass to twitter and create signature
     $params['oauth_consumer_key'] = $this->consumerKey;
     $params['oauth_token'] = '';
     $params['oauth_nonce'] = SHA1(time());
     $params['oauth_timestamp'] = time();
     $params['oauth_signature_method'] = $this->signatureMethod; // HMAC-SHA1;
     $params['oauth_version'] = $this->version; // 1.0
     ksort($params);

     //print "<pre>"; print_r($params); print "</pre>";

     // Create Signature
     $concatenatedParams = '';
     foreach($params as $k => $v){
      $concatenatedParams .= "{$k}={$v}&"; 
     }
     $concatenatedParams = substr($concatenatedParams,0,-1);

     $signatureBaseString = "POST&".urlencode($url)."&".urlencode($concatenatedParams);
     $params['oauth_signature'] = base64_encode(hash_hmac('SHA1', $signatureBaseString, $this->secret."&", TRUE));

  // Do cURL
  $ch = curl_init();
   curl_setopt($ch, CURLOPT_URL, $url);
   curl_setopt($ch, CURLINFO_HEADER_OUT, 0);
   curl_setopt($ch, CURLOPT_HTTPHEADER, array('Expect:'));
   curl_setopt($ch, CURLOPT_HEADER, 1);
   curl_setopt($ch, CURLOPT_POST, 1);
   curl_setopt($ch, CURLOPT_POSTFIELDS, $params);
   curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);
   curl_setopt($ch, CURLOPT_FOLLOWLOCATION,1);
   $exec = curl_exec ($ch);
   $info = curl_getinfo($ch);
  curl_close ($ch);

     print $exec;

    //print "<pre>"; print_r($info); print "</pre>";
 }
    class Twitauth
    {
      var $key = '';
      var $secret = '';

      var $request_token = "https://twitter.com/oauth/request_token";

    function Twitauth($config)
    {
        $this->key = $config['key']; // consumer key from twitter
        $this->secret = $config['secret']; // secret from twitter
    }

    function getRequestToken()
    {
        // Default params
        $params = array(
            "oauth_version" => "1.0",
            "oauth_nonce" => time(),
            "oauth_timestamp" => time(),
            "oauth_consumer_key" => $this->key,
            "oauth_signature_method" => "HMAC-SHA1"
         );

         // BUILD SIGNATURE
            // encode params keys, values, join and then sort.
            $keys = $this->_urlencode_rfc3986(array_keys($params));
            $values = $this->_urlencode_rfc3986(array_values($params));
            $params = array_combine($keys, $values);
            uksort($params, 'strcmp');

            // convert params to string 
            foreach ($params as $k => $v) {$pairs[] = $this->_urlencode_rfc3986($k).'='.$this->_urlencode_rfc3986($v);}
            $concatenatedParams = implode('&', $pairs);

            // form base string (first key)
            $baseString= "GET&".$this->_urlencode_rfc3986($this->request_token)."&".$this->_urlencode_rfc3986($concatenatedParams);
            // form secret (second key)
            $secret = $this->_urlencode_rfc3986($this->secret)."&";
            // make signature and append to params
            $params['oauth_signature'] = $this->_urlencode_rfc3986(base64_encode(hash_hmac('sha1', $baseString, $secret, TRUE)));

         // BUILD URL
            // Resort
            uksort($params, 'strcmp');
            // convert params to string 
            foreach ($params as $k => $v) {$urlPairs[] = $k."=".$v;}
            $concatenatedUrlParams = implode('&', $urlPairs);
            // form url
            $url = $this->request_token."?".$concatenatedUrlParams;

         // Send to cURL
         print $this->_http($url);          
    }

    function _http($url, $post_data = null)
    {       
        $ch = curl_init();

        curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 30);
        curl_setopt($ch, CURLOPT_TIMEOUT, 30);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);

        if(isset($post_data))
        {
            curl_setopt($ch, CURLOPT_POST, 1);
            curl_setopt($ch, CURLOPT_POSTFIELDS, $post_data);
        }

        $response = curl_exec($ch);
        $this->http_status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
        $this->last_api_call = $url;
        curl_close($ch);

        return $response;
    }

    function _urlencode_rfc3986($input)
    {
        if (is_array($input)) {
            return array_map(array('Twitauth', '_urlencode_rfc3986'), $input);
        }
        else if (is_scalar($input)) {
            return str_replace('+',' ',str_replace('%7E', '~', rawurlencode($input)));
        }
        else{
            return '';
        }
    }
}
 $keys = $this->_urlencode_rfc3986(array_keys($params));
        $values = $this->_urlencode_rfc3986(array_values($params));
        $params = array_combine($keys, $values);
$header = calculateHeader($parameters, 'https://api.twitter.com/oauth/request_token');

function calculateHeader(array $parameters, $url)
    {
        // redefine
        $url = (string) $url;

        // divide into parts
        $parts = parse_url($url);

        // init var
        $chunks = array();

        // process queries
        foreach($parameters as $key => $value) $chunks[] = str_replace('%25', '%', urlencode_rfc3986($key) . '="' . urlencode_rfc3986($value) . '"');

        // build return
        $return = 'Authorization: OAuth realm="' . $parts['scheme'] . '://' . $parts['host'] . $parts['path'] . '", ';
        $return .= implode(',', $chunks);

        // prepend name and OAuth part
        return $return;
    }

function urlencode_rfc3986($value)
    {
        if(is_array($value)) return array_map('urlencode_rfc3986', $value);
        else
        {
            $search = array('+', ' ', '%7E', '%');
            $replace = array('%20', '%20', '~', '%25');

            return str_replace($search, $replace, urlencode($value));
        }
    }