大致的流程讲解:
注册流程:
获取图形验证码并正确填写->请求注册验证短信->填写注册的用户信息+短信验证码->用户注册成功
登录流程:
前端请求短信->已注册用户:返回登录的验证短信->用户登录成功
前端请求短信->未注册用户:提示用户注册
本文主要讲解后端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
网友评论