QQ互联,QQ第三方登录
1.获取Authorization code
private $app_id = 'xx'; private $app_secret = 'xx'; private $redirect = 'xx'; /** * 登录地址 */ public function login() { $app_id = $this->app_id; $back_url = $this->redirect; $url = 'https://graph.qq.com/oauth2.0/authorize?response_type=code&client_id='.$app_id.'&redirect_uri='.$back_url; return json(['data' => $url]);//这里拼接的参数,放到地址栏会弹出登录QQ界面 }
2.获取到的Authorization code 会在10分钟后失效,在第一步的回调地址.以get方式拿到Authorization code,然后通过Authorization code获取Access token.
/** * [get_access_token 获取access_token] * @param [string] $code [登陆后返回的$_GET['code']] * @return [array] [expires_in 为有效时间 , access_token 为授权码 ; 失败返回 error , error_description ] */ function get_access_token($code) { $token_url = 'https://graph.qq.com/oauth2.0/token?grant_type=authorization_code&' . 'client_id=' . $this->app_id . '&redirect_uri=' . $this->redirect . '&client_secret=' . $this->app_secret . '&code=' . $code; $token = array(); parse_str(file_get_contents($token_url), $token); //parse_str将查询的字符串解析到变量 return $token; }
3.使用Access token获取用户的Appid(Appid和QQ号一样,和用户是一一对应的)
/** * [get_open_id 获取用户唯一ID,openid] * @param [string] $token [授权码] * @return [array] [成功返回client_id 和 openid ;失败返回error 和 error_msg] */ function get_open_id($token) { $str = file_get_contents('https://graph.qq.com/oauth2.0/me?access_token=' . $token); if (strpos($str, "callback") !== false) { $lpos = strpos($str, "("); $rpos = strrpos($str, ")"); $str = substr($str, $lpos + 1, $rpos - $lpos - 1); } $user = json_decode($str, TRUE); return $user; }
4.使用Access token 和appid获取用户的个人信息
/** * [get_user_info 获取用户信息] * @param [string] $token [授权码] * @param [string] $open_id [用户唯一ID] * @return [array] [ret:返回码,为0时成功。msg为错误信息,正确返回时为空。...params] */ function get_user_info($token, $open_id) { $user_info_url = 'https://graph.qq.com/user/get_user_info?' . 'access_token=' . $token . '&oauth_consumer_key=' . $this->app_id . '&openid=' . $open_id . '&format=json'; $info = json_decode(file_get_contents($user_info_url)); return $info; }
5.最后封装一个函数去分别调用他们就可以了
/** * 验证登录信息 * @return json数据 登陆用户的信息 */ public function is_login(){ if(isset($_GET['code'])) { //qq获取信息 $token = $this->get_access_token($_GET['code']); $open_id = $this->get_open_id($token['access_token']); $info = $this->get_user_info($token['access_token'] , $open_id['openid']); return json([ 'data' => $info, 'msg' => "获取到QQ用户信息", 'code' => 200 ]); } // .................... }