feat: 集成隐私小号功能保护用户手机号

新增隐私小号服务类,在订单创建时自动绑定隐私手机号,收货时自动解绑
在快递发货和收货流程中使用隐私小号替代真实手机号,保护用户隐私
添加数据库字段存储绑定关系,提供系统配置开关和测试脚本
This commit is contained in:
2026-04-01 00:43:51 +08:00
parent 03a6ba7961
commit 42d98407de
14 changed files with 1722 additions and 6 deletions

View File

@@ -211,6 +211,7 @@ class Login
*/
public function verify(Request $request)
{
// 1. 获取请求参数:手机号、验证码类型、防刷校验key、图形验证码类型及校验值
[$phone, $type, $key, $captchaType, $captchaVerification] = $request->postMore([
['phone', 0],
['type', ''],
@@ -219,13 +220,16 @@ class Login
['captchaVerification', ''],
], true);
// 2. 构造缓存Key:防刷校验Key与当前分钟级别的频率限制Key
$keyName = 'sms.key.' . $key;
$nowKey = 'sms.' . date('YmdHi');
// 3. 校验请求合法性:检查前端传递的防刷校验Key是否存在于缓存中,防止非法/机器请求
if (!CacheService::has($keyName))
return app('json')->make(401, '发送验证码失败,请刷新页面重新获取');
// 4. 发送频率限制(分钟级防刷):检查当前一分钟内该接口的调用总次数是否超过配置上限(默认20次)
$total = 1;
if (CacheService::has($nowKey)) {
$total = CacheService::get($nowKey);
@@ -233,23 +237,33 @@ class Login
return app('json')->success('已发送');
}
//二次验证
// 二次验证(图形验证码校验,当前代码中被注释)
// try {
// aj_captcha_check_two($captchaType, $captchaVerification);
// } catch (\Throwable $e) {
// return app('json')->fail($e->getError());
// }
// 5. 数据验证:使用 RegisterValidates 验证器专门校验手机号格式是否合法
try {
validate(RegisterValidates::class)->scene('code')->check(['phone' => $phone]);
} catch (ValidateException $e) {
return app('json')->fail($e->getError());
}
// 6. 获取配置:从系统配置中获取验证码的有效时长(单位:分钟),默认1分钟
$time = sys_config('verify_expire_time', 1);
// 7. 核心业务处理:调用 LoginServices 的 verify 方法,执行如检查是否注册、生成验证码、异步派发短信发送任务等逻辑
$smsCode = $this->services->verify($phone, $type, $time, app()->request->ip());
// 8. 结果处理:如果短信验证码生成及派发成功
if ($smsCode) {
// 将验证码写入缓存,设置过期时间(转换为秒)
CacheService::set('code_' . $phone, $smsCode, $time * 60);
// 记录/更新当前分钟的接口请求频次(有效期61秒)
CacheService::set($nowKey, $total, 61);
// 触发短信发送后的事件(可用于后续扩展业务逻辑)
event('sms.sendAfter', [$smsCode, $phone]);
return app('json')->success('发送成功');
} else {