登录  /  注册

QQ登录OAuth2.0 php接入种

php中文网
发布: 2016-06-13 13:18:52
原创
977人浏览过

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
???? $login_url = "https://graph.qq.com/oauth2.0/authorize?response_type=code&client_id= "
???? . $_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
???? {
?????? $token_url = "https://graph.qq.com/oauth2.0/token?grant_type=authorization_code& "
?????? . "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 -&gt;error;
?????????? echo "<h3>msg? :</h3>" . $msg -&gt;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()
?? {
???? $graph_url = "https://graph.qq.com/oauth2.0/me?access_token= "
???? . $_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 -&gt;error))
???? {
?????? echo "<h3>error:</h3>" . $user -&gt;error;
?????? echo "<h3>msg? :</h3>" . $user -&gt;error_description;
?????? exit ;
???? }
?
???? //set openid to session
???? return $_SESSION [ "openid" ] = $user -&gt;openid;
?? }
?
?? function get_user_info()
?? {
???? $get_user_info = "https://graph.qq.com/user/get_user_info? "
???? . "access_token=" . $_SESSION [ 'access_token' ]
???? . "&amp;oauth_consumer_key=" . $_SESSION [ "appid" ]
???? . "&amp;openid=" . $_SESSION [ "openid" ]
???? . "&amp;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 -&gt;login();
//or
$o_qq -&gt;callback();
$o_qq -&gt;get_openid();
$o_qq -&gt;get_user_info();

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

智能AI问答
PHP中文网智能助手能迅速回答你的编程问题,提供实时的代码和解决方案,帮助你解决各种难题。不仅如此,它还能提供编程资源和学习指导,帮助你快速提升编程技能。无论你是初学者还是专业人士,AI智能助手都能成为你的可靠助手,助力你在编程领域取得更大的成就。
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2024 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号