- 登录前准备
2.登录工作(五步实现qq登录)
- 放置qq图标
- 获取code
- 通过code获取token
- 通过token获取access_token再获取openid
- 通过openid获取用户全部信息
前端处理代码:
<li><a class="navi_home" href="#" onclick='toLogin()'>qq登录</a></li>
<script>
function toLogin()
{
//以下为按钮点击事件的逻辑。注意这里要重新打开窗口
//否则后面跳转到QQ登录,授权页面时会直接缩小当前浏览器的窗口,而不是打开新窗口
var A=window.open("http://zhangdakang666.cn/index.php/index/huiyuan/qqlogin");
}
</script>
后端处理代码:
public function qqlogin()
{
$app_id = "101530573";
//回调地址
$redirect_uri = urlencode("http://zhangdakang.cn/index.php/index/huiyuan/token");
$url = "https://graph.qq.com/oauth2.0/authorize?response_type=code&client_id=".$app_id."&redirect_uri=".$redirect_uri."&scope=get_user_info&state=text";
//跳转到$url
//Step1:获取Authorization Code
// header("location".$url);
$this->redirect($url);
}
public function token()
{
// $code = $_GET['code'];
// dump($code);exit;
// appid
$app_id = "101530573";
//appkey
$app_secret = "bf5ad22a433ece66babedf69320ac0df";
//成功授权后的回调地址
$my_url = urlencode("http://zhangdakang.cn/index.php/index/huiyuan/token");
//获取code
$code = $_GET['code'];
//Step2:通过Authorization Code获取Access Token
$token_url = "https://graph.qq.com/oauth2.0/token?grant_type=authorization_code&client_id=".$app_id."&redirect_uri=".$my_url."&client_secret=".$app_secret."&code=".$code."";
//file_get_contents() 把整个文件读入一个字符串中。
$response = file_get_contents($token_url);
//Step3:在上一步获取的Access Token,得到对应用户身份的OpenID。
$params = array();
//parse_str() 函数把查询字符串('a=x&b=y')解析到变量中。
parse_str($response,$params);
$graph_url = "https://graph.qq.com/oauth2.0/me?access_token=".$params['access_token']."";
$str = file_get_contents($graph_url);
// dump($str);die;
// --->找到了字符串:callback( {"client_id":"YOUR_APPID","openid":"YOUR_OPENID"} )
//
// strpos() 函数查找字符串在另一字符串中第一次出现的位置,从0开始
if(strpos($str,"callback")!==false)
{
$lpos = strpos($str,"(");
// strrpos() 函数查找字符串在另一字符串中最后一次出现的位置。
$rpos = strrpos($str,")");
//substr(string,start,length) 截取字符串某一位置
$str = substr($str,$lpos+1,$rpos-$lpos-1);
}
// json_decode() 函数用于对 JSON 格式-->{"a":1,"b":2,"c":3,"d":4,"e":5}<--的字符串进行解码,并转换为 PHP 变量,默认返回对象
$user = json_decode($str);
// dump($user->openid);die;
session('openid',$user->openid);
//Step4: 调用OpenAPI接口,得到json数据,要转换为数组
$huiyuan = "https://graph.qq.com/user/get_user_info?access_token=".$params['access_token']."&oauth_consumer_key=".$app_id."&openid=".$user->openid."";
//加上true,得到数组,否则默认得到对象
$res = json_decode(file_get_contents($huiyuan),true);
// dump($res['nickname']);dump($res);die;
$re = db('huiyuan')->where(array('openid'=>$user->openid))->find();
//如果没有找到,进行注册
if(!$re){
if($res['gender']=="男"){
$res['gender'] = 1;
}else{
$res['gender'] = 2;
}
$data = [
'openid'=>$user->openid,
'username'=>$res['nickname'],
'image'=>$res['figureurl_qq_2'],
'sex'=>$res['gender'],
'year'=>$res['year'],
'province'=>$res['province'],
'city'=>$res['city'],
];
$r = db('huiyuan')->insert($data);
if($r){
$this->success('注册成功!',url('index/index'));
}else{
$this->error('注册失败!');
}
}else{
$this->redirect('login_qq');
}
}
public function login_qq()
{
$res = db('huiyuan')->where('openid',session('openid'))->find();
if(!$res){
$this->error('不是本站会员!');
}else{
session('id',$res['id']);
$this->success('登录成功!','index/index');
}
}