美文网首页PHP经验分享Laravel
Laravel后端接口使用mews/captcha验证码注册+登

Laravel后端接口使用mews/captcha验证码注册+登

作者: 众神开挂 | 来源:发表于2020-03-15 21:41 被阅读0次

    大致的流程讲解:
    注册流程:
    获取图形验证码并正确填写->请求注册验证短信->填写注册的用户信息+短信验证码->用户注册成功
    登录流程:
    前端请求短信->已注册用户:返回登录的验证短信->用户登录成功
    前端请求短信->未注册用户:提示用户注册
    本文主要讲解后端laravel代码的实现注册的流程,登录流程比较简单,不去具体讨论,结合具体业务进行操作

    1、安装 mews/captcha

    官方仓库地址:
    GitHub - mewebstudio/captcha: Captcha for Laravel 5 & 6
    安装依赖并注册组件,比较简单,参考官方文档

    $ composer require mews/captcha
    

    在 config/app.php文件中注册服务提供者和别名(laravel5.1以上版本)

    'providers' => [
       // ...
       Mews\Captcha\CaptchaServiceProvider::class,
    ],
     'aliases' => [
       // ...
      'Captcha' => Mews\Captcha\Facades\Captcha::class,
    ]
    

    生成配置文件

    $ php artisan vendor:publish
    

    编辑生成的config/captcha.php

        'flat' => [
            'length' => 4,
            'width' => 160,
            'height' => 46,
            'quality' => 90,
            'lines' => 6,
            'bgImage' => false,
            'bgColor' => '#ecf2f4',
            'fontColors' => ['#2c3e50', '#c0392b', '#16a085', '#c0392b', '#8e44ad', '#303f9f', '#f57c00', '#795548'],
            'contrast' => -5,
        ]
    

    2、编写图形验证码接口

      /**
       * 获取图形验证码
       * @return JsonResponse
       */
     public function captcha()
       {
           $data = [
               'url' => app('captcha')->create('flat', true)
           ];
           return response()->json([
              'status' => 200,
              'message' => 'success',
              'data' => $data,
          ]);
       }
    
    

    返回值,key为验证的密钥,img为验证码图片(Base64格式)

    {
        "status": 200,
        "message": "success",
        "data": {
            "url": {
                "sensitive": false,
                "key": "$2y$10$pAStUZM.srOy2kwJbqLFl.BNaPsjg71BZtj3BQ4K6HHsvtO6Cb0HW",
                "img": "data:image/png;base64,iVBORw……………………dw8P6Vb6JW4RcBb6FH8P88iH8kQmCC"
            }
        }
    }
    

    3、注册短信验证码获取接口

    在正确填写图片验证码之后,用户就可以获取到注册需要的短信验证码,发送短信前需要验证方法。

        /**
         * 获取注册短信验证码
         * @param Request $request
         * @param SmsService $service 注入短信验证码服务
         * @return JsonResponse
         * @throws ApiException
         */
        public function getVerifyCode_register(Request $request,SmsService $service)
        {       
            $validator = Validator::make($request->toArray(), [
                'account' => 'required|regex:/^1[345789][0-9]{9}$/',
                'captcha' => 'required',
                'key' => 'required'
            ], [
                'account.required' => '手机号码必填',
                'account.regex' => '手机号码错误',
                'captcha.required' => '图形验证码必填!',
                'key.required' => 'Key必填!'
            ]);
            if ($validator->fails()) {
                //抛出自定义异常,返回错误结果到前端
                throw new ApiException($validator->errors()->first(),400);
            }
            //检测验证码是否匹配
            if (!captcha_api_check($request['captcha'], $request['key'])) {
                throw new ApiException('验证码不匹配!',400);
            }
            //查询是否已经注册
            $find_user = DB::table(Member::TABLE)->where('account', $request['account'])->first();
            if ($find_user) {
                throw new ApiException('手机号已被注册,请登陆!',400);
            }
            //将短信验证码服务封装到service中,方便在不同的业务中调用
            if ($service->getSmsCode(request('account')) == 'success') {
              return response()->json([
                    'status' => 200,
                    'message' => '短信验证码发送成功!'
              ]);
            }
        }
    

    4、用户注册信息接口

        /**
         * 会员注册
         * @param Request $request
         * @param SmsService $service
         * @return JsonResponse
         * @throws ApiException
         */
        public function register(Request $request, SmsService $service)
        {
            $validator = Validator::make($request->toArray(), [
                'account' => 'required|regex:/^1[345789][0-9]{9}$/',
                'sms_code' => 'required|numeric',
                'company_name' => 'required',
                'name' => 'required'
            ], [
                'company_name.required' => '公司名称必填',
                'name.required' => '用户姓名必填',
                'account.required' => '手机号必填',
                'account.regex' => '手机号格式不正确',
                'sms_code.required' => '短信验证码必填',
                'sms_code.numeric' => '短信验证码是数字'
            ]);
    
            if ($validator->fails()) {
                throw new ApiException($validator->errors()->first(),400);
            }
    
            //查询是否已经注册
            $find_user = DB::table(Member::TABLE)->where('account', $request['account'])->first();
            if ($find_user) {
                throw new ApiException('手机号已被注册');
            }
            //验证短信验证码
            $redis_key = $service->smsCodeRedisKey($request['account']);
                $redis_sms_code = Redis::connection('verify_code')->get($redis_key);
                if ($request['sms_code'] != $redis_sms_code) {
                    throw new ApiException('验证码错误');
                }
            // 验证通过--删除短信验证码
            Redis::connection('verify_code')->del([$redis_key]);
            //生成用户Token
            $member_token = $this->createMemberToken($request['account']);
            // 保存会员信息
            $ret = DB::table(Member::TABLE)->insertGetId([
                'account' => $request['account'],
                'member_token' => $member_token,
                'company_name' => $request['company_name'],
                'name' => $request['name'],
                'last_login_time' => date('Y-m-d H:i:s'),
                'created_at' => date('Y-m-d H:i:s'),
                'updated_at' => date('Y-m-d H:i:s')
            ]);
            if (!$ret) {
                throw new ApiException('注册失败,请重试');
            }
            //注册成功之后直接返回登录的token给前端
            return response()->json([
                'status' => 200,
                'message' => '注册成功',
                'data' => [
                    'account' => $request['account'],
                    'member_token' => $member_token
                   ]
            ]);
        }
    

    参考文章链接:
    laravel 【mews/captcha】图片验证码 api接口形式获取、验证,不通过session_PHP - UCloud云社区 https://www.ucloud.cn/yun/29550.htm

    相关文章

      网友评论

        本文标题:Laravel后端接口使用mews/captcha验证码注册+登

        本文链接:https://www.haomeiwen.com/subject/bjkrshtx.html