php實現qq受權登陸

第一步:json

登陸 https://connect.qq.com  qq受權管理中心開通應用,審覈經過以後填寫平臺信息。如圖:session

 

 

值得一提的是網站回調域必須具體到方法,否則登陸以後回調會識別錯誤。app

 

 

第二步:網站

創建數據表,存儲qq受權返回的用戶信息(主要是存儲openid,用戶惟一識別標識)。個人實現方法是在用戶表裏添加字段存儲,我的中內心面補全用戶信息。this

 

 

第三步:url

接下來就是拿到應用的app_id 和 app_secret 來調取接口。直接上代碼:spa

/**
 * qq受權登陸
 */  
public function qqlogin(){
   $app_id = "111111111";
   //應用的APPKEY
   $app_secret = "0asd55db7745a7a946c6cfdedefgscba";
   //【成功受權】後的回調地址,即此地址在騰訊的信息中有儲存
   $my_url = "http://".$_SERVER['HTTP_HOST']."/Home/User/qqlogin";

   //Step1:獲取Authorization Code
   $code = $_REQUEST["code"];//存放Authorization Code
   if(empty($code))
   {
      //state參數用於防止CSRF攻擊,成功受權後回調時會原樣帶回
      $_SESSION['qq_state'] = md5(uniqid(rand(), TRUE));
      //拼接URL
      $dialog_url = "https://graph.qq.com/oauth2.0/authorize?response_type=code&client_id="
         . $app_id . "&redirect_uri=" . urlencode($my_url) . "&state="
         . $_SESSION['qq_state'];
      echo("<script> top.location.href='" . $dialog_url . "'</script>");
   }

   //Step2:經過Authorization Code獲取Access Token
   if($_REQUEST['state'] == $_SESSION['qq_state'] || 1)
   {
      //拼接URL
      $token_url = "https://graph.qq.com/oauth2.0/token?grant_type=authorization_code&"
         . "client_id=" . $app_id . "&redirect_uri=" . urlencode($my_url)
         . "&client_secret=" . $app_secret . "&code=" . $code;
      $response = file_get_contents($token_url);
      if (strpos($response, "callback") !== false)//若是登陸用戶臨時改變主意取消了,返回true!==false,不然執行step3
      {
         $lpos = strpos($response, "(");
         $rpos = strrpos($response, ")");
         $response = substr($response, $lpos + 1, $rpos - $lpos -1);
         $msg = json_decode($response);
         if (isset($msg->error))
         {
            /*echo "<h3>error:</h3>" . $msg->error;
            echo "<h3>msg :</h3>" . $msg->error_description;*/
            $this->error("非法操做,請從新登陸!", U('user/login'));
         }
      }

      //Step3:使用Access Token來獲取用戶的OpenID
      $params = array();
      parse_str($response, $params);//把傳回來的數據參數變量化
      $graph_url = "https://graph.qq.com/oauth2.0/me?access_token=".$params['access_token'];
      $str = file_get_contents($graph_url);
      if (strpos($str, "callback") !== false)
      {
         $lpos = strpos($str, "(");
         $rpos = strrpos($str, ")");
         $str = substr($str, $lpos + 1, $rpos - $lpos -1);
      }
      $user = json_decode($str);//存放返回的數據 client_id ,openid
      if (isset($user->error))
      {
         /*echo "<h3>error:</h3>" . $user->error;
         echo "<h3>msg :</h3>" . $user->error_description;
         exit;*/
         $this->error("非法操做,請從新登陸!", U('user/login'));
      }
      //echo("Hello " . $user->openid);
      //echo("Hello " . $params['access_token']);

      //Step4:使用access_token來獲取所接受的用戶信息。
      $user_data_url = "https://graph.qq.com/user/get_user_info?access_token={$params['access_token']}&oauth_consumer_key={$app_id}&openid={$user->openid}&format=json";

      $user_data = file_get_contents($user_data_url);//此爲獲取到的user信息

      $user_data = json_decode($user_data, true);
      $user_data['openid'] = $user->openid;
      $m = M("Member");
      $data = array();
      $data['sex']           = $user_data["gender"]=='男'?1:2;
      $data['province']      = $user_data["province"];
      $data['city']          = $user_data["city"];
      $data['person_name']   = $user_data["nickname"];
      $data['qq_openid']     = $user_data["openid"];
      $data['qq_name']       = $user_data["nickname"];
      $data['qq_img']        = $user_data["figureurl_qq_2"];
      $data['addtime']       = date("Y-m-d H:i:s", time());
      $data['person_img']    = $user_data["figureurl_qq_2"];
      $data['signtime']      = date("Y-m-d H:i:s", time());

      $user = M("Member")->where(array("qq_openid"=> $user_data['openid']))->find();
    //判斷當前是否第一次登陸
      if($user){
         $res = M("Member")->where(array("qq_openid"=> $user_data["openid"]))->setField("signtime", date("Y-m-d H:i:s", time()));
         if($res){
        //登陸成功業務邏輯
             session("user_id", $user['id']);
                   

         }else{
            $this->error("操做異常,拒絕訪問!", U('user/login'));
         }
      }else{
         $res=$m->add($data);
         if($res){
        //登陸成功業務邏輯
        session("user_id", $res);         

         }else{
            $this->error("操做異常,拒絕訪問!", U('user/login'));
         }
      }

   }
   else
   {
      $this->error("操做異常,拒絕訪問!", U('user/login'));
   }
}
相關文章
相關標籤/搜索