6
0
Fork 0

设置安全密码

release
李静 2022-02-14 14:45:32 +08:00
parent 4b73ad7570
commit 830b8131d9
6 changed files with 82 additions and 44 deletions

View File

@ -4,12 +4,48 @@ namespace App\Endpoint\Api\Http\Controllers\Account;
use App\Endpoint\Api\Http\Controllers\Controller;
use App\Exceptions\BizException;
use App\Models\SmsCode;
use App\Models\Wallet;
use App\Services\SmsCodeService;
use Illuminate\Http\Request;
use Illuminate\Support\Arr;
class WalletPasswordController extends Controller
{
/**
* 设置钱包密码
*
* @param Request $request
* @param SmsCodeService $smsCodeService
* @return void
*/
public function update(Request $request, SmsCodeService $smsCodeService)
{
$input = $request->validate([
'verify_code' => ['bail', 'required'],
'new_password' => ['bail', 'required', 'size:6'],
], [
'verify_code' => '验证码',
'new_password' => '新密码',
]);
$user = $request->user();
$smsCodeService->validate(
$user->phone,
SmsCode::TYPE_SET_WALLET_PASSWORD,
$input['verify_code']
);
Wallet::updateOrCreate([
'user_id'=> $user->id,
], [
'password' => $input['new_password'],
]);
return response()->noContent();
}
/**
* 设置安全密码
*

View File

@ -2,9 +2,12 @@
namespace App\Endpoint\Api\Http\Controllers;
use App\Endpoint\Api\Http\Requests\StoreSmsCodeRequest;
use App\Exceptions\BizException;
use App\Models\SmsCode;
use App\Rules\PhoneNumber;
use App\Services\SmsCodeService;
use Illuminate\Auth\AuthenticationException;
use Illuminate\Http\Request;
use Throwable;
class SmsCodeController extends Controller
@ -12,22 +15,36 @@ class SmsCodeController extends Controller
/**
* 发送短信验证码
*
* @param \App\Endpoint\Api\Http\Requests\StoreSmsCodeRequest $request
* @param \Illuminate\Http\Request $request
* @param \App\Services\SmsCodeService $smsCodeService
* @return \Illuminate\Http\Response
*
* @throws \App\Exceptions\BizException
*/
public function store(
StoreSmsCodeRequest $request,
Request $request,
SmsCodeService $smsCodeService,
) {
$type = (int) $request->input('type');
if (in_array($type, [SmsCode::TYPE_SET_WALLET_PASSWORD])) {
if (is_null($user = $request->user())) {
throw new AuthenticationException('请先登录', ['api']);
}
$phone = $user->phone;
} else {
$request->validate([
'phone' => ['bail', 'required', new PhoneNumber()],
]);
$phone = $request->input('phone');
}
$code = app()->isProduction() ? mt_rand(100000, 999999) : '666666';
try {
$smsCodeService->send(
$request->input('phone'),
$request->input('type'),
app()->isProduction() ? mt_rand(100000, 999999) : '666666',
);
$smsCodeService->send($phone, $type, $code);
} catch (BizException $e) {
throw $e;
} catch (Throwable $e) {

View File

@ -1,32 +0,0 @@
<?php
namespace App\Endpoint\Api\Http\Requests;
use App\Rules\PhoneNumber;
use Illuminate\Foundation\Http\FormRequest;
class StoreSmsCodeRequest extends FormRequest
{
/**
* Determine if the user is authorized to make this request.
*
* @return bool
*/
public function authorize()
{
return true;
}
/**
* Get the validation rules that apply to the request.
*
* @return array
*/
public function rules()
{
return [
'phone' => ['bail', 'required', new PhoneNumber()],
'type' => ['bail', 'required', 'int'],
];
}
}

View File

@ -92,6 +92,7 @@ Route::group([
// 修改密码
Route::post('change-password', ChangePasswordController::class);
//安全密码
Route::put('wallet-password', [WalletPasswordController::class, 'update']);
Route::post('wallet-password/reset', [WalletPasswordController::class, 'reset']);//重置或设置安全密码
//我的账户

View File

@ -14,6 +14,7 @@ class SmsCode extends Model
public const TYPE_REGISTER = 1;
public const TYPE_RESET_PASSWORD = 2;
public const TYPE_SET_WALLET_PASSWORD = 3;
/**
* @var array
@ -51,6 +52,7 @@ class SmsCode extends Model
public static $allowedTypes = [
self::TYPE_REGISTER,
self::TYPE_RESET_PASSWORD,
self::TYPE_SET_WALLET_PASSWORD,
];
/**

View File

@ -43,10 +43,23 @@ class SmsCodeService
throw new BizException(__('Invalid verification code type'));
}
if ($type === SmsCode::TYPE_REGISTER) {
if (User::where('phone', $phone)->exists()) {
throw new BizException(__('The phone number is already registered'));
}
$user = User::where('phone', $phone)->first();
switch ($type) {
case SmsCode::TYPE_REGISTER:
if ($user) {
throw new BizException(__('The phone number is already registered'));
}
break;
case SmsCode::TYPE_RESET_PASSWORD:
case SmsCode::TYPE_SET_WALLET_PASSWORD:
if ($user === null) {
throw new BizException('手机号未注册');
}
break;
}
if (! $this->cache->add("sms_lock_{$type}_{$phone}", 1, $decaySeconds)) {
@ -58,6 +71,7 @@ class SmsCodeService
'code' => $code,
'type' => $type,
'expires_at' => now()->addSeconds($this->expires),
'user_id' => $user->id,
]);
}