在PHP(雅虎OAuth)获得雅虎联系人

时间:2012-07-19 16:59:33

标签: contacts yahoo

我正在为网站开发一个invite_friends工具。我阅读了这些文章并采取了以下步骤:

但当我执行时,雅虎最后说:

{   "error": {     "lang": "en-US",     "description": "Please provide valid credentials. OAuth oauth_problem=\"token_rejected\", realm=\"yahooapis.com\""   } } 

:((

这些是我的代码:

getreqtok.php

<?php
require 'modules/invite/yahoo/globals.php';
require 'modules/invite/yahoo/oauth_helper.php';

// Callback can either be 'oob' or a url whose domain must match
// the domain that you entered when registering your application

$callback='http://www.warzone.in/modules.php?name=invite&op=yahoo_get_contacts';

// Get the request token using HTTP GET and HMAC-SHA1 signature
$retarr = get_request_token(OAUTH_CONSUMER_KEY, OAUTH_CONSUMER_SECRET,
                            $callback, false, true, true);


//echo $retarr[3]["oauth_token_secret"]."<br>
//<br>
//";

session_start();                    
$_SESSION["oauth_token_secret"] = $retarr[3]["oauth_token_secret"];

//echo $_SESSION["oauth_token_secret"]."<br>
//<br>
//<br>
//";

if (! empty($retarr)){
  list($info, $headers, $body, $body_parsed) = $retarr;
  if ($info['http_code'] == 200 && !empty($body)) {
      //print "Have the user go to xoauth_request_auth_url to authorize your app\n";
          ?>
<a href="<?php echo rfc3986_decode($body_parsed['xoauth_request_auth_url'])?>">YAHOO</a>
<?php
  }
}




/**
 * Get a request token.
 * @param string $consumer_key obtained when you registered your app
 * @param string $consumer_secret obtained when you registered your app
 * @param string $callback callback url can be the string 'oob'
 * @param bool $usePost use HTTP POST instead of GET
 * @param bool $useHmacSha1Sig use HMAC-SHA1 signature
 * @param bool $passOAuthInHeader pass OAuth credentials in HTTP header
 * @return array of response parameters or empty array on error
 */
function get_request_token($consumer_key, $consumer_secret, $callback, $usePost=false, $useHmacSha1Sig=true, $passOAuthInHeader=false)
{
  $retarr = array();  // return value
  $response = array();

  $url = 'https://api.login.yahoo.com/oauth/v2/get_request_token';
  $params['oauth_version'] = '1.0';
  $params['oauth_nonce'] = mt_rand();
  $params['oauth_timestamp'] = time();
  $params['oauth_consumer_key'] = $consumer_key;
  $params['oauth_callback'] = $callback;

  // compute signature and add it to the params list
  if ($useHmacSha1Sig) {
    $params['oauth_signature_method'] = 'HMAC-SHA1';
    $params['oauth_signature'] =
      oauth_compute_hmac_sig($usePost? 'POST' : 'GET', $url, $params,
                             $consumer_secret, null);
  } else {
    $params['oauth_signature_method'] = 'PLAINTEXT';
    $params['oauth_signature'] =
      oauth_compute_plaintext_sig($consumer_secret, null);
  }

  // Pass OAuth credentials in a separate header or in the query string
  if ($passOAuthInHeader) {

    $query_parameter_string = oauth_http_build_query($params, FALSE);

    $header = build_oauth_header($params, "yahooapis.com");
    $headers[] = $header;
  } else {
    $query_parameter_string = oauth_http_build_query($params);
  }

  // POST or GET the request
  if ($usePost) {
    $request_url = $url;
    logit("getreqtok:INFO:request_url:$request_url");
    logit("getreqtok:INFO:post_body:$query_parameter_string");
    $headers[] = 'Content-Type: application/x-www-form-urlencoded';
    $response = do_post($request_url, $query_parameter_string, 443, $headers);
  } else {
    $request_url = $url . ($query_parameter_string ?
                           ('?' . $query_parameter_string) : '' );

    logit("getreqtok:INFO:request_url:$request_url");

    $response = do_get($request_url, 443, $headers);

  }

  // extract successful response
  if (! empty($response)) {
    list($info, $header, $body) = $response;
    $body_parsed = oauth_parse_str($body);
    if (! empty($body_parsed)) {
      logit("getreqtok:INFO:response_body_parsed:");
      //print_r($body_parsed);
    }
    $retarr = $response;
    $retarr[] = $body_parsed;
  }

  return $retarr;
}
?>

getacctok.php

<?php
session_start();
require 'modules/invite/yahoo/globals.php';
require 'modules/invite/yahoo/oauth_helper.php';



// Fill in the next 3 variables.
$request_token=$_REQUEST["oauth_token"];
$request_token_secret=$_SESSION["oauth_token_secret"];
$oauth_verifier= $_REQUEST["oauth_verifier"];



//echo $request_token."  xxxx ".$request_token_secret." yyyy  ".$oauth_verifier."<br>
//<br>
//<br>
//";



// Get the access token using HTTP GET and HMAC-SHA1 signature
$retarr = get_access_token(OAUTH_CONSUMER_KEY, OAUTH_CONSUMER_SECRET,
                           $request_token, $request_token_secret,
                           $oauth_verifier, false, true, true);
if (! empty($retarr)) {
  list($info, $headers, $body, $body_parsed) = $retarr;
  if ($info['http_code'] == 200 && !empty($body)) {
    //  print "Use oauth_token as the token for all of your API calls:\n" .
          rfc3986_decode($body_parsed['oauth_token']);
  }
}


















/**
 * Get an access token using a request token and OAuth Verifier.
 * @param string $consumer_key obtained when you registered your app
 * @param string $consumer_secret obtained when you registered your app
 * @param string $request_token obtained from getreqtok
 * @param string $request_token_secret obtained from getreqtok
 * @param string $oauth_verifier obtained from step 3
 * @param bool $usePost use HTTP POST instead of GET
 * @param bool $useHmacSha1Sig use HMAC-SHA1 signature
 * @param bool $passOAuthInHeader pass OAuth credentials in HTTP header
 * @return array of response parameters or empty array on error
 */
function get_access_token($consumer_key, $consumer_secret, $request_token, $request_token_secret, $oauth_verifier, $usePost=false, $useHmacSha1Sig=true, $passOAuthInHeader=true)
{
  $retarr = array();  // return value
  $response = array();



  $url = 'https://api.login.yahoo.com/oauth/v2/get_token';
  $params['oauth_version'] = '1.0';
  $params['oauth_nonce'] = mt_rand();
  $params['oauth_timestamp'] = time();
  $params['oauth_consumer_key'] = $consumer_key;
  $params['oauth_token']= $request_token;
  $params['oauth_verifier'] = $oauth_verifier;



  // compute signature and add it to the params list
  if ($useHmacSha1Sig) {
    $params['oauth_signature_method'] = 'HMAC-SHA1';
    $params['oauth_signature'] =
      oauth_compute_hmac_sig($usePost? 'POST' : 'GET', $url, $params,
                             $consumer_secret, $request_token_secret);
  } else {
    $params['oauth_signature_method'] = 'PLAINTEXT';
    $params['oauth_signature'] =
      oauth_compute_plaintext_sig($consumer_secret, $request_token_secret);
  }



  // Pass OAuth credentials in a separate header or in the query string
  if ($passOAuthInHeader) {
    $query_parameter_string = oauth_http_build_query($params, false);
    $header = build_oauth_header($params, "yahooapis.com");
    $headers[] = $header;
  } else {
    $query_parameter_string = oauth_http_build_query($params);
  }



  // POST or GET the request
  if ($usePost) {
    $request_url = $url;
    logit("getacctok:INFO:request_url:$request_url");
    logit("getacctok:INFO:post_body:$query_parameter_string");
    $headers[] = 'Content-Type: application/x-www-form-urlencoded';
    $response = do_post($request_url, $query_parameter_string, 443, $headers);
  } else {
    $request_url = $url . ($query_parameter_string ?
                           ('?' . $query_parameter_string) : '' );
    logit("getacctok:INFO:request_url:$request_url");
    $response = do_get($request_url, 443, $headers);
  }



  // extract successful response
  if (! empty($response)) {
    list($info, $header, $body) = $response;
    $body_parsed = oauth_parse_str($body);
    if (! empty($body_parsed)) {
      logit("getacctok:INFO:response_body_parsed:");
      //print_r($body_parsed);
    }
    $retarr = $response;
    $retarr[] = $body_parsed;
  }



  return $retarr;
}












$guid = $retarr[3]["xoauth_yahoo_guid"];
$access_token = $retarr[3]["oauth_token"];
$access_token_secret = $retarr[3]["oauth_token_secret"];









// Call Contact API
$retarr = callcontact(OAUTH_CONSUMER_KEY, OAUTH_CONSUMER_SECRET,
                      $guid, $access_token, $access_token_secret,
                      false, true);









function callcontact($consumer_key, $consumer_secret, $guid, $access_token, $access_token_secret, $usePost=false, $passOAuthInHeader=true)
{
  $retarr = array();  // return value
  $response = array();



  $url = 'http://social.yahooapis.com/v1/user/' . $guid . '/contacts;count=5';
  $params['format'] = 'json';
  $params['view'] = 'compact';
  $params['oauth_version'] = '1.0';
  $params['oauth_nonce'] = mt_rand();
  $params['oauth_timestamp'] = time();
  $params['oauth_consumer_key'] = $consumer_key;
  $params['oauth_token'] = $access_token;



  // compute hmac-sha1 signature and add it to the params list
  $params['oauth_signature_method'] = 'HMAC-SHA1';
  $params['oauth_signature'] =
      oauth_compute_hmac_sig($usePost? 'POST' : 'GET', $url, $params,
                             $consumer_secret, $access_token_secret);



  // Pass OAuth credentials in a separate header or in the query string
  if ($passOAuthInHeader) {
    $query_parameter_string = oauth_http_build_query($params, true);
    $header = build_oauth_header($params, "yahooapis.com");
    $headers[] = $header;
  } else {
    $query_parameter_string = oauth_http_build_query($params);
  }



  // POST or GET the request
  if ($usePost) {
    $request_url = $url;
    logit("callcontact:INFO:request_url:$request_url");
    logit("callcontact:INFO:post_body:$query_parameter_string");
    $headers[] = 'Content-Type: application/x-www-form-urlencoded';
    $response = do_post($request_url, $query_parameter_string, 80, $headers);
  } else {
    $request_url = $url . ($query_parameter_string ?
                           ('?' . $query_parameter_string) : '' );
    logit("callcontact:INFO:request_url:$request_url");
    $response = do_get($request_url, 80, $headers);
  }



  // extract successful response
  if (! empty($response)) {
    list($info, $header, $body) = $response;
    if ($body) {
      logit("callcontact:INFO:response:");
      print(json_pretty_print($body));
    }
    $retarr = $response;
  }



  return $retarr;
}


















?>

1 个答案:

答案 0 :(得分:0)

    class YahooContacts
    {
        protected static $oauthConsumerKey ="";
        protected static $OauthConsumerSecret ="";
        protected static $oauthDomain="";

        public function __construct(){
            //Check Session is Start Or not 
            if (session_status() == PHP_SESSION_NONE) {
                        session_start();
            }

        }

       /**
         * Authentication user And Access Refresh and access token
         *
         * @author <Pawan Kumar>
         * @return type boolean
         **/
       protected function getAuthorization($code)
       {
            $url = "https://api.login.yahoo.com/oauth2/get_token";

            $data="grant_type=authorization_code&redirect_uri=".self::$oauthDomain."&code=".$code;
            $auth =  base64_encode(self::$oauthConsumerKey.":".self::$OauthConsumerSecret);  

            $headers = array(
                 'Authorization: Basic '.$auth,
                 'Content-Type: application/x-www-form-urlencoded'
            );

            try{
                $resultSet =self::makeRequest($url,$data,$headers);
                if($resultSet->access_token){
                    $this->setAccessToken($resultSet->access_token);
                    $this->setRefreshToken($resultSet->refresh_token);
                    $this->setGuidToken($resultSet->xoauth_yahoo_guid);
                    return true;
                }
            }catch(Exception $ex){
                throw($ex);
            }

       }
        /**
         * Get All Contacts list From Yahoo API using Auth Access Token And oAuth Guid Token
         *
         * @author <Pawan Kumar>
         * @return type Object
         **/
        public function getUserContactsDetails()
        {
            /** Refresh Access Token is Expired **/
            $this->generateAccessToken();

            $guid  =$this->getGuidToken(); 
            $token =$this->getAccessToken();

            $contactUrl="https://social.yahooapis.com/v1/user/$guid/contacts?format=json";

            $opts = array(
                      'http'=>array(
                        'method'=>"GET",
                        'header'=>"Authorization: Bearer $token" 
                      )
                    );

            $context = stream_context_create($opts);
            $file = file_get_contents($contactUrl, false, $context);

            $output =json_decode($file);
            return $output;
        }

        /**
         * Get New Access Token using Refresh Token
         *
         * @author <Pawan Kumar>
         * @return type boolean
         **/
        protected function generateAccessToken()
        {

            $url = "https://api.login.yahoo.com/oauth2/get_token";

            $refreshToken = $this->getRefreshToken();
            $data="grant_type=refresh_token&redirect_uri=".self::$oauthDomain."&refresh_token=".$refreshToken;

            $auth =  base64_encode(self::$oauthConsumerKey.":".self::$OauthConsumerSecret);  
            $headers = array(
                 'Authorization: Basic '.$auth,
                 'Content-Type: application/x-www-form-urlencoded'
            );

            try{

                $resultSet =self::makeRequest($url,$data,$headers);

                if($resultSet->access_token){
                    $this->setAccessToken($resultSet->access_token);
                    return true;
                }else{
                    return false;
                }
            }catch(Exception $ex){
                throw($ex);
            }

        }

        /**
         * Build a login url using oAuth Consumber Key And Redirect Domain
         *
         * @author Pawan Kumar
         * @return type String
         **/
        public static function getLoginUrl()
        {
           $loginUrl = "https://api.login.yahoo.com/oauth2/request_auth";
           $buildUrl =$loginUrl."?client_id=".self::$oauthConsumerKey."&redirect_uri=".self::$oauthDomain."&response_type=code&language=en-us"; 
           return $buildUrl;
        }

        /**
         * Make  a Remote Post Request using MakeRequest Function
         *
         * @param Url String
         * @param $postData String Send Post Data With Request
         * @param headers Array Contain Auth basic information
         * @author Pawan Kumar
         * @return type Object
         **/

        public static function makeRequest($url,$postData,$headers){

            try{

                if (empty($url))throw new Exception("Url is Not Format."); 
                if (empty($postData))throw new Exception("Post Parameters is Not Defined");

                $ch = curl_init();

                curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
                curl_setopt($ch, CURLOPT_VERBOSE, 1);
                curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
                curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
                curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
                curl_setopt($ch, CURLOPT_POSTFIELDS,$postData);
                curl_setopt($ch, CURLOPT_URL,$url);

                $result = curl_exec($ch);
                $output =json_decode($result);

                return $output;

            }catch(\Exception $ex){
                throw($ex);
            }

        }

        /**
         * @param RefreshToken to set String Token Into Session
         */
        public function setRefreshToken($token)
        { 
          $_SESSION['refresh_token']=$token;
        }

        /**
         * @return String Refresh Token From Session
         */
        public function getRefreshToken()
        { 
            return $_SESSION['refresh_token'];
        }

        /**
         * @param AccessToken to set String Token into Session
         */
        public function setAccessToken($token)
        { 
            $_SESSION['access_token']=$token;
        }

        /**
         * @return String Access Token From Session
         */
        public function getAccessToken()
        {
            return $_SESSION['access_token'];
        }

        /**
         * @param GuidToken to set String Token into Session
         */
        public function setGuidToken($token)
        {
            $_SESSION['xoauth_yahoo_guid']=$token;
        }
        /**
         * @return String Guid Token from Session
         */
        public function getGuidToken()
        {
            return $_SESSION['xoauth_yahoo_guid'];
        }

    }


    // Initialize Session If Session is Not Start
    session_start();

    if(isset($_GET['code'])){
        $code = $_GET['code'];
        if(!empty($code)){
            // create a instance of yahoo contacts
            $obj = new YahooContacts();
            //Successfully Authorization Process
            $obj->getAuthorization($code); 
            Header("Location:http://yahoo.fansunite.com.au");die;
        }
    }else{
        if(isset($_SESSION['access_token'])){

            // create a instance of yahoo contacts
            $obj = new YahooContacts();

            //After Authorization Get User Contacts Email
            $res =  $obj->getUserContactsDetails(); 
            print "<pre>";
            print_r($res);
        }else{
            $url = YahooContacts::getLoginUrl();
            echo "<center><strong><a href='$url'>Login With Yahoo Mail !</a></strong></center>";
        }

    }