QQ登录集成到自己网站php代码(转载)

我们现在在各大网站论坛都可以看到点击一个QQ图标就可以利用自己的QQ号在网站进行登录了,下面我来告诉你一段QQ登录集成到自己网站php代码,有需要的朋友可参考.

1.打开open.qq.com 添加创建应用:-》输入常规的数据,你会看到对应的APP ID和KEY值,这是对你身份证的唯一的验证.

2.打开 http://connect.qq.com/manage/ 点击->添加网站->输入相关信息,这里比较特别注意的是,回调地址那里填上你域名就可以了以上申核需要一到两天时间,耐心等待.

3.打开 http://wiki.opensns.qq.com/wiki/%E3%80%90QQ%E7%99%BB%E5%BD%95%E3%80%91%E7%BD%91%E7%AB%99%E6%8E%A5%E5%85%A5 找到SDK库下载,我在这里下载是官方的php SDK包,如果你的虚拟空间file_get_contents不技持https,可以考虑用curl函数来替代,好多童鞋常常因为获取不到access_token也就是这个原因,任何一个包不是一气呵成了,还需你配置相关的配置,这个繁索的调试过程我就在这里展开谈了,说说原理->通过你的网站登陆QQ state和scope->获得access_token->再获得每个QQ唯一的身份ID openid.

4.在这里你调试成功后,获得ID后,还需和你当前网站帐号绑定,才能下次登陆的时候自动去识别你的相关绑定帐号内容.

常见问题:

1.Warning: session_start() [function.session-start]: open(/tmpsess_s9b1ahi6vnvc0pfl2e0dcd0l10, O_RDWR) failed: 解决方法:No such file or directory (2) inD:powhostbbcarblogwebtestqqSDKcommsession.php on line 196

找到sssion.php session_save_path 加上注释//,注释掉设置路径

2.Notice: file_get_contents() [function.file-get-contents]: Unable to find the wrapper "https" - did you forget to enable it when you configured PHP? inD:powhostbbcarblogwebtestqqSDKcommutils.php on line 37

解决方法:

找到 Utils.php  function get_url_contents 函数内容直接用下面代码替代,因为file_get_content默认不支持访问https,如果要支持需配置php.ini,激活 php_openssl.dll 模块,这个大家百度配置一下便可,php代码如下:

  1. $ch = curl_init();     
  2. curl_setopt($ch, CURLOPT_URL,$url);     
  3. curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);     
  4. curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);     
  5. curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);     
  6. $result = curl_exec($ch);     
  7. return $result 

