QQ登录OAuth2.0 php接入类

 

/**
  *
  * qq登录
  * @author http://www.heui.org
  *
  */
class Oauth_qq
{
   private static $_instance ;
   private $config = array ();
 
   private function __construct( $config )
   {
     $this ->Oauth_qq( $config );
   }
 
   public static function getInstance( $config )
   {
     if (!isset(self:: $_instance ))
     {
       $c = __CLASS__ ;
       self:: $_instance = new $c ( $config );
     }
     return self:: $_instance ;
   }
 
   private function Oauth_qq( $config )
   {
     $this ->config = $config ;
     $_SESSION [ "appid" ]    = $this ->config[ 'appid' ];
     $_SESSION [ "appkey" ]   = $this ->config[ 'appkey' ];
     $_SESSION [ "callback" ] = $this ->config[ 'callback' ];
     $_SESSION [ "scope" ] = "get_user_info,add_share,list_album,add_album,upload_pic,add_topic,add_one_blog,add_weibo" ;
   }
 
   function login()
   {
     $_SESSION [ 'state' ] = md5(uniqid(rand(), TRUE)); //CSRF protection
     . $_SESSION [ "appid" ] . "&redirect_uri=" . urlencode( $_SESSION [ "callback" ])
     . "&state=" . $_SESSION [ 'state' ]
     . "&scope=" . $_SESSION [ "scope" ];
     header( "Location:$login_url" );
   }
 
   function callback()
   {
     if ( $_REQUEST [ 'state' ] == $_SESSION [ 'state' ]) //csrf
     {
       . "client_id=" . $_SESSION [ "appid" ]. "&redirect_uri=" . urlencode( $_SESSION [ "callback" ])
       . "&client_secret=" . $_SESSION [ "appkey" ]. "&code=" . $_REQUEST [ "code" ];
 
       $response = get_url_contents( $token_url );
       if ( strpos ( $response , "callback" ) !== false)
       {
         $lpos = strpos ( $response , "(" );
         $rpos = strrpos ( $response , ")" );
         $response   = substr ( $response , $lpos + 1, $rpos - $lpos -1);
         $msg = json_decode( $response );
         if (isset( $msg ->error))
         {
           echo "<h3>error:</h3>" . $msg ->error;
           echo "<h3>msg  :</h3>" . $msg ->error_description;
           exit ;
         }
       }
 
       $params = array ();
       parse_str ( $response , $params );
 
       $_SESSION [ "access_token" ] = $params [ "access_token" ];
     }
     else
     {
       echo ( "The state does not match. You may be a victim of CSRF." );
     }
   }
 
   function get_openid()
   {
     . $_SESSION [ 'access_token' ];
 
     $str   = get_url_contents( $graph_url );
     if ( strpos ( $str , "callback" ) !== false)
     {
       $lpos = strpos ( $str , "(" );
       $rpos = strrpos ( $str , ")" );
       $str   = substr ( $str , $lpos + 1, $rpos - $lpos -1);
     }
 
     $user = json_decode( $str );
     if (isset( $user ->error))
     {
       echo "<h3>error:</h3>" . $user ->error;
       echo "<h3>msg  :</h3>" . $user ->error_description;
       exit ;
     }
 
     //set openid to session
     return $_SESSION [ "openid" ] = $user ->openid;
   }
 
   function get_user_info()
   {
     $get_user_info = "https://graph.qq.com/user/get_user_info? "
     . "access_token=" . $_SESSION [ 'access_token' ]
     . "&oauth_consumer_key=" . $_SESSION [ "appid" ]
     . "&openid=" . $_SESSION [ "openid" ]
     . "&format=json" ;
 
     $info = get_url_contents( $get_user_info );
     $arr = json_decode( $info , true);
 
     return $arr ;
   }
 
   public function __clone()
   {
     trigger_error( 'Clone is not allow' ,E_USER_ERROR);
   }
 
}
 
/* 公用函数 */
if (!function_exists( "do_post" ))
{
   function do_post( $url , $data )
   {
     $ch = curl_init();
     curl_setopt( $ch , CURLOPT_RETURNTRANSFER, TRUE);
     curl_setopt( $ch , CURLOPT_POST, TRUE);
     curl_setopt( $ch , CURLOPT_POSTFIELDS, $data );
     curl_setopt( $ch , CURLOPT_URL, $url );
     $ret = curl_exec( $ch );
 
     curl_close( $ch );
     return $ret ;
   }
}
if (!function_exists( "get_url_contents" ))
{
   function get_url_contents( $url )
   {
     if ( ini_get ( "allow_url_fopen" ) == "1" )
     return file_get_contents ( $url );
 
     $ch = curl_init();
     curl_setopt( $ch , CURLOPT_RETURNTRANSFER, TRUE);
     curl_setopt( $ch , CURLOPT_URL, $url );
     $result =  curl_exec( $ch );
     curl_close( $ch );
 
     return $result ;
   }
}

使用实例:

$config [ 'appid' ]    = '' ;
$config [ 'appkey' ]   = '' ;
$config [ 'callback' ] = '' ;
$o_qq = Oauth_qq::getInstance( $config );
 
//then
$o_qq ->login();
//or
$o_qq ->callback();
$o_qq ->get_openid();
$o_qq ->get_user_info();

原文:http://www.heui.org/archives/454

你可能感兴趣的:(PHP,qq,OAuth)