zoukankan      html  css  js  c++  java
  • 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. }?> 
  • 相关阅读:
    json数组解析
    sparkschedule任务类
    elasticsearch的操作类
    删除hbase的region步骤和代码
    zookeeper持有者类
    zookeeper主节点竞争类
    剑指offer(61-66)编程题
    Codeforces Round #190 (Div. 2) B. Ciel and Flowers
    一些傍晚的感想
    Codeforces Round #307 (Div. 2) D. GukiZ and Binary Operations
  • 原文地址:https://www.cnblogs.com/sanwenyu/p/4572440.html
Copyright © 2011-2022 走看看