QQ登錄實現功能
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>
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 89 [is_yellow_vip] => 0 90 [vip] => 0 91 [yellow_vip_level] => 0 92 [level] => 0 93 [is_yellow_year_vip] => 0 94 ) 95 */ 96 $nickname=$data['nickname']; // 昵称 97 $figure=$data['figureurl_qq_1']; // 头像 98 echo $nickname; 99 echo '<br/>'; 100 echo "<img src='$figure'>"; 101 } 102 103 // 函数或方法,他不会自己执行,需要调用一下 104 if(isset($_GET['code'])){ 105 token(); 106 }else{ 107 code(); 108 }