PHP经验分享Laravel

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

2020-03-15  本文已影响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

上一篇 下一篇

猜你喜欢

热点阅读