下面是一个完整的实例,是一个QQ登录API示范接口,程序为PHP、具体代码如下:

  1. <?php /**   
  2. * 申请http://connect.opensns.qq.com/apply   
  3. * 列表http://connect.opensns.qq.com/my   
  4. */   
  5. session_start();    
  6. $qq_oauth_config = array(    
  7.     'oauth_consumer_key'=>'*******',//APP ID    
  8.     'oauth_consumer_secret'=>'******************',//APP KEY    
  9.     'oauth_callback'=>"http://www.sunnyi.cn/qq.php?action=reg",//这里修改为当前脚本,但是要保留?action=reg    
  10.     'oauth_request_token_url'=>"http://openapi.qzone.qq.com/oauth/qzoneoauth_request_token",    
  11.     'oauth_authorize_url'=>'http://openapi.qzone.qq.com/oauth/qzoneoauth_authorize',    
  12.     'oauth_request_access_token_url'=>'http://openapi.qzone.qq.com/oauth/qzoneoauth_access_token',    
  13.     'user_info_url' => 'http://openapi.qzone.qq.com/user/get_user_info',    
  14. );    
  15. $action = isset($_GET['action']) ? $_GET['action'] : '';    
  16.    
  17.    
  18. $qq = new qq_oauth($qq_oauth_config);    
  19. switch($action){    
  20.     //用户登录 Step1:请求临时token    
  21.     case 'login':    
  22.         $token = $qq->oauth_request_token();    
  23.         $_SESSION['oauth_token_secret'] = $token['oauth_token_secret'];    
  24.         $qq->authorize($token['oauth_token']);    
  25.     break;    
  26.     //Step4:Qzone引导用户跳转到第三方应用    
  27.     case 'reg':    
  28.         $qq->register_user();    
  29.         $access_token = $qq->request_access_token();    
  30.         if($token = $qq->save_access_token($access_token)){    
  31.             //保存,一般发给用户cookie,以及用户入库    
  32.             //var_dump($token);    
  33.             $_SESSION['oauth_token'] = $token['oauth_token'];    
  34.             $_SESSION['oauth_token_secret'] = $token['oauth_token_secret'];   
  35.             $_SESSION['openid'] = $token['openid'];    
  36.             header('Content-Type: text/html; charset=utf-8');    
  37.             $user_info = json_decode($qq->get_user_info());    
  38.             if($user_info->ret!=0){    
  39.                 exit("获取头像昵称时发生错误".$user_info->msg);    
  40.             } else {    
  41.                 echo 'QQ昵称:',$user_info->nickname,    
  42.                 '<img src="',$user_info->figureurl,'" />',    
  43.                 '<img src="',$user_info->figureurl_1,'" />',    
  44.                 '<img src="',$user_info->figureurl_2,'" />';    
  45.             }    
  46.                 
  47.         }    
  48.     break;    
  49.     default :    
  50. }    
  51.    
  52.    
  53. class qq_oauth{    
  54.     private $config;    
  55.     function __construct($config){    
  56.         $this->config = $config;    
  57.     }    
  58.     /**   
  59.      * 返回配置   
  60.      * @param string $name   
  61.      *    
  62.      */   
  63.     function C($name){    
  64.         return isset($this->config[$name]) ?  $this->config[$name] : FALSE;   
  65.     }    
  66.     /**   
  67.      * 构建请求URL   
  68.      * @param string $url   
  69.      * @param array $params   
  70.      * @param string $oauth_token_secret   
  71.      *    
  72.      */   
  73.     function build_request_uri($url,$params=array(),$oauth_token_secret=''){    
  74.         $oauth_consumer_key = $this->C('oauth_consumer_key');    
  75.         $oauth_consumer_secret = $this->C('oauth_consumer_secret');    
  76.             
  77.         $params = array_merge(array(    
  78.             'oauth_version'=>'1.0',    
  79.             'oauth_signature_method'=>'HMAC-SHA1',    
  80.             'oauth_timestamp'=>time(),    
  81.             'oauth_nonce'=>rand(1000,99999999),    
  82.             'oauth_consumer_key'=>$oauth_consumer_key,    
  83.         ),$params);    
  84.         $encode_params = $params;    
  85.         ksort($encode_params);    
  86.         $oauth_signature = 'GET&'.urlencode($url).'&'.urlencode(http_build_query($encode_params));    
  87.         $oauth_signature = base64_encode(hash_hmac('sha1',$oauth_signature,$oauth_consumer_secret.'&'.$oauth_token_secret,true));   
  88.         $params['oauth_signature'] = $oauth_signature;    
  89.         return $url.'?'.http_build_query($params);    
  90.     }    
  91.     /**   
  92.      * 校验回调是否返回约定的参数    
  93.      */   
  94.     function check_callback(){    
  95.         if(isset($_GET['oauth_token']))    
  96.             if(isset($_GET['openid']))    
  97.                 if(isset($_GET['oauth_signature']))    
  98.                     if(isset($_GET['timestamp']))    
  99.                         if(isset($_GET['oauth_vericode']))    
  100.                             return true;    
  101.         return false;    
  102.     }    
  103.        
  104.     function get_contents($url){    
  105.         $curl = curl_init();    
  106.         curl_setopt($curl,CURLOPT_RETURNTRANSFER,true);    
  107.         curl_setopt($curl,CURLOPT_URL,$url);    
  108.         return curl_exec($curl);    
  109.     }    
  110.     /**   
  111.      * Step1:请求临时token、Step2:生成未授权的临时token   
  112.      */   
  113.     function oauth_request_token(){    
  114.         $url = $this->build_request_uri($this->C('oauth_request_token_url'));    
  115.         $tmp_oauth_token = $this->get_contents($url);    
  116.         parse_str($tmp_oauth_token);    
  117.         /*   
  118.         oauth_token 未授权的临时token   
  119.         oauth_token_secret  token的密钥,该密钥仅限于临时token   
  120.         error_code  错误码   
  121.         */   
  122.         if(isset($error_code)) exit($error_code);    
  123.         return array(    
  124.             'oauth_token'=>$oauth_token,    
  125.             'oauth_token_secret'=>$oauth_token_secret   
  126.         );    
  127.     }    
  128.     /**   
  129.      * Step3:引导用户到Qzone的登录页   
  130.      * @param string $oauth_token 未授权的临时token   
  131.      */   
  132.     function authorize($oauth_token){    
  133.         $str = "HTTP/1.1 302 Found";    
  134.         header($str);    
  135.         $url = $this->C('oauth_authorize_url');    
  136.         $query_strings = http_build_query(array(    
  137.             'oauth_consumer_key'=>$this->C('oauth_consumer_key'),    
  138.             'oauth_token'=>$oauth_token,    
  139.             'oauth_callback'=>$this->C('oauth_callback'),    
  140.         ));    
  141.         header('Location: '.$url.'?'.$query_strings);    
  142.     }    
  143.     /**   
  144.      * Step4:Qzone引导用户跳转到第三方应用   
  145.      * @return bool 验证是否有效    
  146.      */   
  147.     function register_user(){    
  148.         /*   
  149.          * oauth_token  已授权的临时token   
  150.          * openid   腾讯用户对外的统一ID,该OpenID与用户QQ号码一一对应   
  151.          * oauth_signature  签名值,方便第三方来验证openid以及来源的可靠性。   
  152.          *      使用HMAC-SHA1算法:   
  153.          *      源串:openid+timestamp(串中间不要添加'+'符号)   
  154.          *      密钥:oauth_consumer_secret   
  155.          * timestamp    openid的时间戳   
  156.          * oauth_vericode   授权验证码。   
  157.          */   
  158.         if($this->check_callback()){    
  159.             //校验签名    
  160.             $signature = base64_encode(hash_hmac('sha1',$_GET['openid'].$_GET['timestamp'],$this->C('oauth_consumer_secret'),true));    
  161.             if(!emptyempty($_GET['oauth_signature']) && $signature==$_GET['oauth_signature']){    
  162.                 $_SESSION['oauth_token'] = $_GET['oauth_token'];    
  163.                 $_SESSION['oauth_vericode'] = $_GET['oauth_vericode'];    
  164.                 return;    
  165.             }    
  166.         }    
  167.         //校验未通过    
  168.         exit('UNKNOW REQUEST');    
  169.     }    
  170.     /**   
  171.      * Step5:请求access token    
  172.      */   
  173.     function request_access_token(){    
  174.         $url = $this->build_request_uri($this->C('oauth_request_access_token_url'),array(    
  175.             'oauth_token'=>$_SESSION['oauth_token'],    
  176.             'oauth_vericode'=>$_SESSION['oauth_vericode']    
  177.         ),$_SESSION['oauth_token_secret']);    
  178.         return $this->get_contents($url);    
  179.     }    
  180.     /**   
  181.      * Step6:生成access token (保存access token)   
  182.      *    
  183.      * 关于access_token   
  184.      * 目前access_token(及其secret)是长期有效的,和某一个openid对应,目前可以支持线下获取该openid的信息。    
  185.      * 当然,用户有权限在Qzone这边删除对第三方的授权,此时该access_token会失效,需要重新走整个流程让用户授权。   
  186.      * 以后会逐步丰富access_token的有效性,长期有效、短期有效、用户登录时才有效等。   
  187.      */   
  188.     function save_access_token($access_token_str){    
  189.         parse_str($access_token_str,$access_token_arr);    
  190.         if(isset($access_token_arr['error_code'])){    
  191.             return FALSE;    
  192.         } else {    
  193.             return $access_token_arr;    
  194.         }    
  195.     }    
  196.     /**   
  197.      * 目前腾讯仅开放该API   
  198.      * 获取登录用户信息,目前可获取用户昵称及头像信息。   
  199.      * http://openapi.qzone.qq.com/user/get_user_info   
  200.      */   
  201.     function get_user_info(){    
  202.         $url = $this->build_request_uri($this->C('user_info_url'),array(    
  203.             'oauth_token'=>$_SESSION['oauth_token'],    
  204.             'openid'=>$_SESSION['openid'],    
  205.         ),$_SESSION['oauth_token_secret']);    
  206.         return $this->get_contents($url);    
  207.     }    
  208. }?> 
posted @ 2015-06-12 19:47  拉风的牛  阅读(412)  评论(0编辑  收藏  举报