zoukankan      html  css  js  c++  java
  • 實現QQ第三方登錄

      1 <?php
      2 // 写几个函数,分别用于获取code,token,openid,用户信息
      3 
      4 // 跳转到QQ授权登录页面
      5 function code(){
      6     $response_type='code';
      7     $client_id='101353491';
      8     $redirect_uri='http://www.iwebshop.com/index.php';
      9     $state='dfs343df';
     10 
     11     $url="https://graph.qq.com/oauth2.0/authorize?response_type=$response_type&client_id=$client_id&redirect_uri=$redirect_uri&state=$state";
     12     // 使用header函数跳转
     13     header("location:$url");
     14 }
     15 
     16 function token(){
     17     // 1 请求的参数
     18     $grant_type='authorization_code';
     19     $client_id='101353491';
     20     $client_secret='df4e46ba7da52f787c6e3336d30526e4';
     21     $code=$_GET['code'];        // 接收地址栏的code参数,这个就是Authorization Code
     22     $redirect_uri='http://www.iwebshop.com/index.php';
     23 
     24     // 2 构造出完整的、正确的接口地址
     25     $url="https://graph.qq.com/oauth2.0/token?grant_type=$grant_type&client_id=$client_id&client_secret=$client_secret&code=$code&redirect_uri=$redirect_uri";
     26 
     27     // 3 向上面的$url发请求(请求接口),获取数据
     28     $str=file_get_contents($url);
     29     // 上面代码得到的值(接口返回的数据)是:access_token=DC5C4AF94719CB5DE6A6EF1570A1B968&expires_in=7776000&refresh_token=8E946C30FC46D6BD2C4CC17055B6532D ,我们只需要access_token的值,即 DC5C4AF94719CB5DE6A6EF1570A1B968 ,那怎么办,我们先找到左侧第1个“=”符号的位置(strpos函数),再找到左侧第1个“&”的位置(strpos函数),之后使用substr函数截取出需要的值
     30     $left=strpos($str,'=');            // 从字符串$str左侧开始获取第一个“=”符号的位置
     31     $right=strpos($str,'&');
     32     $token=substr($str,$left+1,$right-$left-1);            // 获取“=”符号和“&”符号之间的内容,即access token的值
     33     //echo $token;
     34     
     35     // 4 调用openid函数,进一步使用access token来获取openid值
     36     openid($token);
     37 
     38 }
     39 
     40 function openid($token){
     41     $url="https://graph.qq.com/oauth2.0/me?access_token=$token";
     42     // 向上面的$url发请求,获取数据
     43     $str=file_get_contents($url);
     44     // 请求接口后,得到的值是:callback( {"client_id":"101353491","openid":"7429C3FDC8FA70FEF3252FF47D6CDDA3"} ); ,我们只需要openid的值,即 7429C3FDC8FA70FEF3252FF47D6CDDA3 ,那我们怎么办?先获取左侧“(”的位置,再获取右侧“)”的位置,之后使用substr获取“(”与“)”之间的字符串,这个字符串是一个json格式的字符串,接着使用json_decode将此字符串转换成PHP数组,即可获取到openid的值
     45     $left=strpos($str,'(');
     46     $right=strrpos($str,')');
     47     $str=substr($str,$left+1,$right-$left-1);        // 截取出了完整的json格式字符串 {"client_id":"101353491","openid":"7429C3FDC8FA70FEF3252FF47D6CDDA3"}     
     48     $data=json_decode($str,true);    
     49     // echo '<pre/>';
     50     // print_r($data);die;
     51     /*
     52     Array
     53     (
     54         [client_id] => 101353491
     55         [openid] => 7429C3FDC8FA70FEF3252FF47D6CDDA3
     56     )
     57     */    
     58     $openid=$data['openid'];    
     59     // 调用userInfo函数,进一步获取用户信息
     60     userInfo($openid,$token);
     61 }
     62 
     63 function userInfo($openid,$token){
     64     $client_id='101353491';
     65     $url="https://graph.qq.com/user/get_user_info?access_token=$token&oauth_consumer_key=$client_id&openid=$openid";
     66     // 向上面的$url发请求,获取数据
     67     $str=file_get_contents($url);
     68     //echo $str;
     69     /*{ "ret": 0, "msg": "", "is_lost":0, "nickname": "白雪峰", "gender": "男", "province": "辽宁", "city": "大连", "year": "1983", "constellation": "", "figureurl": "http://qzapp.qlogo.cn/qzapp/101353491/7429C3FDC8FA70FEF3252FF47D6CDDA3/30", "figureurl_1": "http://qzapp.qlogo.cn/qzapp/101353491/7429C3FDC8FA70FEF3252FF47D6CDDA3/50", "figureurl_2": "http://qzapp.qlogo.cn/qzapp/101353491/7429C3FDC8FA70FEF3252FF47D6CDDA3/100", "figureurl_qq_1": "http://thirdqq.qlogo.cn/qqapp/101353491/7429C3FDC8FA70FEF3252FF47D6CDDA3/40", "figureurl_qq_2": "http://thirdqq.qlogo.cn/qqapp/101353491/7429C3FDC8FA70FEF3252FF47D6CDDA3/100", "is_yellow_vip": "0", "vip": "0", "yellow_vip_level": "0", "level": "0", "is_yellow_year_vip": "0" } */
     70     $data=json_decode($str,true);
     71     // echo '<pre/>';
     72     // print_r($data);die;
     73     /*
     74     Array
     75     (
     76         [ret] => 0
     77         [msg] => 
     78         [is_lost] => 0
     79         [nickname] => 紅腹棘
     80         [gender] => 男
     81         [province] => 辽宁
     82         [city] => 大连
     83         [year] => 1983
     84         [constellation] => 
     85         [figureurl] => http://qzapp.qlogo.cn/qzapp/101353491/7429C3FDC8FA70FEF3252FF47D6CDDA3/30
     86         [figureurl_1] => http://qzapp.qlogo.cn/qzapp/101353491/7429C3FDC8FA70FEF3252FF47D6CDDA3/50
     87         [figureurl_2] => http://qzapp.qlogo.cn/qzapp/101353491/7429C3FDC8FA70FEF3252FF47D6CDDA3/100
     88         [figureurl_qq_1] => http://thirdqq.qlogo.cn/qqapp/101353491/7429C3FDC8FA70FEF3252FF47D6CDDA3/40
     89         [figureurl_qq_2] => http://thirdqq.qlogo.cn/qqapp/101353491/7429C3FDC8FA70FEF3252FF47D6CDDA3/100
     90         [is_yellow_vip] => 0
     91         [vip] => 0
     92         [yellow_vip_level] => 0
     93         [level] => 0
     94         [is_yellow_year_vip] => 0
     95     )
     96     */
     97     $nickname=$data['nickname'];        // 昵称
     98     $figure=$data['figureurl_qq_1'];        // 头像
     99     echo $nickname;
    100     echo '<br/>';
    101     echo "<img src='$figure'>";
    102 }
    103 
    104 // 函数或方法,他不会自己执行,需要调用一下
    105 if(isset($_GET['code'])){
    106     token();
    107 }else{
    108     code();
    109 }
     1 <html>
     2 <head>
     3     <title></title>
     4 </head>
     5 <body>
     6 <form>
     7 <p>用户名 <input type='text' name='name'></p>
     8 <p>密码 <input type='text' name='password'></p>
     9 <p><input type='submit' value='登录'> 
    10 <!-- QQ图标 -->
    11     <img src="qq.png" onclick='login();'>
    12 
    13 </p>
    14 </form>
    15 </body>
    16 </html>
    17 
    18 <script>
    19 function login(){
    20     // 单击QQ登录图标后,跳转到index.php页面
    21     location.href='index.php';
    22 }
    23 </script>
  • 相关阅读:
    EditPlus使用技巧
    PL/SQL Dev的问题
    解决httpModules 未能从程序集 XX 加载类型 XXX 的错误
    IE浏览器无法显示背景,字体显示很大问题的解决办法[转]
    如何在Outlook2003中加入农历节气
    再谈Oracle在Windows下的权限问题
    Vista下安装布署注册的问题解决
    [转]关于管理的经典故事(员工激励)
    开始应用AJAX
    Aptana IDE 中文乱码的问题解决
  • 原文地址:https://www.cnblogs.com/songbao/p/11226239.html
Copyright © 2011-2022 走看看