laravel8 微信小程序自动登录

laravel8 微信小程序自动登录,第1张

laravel8 微信小程序自动登录

一 : 下载第三方插件

composer require lcobucci/jwt 3.3

二 : 创建相关的控制器

1:生成&校验token的控制器

php artisan make:controller Api/TokenController

2:登录的控制器

php artisan make:controller Api/LoginController

3:创建中间件

php artisan make:middleware TokenMiddleWare

三 : 在新建的token控制器内命名空间下调用

use LcobucciJWTBuilder;
use LcobucciJWTSignerHmacSha256;
use LcobucciJWTParser;
use LcobucciJWTValidationData;

四 : 生成token的方法

	//生成token
    static public function createToken($uid=null){
        $signer = new Sha256();//加密规则
        $time = time();//当前时间

        $token = (new Builder())
            ->issuedBy('teacher')//签发人
            ->canOnlyBeUsedBy('student')//接收人
            ->identifiedBy('kaslana', true) //标题id
            ->issuedAt($time)//发出令牌的时间
            ->canOnlyBeUsedAfter($time) //生效时间(即时生效)
            ->expiresAt($time + 3600) //过期时间
            ->with('uid', $uid) //用户id
            ->sign($signer, 'kiana') //签名
            ->getToken(); //得到token
        return (string)$token;
    }

五 : 校验token的方法

	//验证token
    static public function verifyToken($token=null){
        //检测是否接收到了token
        if(empty($token)){
            return 0;
        }
        //代码到30行,就表示取到token了,那么转化成jwt认识的token
        $token = (new Parser())->parse((string) $token);
        //验证基本设置
        $data = new ValidationData();
        $data->setIssuer('teacher');
        $data->setAudience('student');
        $data->setId('kaslana');

        if(!$token->validate($data)){
            return 0;
        }
        //验证签名
        $signer = new Sha256();
        if(!$token->verify($signer, 'kiana')){
            return 0;
        }
        //验证通过,返回用户id
        return $token->getClaim('uid');
    }

六 : 在新建的中间件中加入

        try {

            //接取token
            $token = $request->get('token');

            //token不存在
            if (!isset($token)){
                return ['code' => 200,'msg' => '未登录','data' => ''];
            }

            //解密获取用户id
            $uid = TokenController::verifyToken($token);

            //id错误
            if (!$uid){
                return ['code' => 200,'msg' => '账号错误!请联系管理员','data' => ''];
            }

        }catch (Exception $exception){
            print_r($exception->getMessage());
            return;
        }
        
        return $next($request);

七 : 在局部中间件中注册该中间件

 protected $routeMiddleware = [
	 'login' =>TokenMiddleWare::class,
 ];

八 : 按需在路由中调用即可

九 : 小程序app.js中插入

    // 登录
    wx.login({
      success: res => {
        var code = res.code
       wx.getStorage({
         "key" : "token",
         success(){
           wx.request({
             url : "http://127.0.0.1/laravel8/public/api/login",
             data : {
               code : code
             },
             "method" : "POST",
             success(res){
               var token = res.data.data
               wx.setStorage({
                 "key" : "token",
                 "data" : token,
                 success(){
                  wx.showToast({
                    title : "登录成功",
                    icon : "success"
                  })
                 }
               })
             }
           })
         },fail(){
           wx.request({
             url : "http://127.0.0.1/laravel8/public/api/login",
             data : {
               code : code
             },
             "method" : "POST",
             success(res){
               var token = res.data.data
               wx.setStorage({
                 "key" : "token",
                 "data" : token,
                 success(){
                  wx.showToast({
                    title : "注册成功",
                    icon :  "success"
                  })
                 }
               })
             }
           })
         } 
       })
      }
    })

十 : 在login的控制器中插入

private $AppId  = '';
    private $AppSecret = '';

    
    public function login(Request $request)
    {
        try {

            //接值
            $code = $request->get('code');

            //验证是否设置
            if (!isset($code)){
                return ['code' => 500,'msg' => '请重新进入小程序','data' => ''];
            }

            //拼接地址
            $url = "https://api.weixin.qq.com/sns/jscode2session?appid={$this->AppId}&secret={$this->AppSecret}&js_code={$code}&grant_type=authorization_code";

            //取出地址中的openid和session_key
            $res = $this->getUrl($url);

            //查询数据库中是否存在相同的openid
            $userInfo = ApiUsers::where('openid',$res['openid'])->get();

            //不存在
            if (!empty($userInfo)){

                //组装用户信息
                $userData = [
                    'nickname' => md5(rand(1111,9999) . $res['openid']),//随机用户名
                    'openid' => $res['openid'],//唯一标识符
                    'image' => '', //默认为空
                    'phone' => '', //默认为空
                    'status' => 1  //默认为启用状态
                ];

                //执行添加入库 *** 作
                $createUserInfo = ApiUsers::create($userData);

                //判断是否添加入库
                if (!$createUserInfo){

                    //添加失败
                    return ['code' => 500,'msg' => '用户注册失败','data' => ''];

                }else{

                    //添加成功 获取token
                    $token = TokenController::createToken($createUserInfo['id']);

                    //返回
                    return ['code' => 200,'msg' => '注册成功','data' => $token];
                }
            }else{

                //存在用户 根据用户id霍去病token
                $token = TokenController::createToken($userInfo[0]['id']);

                //返回
                return ['code' => 200,'msg' => '登录成功','data' => $token];
            }
        }catch (Exception $e){
            return ['code' => 500,'msg' => $e->getMessage(),'data' => ''];
        }

    }

    
    public function getUrl($url)
    {
        $headerArray = array("Content-type:application/json;", "Accept:application/json");
        $ch          = curl_init();
        curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
        curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
        curl_setopt($ch, CURLOPT_HTTPHEADER, $headerArray);
        $output = curl_exec($ch);
        curl_close($ch);
        $output = json_decode($output, true);
        return $output;
    }

END

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zaji/5685817.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-17
下一篇 2022-12-17

发表评论

登录后才能评论

评论列表(0条)

保存