QQ登录+Lavarel框架

Posted on 2022-03-22 10:49  君子不卿  阅读(91)  评论(0编辑  收藏  举报

1、html代码

<form method="post" action="{{url('Index/loginAction')}}">

<h3>
     <a href="" class="fl">忘记密码?</a>
     <a href="{{$url}}" class="fl"><img src="/qq.png" alt=""></a>
     <a href="" class="fr">邮箱找回密码?</a>
</h3>

 </form>

2、PHP代码

namespace App\Http\Controllers\Index;

use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Session;
public function login()
    {
        $urlencode = urlencode("http://www.XXX.top/callback");
        $url = "https://graph.qq.com/oauth2.0/authorize?response_type=code&client_id='APP ID'&redirect_uri={$urlencode}";
        $data = compact("url");
        return view('index/login',$data);
    }

 2.1登录处理

public function loginAction()
    {
        $account = request()->input("username"); // 用户的账号
        $password = md5(md5(request()->input("password"))); // 用户的密码
        // 账号可以用,用户名,邮箱,手机号 都可以登录,该如何实现?
        $reg_phone = '/^(13[0-9]|14[01456879]|15[0-35-9]|16[2567]|17[0-8]|18[0-9]|19[0-35-9])\d{8}$/';
        $reg_email = '/^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]{2,})$/';
        $where["member_password"] = $password;
        $where['is_forbidden'] = 0;
        if(preg_match($reg_phone,$account)){
            // 用手机号来登录
            $where['member_phone'] = $account;
        }elseif (preg_match($reg_email,$account)){
            // 用邮箱来登录
            $where['member_email'] = $account;
        }else{
            // 用户名来登录
            $where['member_name'] = $account;
        }
        if($row = DB::table("member")->where($where)->first()){
            // 用户名,密码,都正确,已经被激活了
            $data['code'] = 0;
            // 存session
            Session::put("member_flag",1);
            Session::put("mid",$row['id']);
            Session::put("username",$row['username']);
            // 查询上次的登录时间
//            $last_login_time = Db::name("member")->where(["id"=>$row['id']])->value("login_time");
            Session::put("last_login_time",$row['login_time']); // 把上次登录时间取出来,存session
            // 每次登录成功后,修改登录时间
            DB::table("member")->where(["id"=>$row['id']])->update(["login_time"=>date("Y-m-d H:i:s")]);
        }else{
            $data['code'] = 1;
        }
        return response()->json($data);

    }

2.2回调地址

// 回调地址
    public function callback(Request $request)
    {
        $code = $request->input('code');
        // 1.获取code
        // 2.发起请求 获取access_token
        $urlencode = urlencode("http://www.XXX.top/callback");
        $url = "https://graph.qq.com/oauth2.0/token?grant_type=authorization_code&client_id='APP ID'&client_secret='APP Key'&code={$code}&redirect_uri={$urlencode}&fmt=json";
        $json = file_get_contents($url);
//        dd($json);
        $obj = json_decode($json);
//        dd($obj);
        $access_token = $obj->access_token;
        // 3.发起请求 获取openid
        $url = "https://graph.qq.com/oauth2.0/me?access_token={$access_token}&fmt=json";
        $obj = json_decode(file_get_contents($url));
        $openid = $obj->openid;
//        dd($openid);
        // 4.获取用户的信息
        $url = "https://graph.qq.com/user/get_user_info?access_token={$access_token}&oauth_consumer_key='APP ID'&openid={$openid}";
//        dd(file_get_contents($url));
        $obj = json_decode(file_get_contents($url));
//        dd($obj);
        // openid
        // 1.根据openid 查询这条记录是否已经存在?如果不存在,则写入,如果存在,则不用写
        $row = DB::table("qq")->where(["openid"=>$openid])->first();
//        dd($row);
        if($row){
            // 如果查到了,意味着此QQ已经登录过了
            // 查询是否已经绑定
            if($row->mid){
                // 已经绑定了 用户信息存入session
                $userinfo = DB::table("member")->where(["id"=>$row->mid])->first();
                // 绑定成功了
                Session::put("member_flag",1);
                Session::put("mid",$row->mid);
                Session::put("username",$userinfo->member_name);
                // 跳转到首页
//                return redirect((string)url('index'));
                return view('index/index');
            }else{
                // 还未绑定
                // 跳转到绑定账号的页面
                // 把openid 存入session
                Session::put("openid",$openid);
                DB::table("qq")->where("openid",$openid)->increment("login_num");
                return redirect((string)url('bindAccount'));
            }
        }else{
//            dd($obj);
            // 说明初次登录
            // 1.qq表写入数据,id,openid,nickname,gender,login_num,mid
            $data["nickname"] = $obj->nickname;
            $data["gender"] = $obj->gender;
            $data["openid"] = $openid;
            $data["login_num"] = 1;
            $id = DB::table("qq")->insertGetId($data); // 假如写入成功

            // 跳转到绑定账号的页面
            // 把openid 存入session
            Session::put("openid",$openid);
            return redirect((string)url('bindAccount'));
        }
        // 2.写session
        // 3. 跳转到首页
    }

2.3绑定账号

// 绑定账号
    public function bindAccount()
    {
        return view('index/bind');
    }

 2.4绑定页面js代码

<script>
    $("#login").submit(function () 
    {
        var username = $("#username").val();
        var password = $("#password").val();
        console.log(username);
        console.log(password);
        // return false;
        // 绑定处理
        $.post("{{url('bindAccountAction')}}",{username:username,password:password,_token:'{{csrf_token()}}'},function (data) {
            if(data.code == 1){
                // 登录失败
                alert("绑定失败了,请重试")
            }else{
                // 登录成功
                alert("绑定成功了")
                location.href="{{url('/')}}";
            }
        },"json");
        return false;
    })
</script>

 2.5绑定处理

// 绑定处理
    public function bindAccountAction()
    {
        // 绑定处理
        $username = request()->input("username");
        $password = request()->input("password");
        if($row = DB::table("member")->where(["member_name"=>$username,"member_pass"=>$password,"is_forbidden"=>0])->first()){
            // 绑定的账号,密码没问题
            // 所谓的绑定就是把用户的id写入到qq表的mid
            $openid = Session::get("openid");
            if(DB::table("qq")->where(["openid"=>$openid])->update(["mid"=>$row->id])){
                // 绑定成功了
                Session::put("member_flag",1);
                Session::put("mid",$row->id);
                Session::put("username",$username);
                // 跳转到首页
                $data['code'] = 0;
            }else{
                // 绑定失败了
                $data['code'] = 1;
            }
            return response()->json($data);
//            $data['code'] = 0;
//            // 存session
        }else{
            $data['code'] = 1;
        }
        return response()->json($data);
    }

 

Copyright © 2024 君子不卿
Powered by .NET 9.0 on Kubernetes

//评论