PHP/ThinkPHP5制作QQ第三方登录,无需官方SDK文件

简介PHP/ThinkPHP5制作QQ第三方登录,无需官方SDK文件

1、新建一个控制器,命名为User

namespace app\index\controller;
use think\Config;
use think\Session;
use think\Cookie;
use think\Db;
class User extends \think\Controller
{
   public function login(){
       if(Cookie::has('user')) {
         $user = Db::name('user')->where(['login_string'=>Cookie::get('user')])->find();
         if(empty($user)){
           Cookie::delete('user');
         } else {
           $this->redirect('index/index/index');
         }
       }
       //把第一次访问之前的url存入Session待用
       if(!Session::has('user_url')){
           Session::set('user_url',$this->request->param('url'));
       }
       $config = Config::get('thirdlogin.qq');
       // 获取回调地址
       $url = $config['callback'];
       $redirect_uri = urlencode($url);
       
       $appid = $config['appid'];
       $appsecret = $config['appsecret'];
       
       Session::set('state',md5(uniqid(rand(), TRUE)));
        // 获取code码,用于和QQ服务器申请token。 注:依据OAuth2.0要求,此处授权登录需要用户端操作
        if(empty($this->request->param('code')) && !Session::has('code')){
          //以下信息可安放在用户登录界面上:
         $url= 'https://graph.qq.com/oauth2.0/authorize?response_type=code&client_id='.$appid.'
         &redirect_uri='.$redirect_uri.'&scope=get_user_info&state='.Session::get('state');
         header('Location:'.$url);//跳转到第三方登录入口
         exit;
        }
        // 依据code码去获取openid和access_token,自己的后台服务器直接向QQ服务器申请即可
        if (!empty($this->request->param('code')) && !Session::has('token')){
           Session::set('code',$this->request->param('code'));
           $url="https://graph.qq.com/oauth2.0/token?client_id=".$appid.
            "&client_secret=".$appsecret."&code=".Session::get('code')."&grant_type=authorization_code"
            ."&state=".Session::get('state')."&redirect_uri=".$redirect_uri;
           $res = $this->https_request($url);
           $res = explode("&",$res);
           $token = [];
           foreach ($res as $k => $val) {
             $val = explode("=",$val);
             $token[$val[0]] = $val[1];
           }
        }
        // 依据申请到的access_token和openid,申请Userinfo信息。
        if (isset($token['access_token'])){
         $url = "https://graph.qq.com/oauth2.0/me?access_token=".$token['access_token'];
         $openid = $this->https_request($url);
         if (preg_match('/\"openid\":\"(\w+)\"/i', $openid, $match)) {
           $openid = $match[1];
         }
         $url = "https://graph.qq.com/user/get_user_info?oauth_consumer_key=".$appid."
         &access_token=".$token['access_token']."&openid=".$openid.'&format=json';
         
         $userinfo = $this->https_request($url);
         $userinfo = json_decode($userinfo,true);
         Session::delete('code');
         Session::delete('state');
         $user_url = Session::get('user_url');
         Session::delete('user_url');
         //从这里开始根据自己的程序修改
         if(!empty($userinfo)){
             $user = Db::name('user')->where(['openid'=>$openid])->find();
             $salt = salt(create_code(20));
             if(empty($user)) {
               if($user['status'] == -1) {
                 return $this->error('你已被拉黑');
               }
               $data = [
                 'name' => $userinfo['nickname'],
                 'openid' => $openid,
                 'gender' =>$userinfo['gender'],
                 'thumb' => $userinfo['figureurl_qq_1'],
                 'login_string' => $salt,
                 'create_time' => time(),
                 'last_login_time' => time(),
                 'last_login_ip' => $this->request->ip(),
                 'login_num' => 1,
               ];
               if(false == Db::name('user')->insert($data)){
                 return $this->error('登录失败');
               }
             } else {
               if(false == Db::name('user')->where('id',$user['id'])
               ->update(['login_string'=>$salt,'last_login_time'=>time(),'last_login_ip'=>
               $this->request->ip(),'login_num'=>$user['login_num']+1])) {
                 return $this->error('登录失败');
               }
             }
             Cookie::set('user',$salt,7200);
             $this->redirect($user_url);
         } else {
           return $this->error('未知错误');
         }
         //这里结束
      }
   }
  protected function https_request($url, $data = null)
  {
     $curl = curl_init();
     curl_setopt($curl, CURLOPT_URL, $url);
     curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE);
     curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, FALSE);
     if (!empty($data)){
      curl_setopt($curl, CURLOPT_POST, 1);
      curl_setopt($curl, CURLOPT_POSTFIELDS, $data);
     }
     curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
     $output = curl_exec($curl);
     curl_close($curl);
     return $output;
  }

以上代码就是本博客的登录代码,部分内容需根据自己程序的需要进行修改后才能使用。


2、在配置文件中加入相应的配置


  1. //QQ第三方登录
    'thirdlogin'=>[
    'qq'        => [
    'appid'     => '',
    'appsecret' =>'',
    'callback'  =>'',//回调地址
    ],

以上配置项均需要填入你申请到的配置项(具体怎么申请我就不说了博客里面有文章),回调地址填写为你新建的User控制器里的login()方法。


3、如果你是非ThinkPHP5的PHP程序,把代码里的Session、Cookie等方法改成PHP原生的即可。

4、博客也有封装包和具体教材,

注意:在请求新建的User控制器的login()方法时,需要传递一个参数user_url,作为用户在完成登录后的跳回页面,这个参数的值建议为用户请求登录的页面地址。




声明:
1,如果您发现本文件已经失效不能下载,请联系站长修正或留言!
2,本站提供的资源多数为百度网盘下载,对于大文件,你需要安装百度云客户端才能下载!
3,部分文件引用的官方或者非网盘类他站下载链接,你可能需要使用迅雷、BT等下载工具下载!
4,本站推荐的资源均经由站长检测或者个人发布,不包含恶意软件病毒代码等,如果你发现此类问题,请向站长举报!
5,本站仅提供文件的免费下载服务,如果你对代码程序软件的使用有任何疑惑,请留言。
6,本网站在文章内容仅供于学习参考使用,请勿作为商业通途使用,版权归原作者所有。如您对内容、版权等问题存在异议请与本站联系,我们会及时进行处理解决。

下一篇:

程序员的17种状态,你有过几种?


上一篇:

tp5写分页内容会重置怎么办?


文章评论

Top