toplan/laravel-sms

多用户发送验证码发送时间冲突

curder opened this issue · 5 comments

问题:

多用户发送验证码时,提示“请求无效,请在60秒后重试”。

具体表现:

先访问的用户可以正常发送验证码,较不理想的情况下后访问的用户必须等待最多60秒的时间。

打开源码SmsManager.php发现:

当用户发送验证码的时候,使用cache驱动时的 *._can_resend_until*._state 这两个key会被占用。

这个问题是故意这么设计么?是不是可以将用户的手机号码也存到缓存key中,来防止这种情况呢?

现在我遇到同样问题

现在我遇到同样问题

您好,经过在QQ群里的人指点,发送的请求的时候传access_token=手机号,就可以。感谢@潘多拉 !!您可以试下。
wx20181030-115536 2x

感谢!!!感谢

感谢!好坑。request()->headers->set('access-token', $phone);

建议也可以添加一个中间件,比如这里的 SmsAccessToken.php

  1. 中间件定义:
<?php

namespace App\Http\Middleware;

use Closure;

class SmsAccessToken
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle($request, Closure $next)
    {
        if($request->has('phone')) { // 根据前端传的字段自定义配置
            $request->headers->set('access-token', $request->input('phone'));
        }
        return $next($request);
    }
}
  1. 定义中间件别名

app/Http/Kernel.php文件的 $routeMiddleware 数组中添加如下配置:

'sms_access_token' => \App\Http\Middleware\SmsAccessToken::class
  1. 路由中使用中间件
Route::post('by-sms/send-code', 'RegisterController@sendSmsCode')->middleware(['sms_access_token']); // 发送短信验证码
Route::post('by-sms', 'RegisterController@smsStore')->middleware(['sms_access_token']); // 短信注册「需要验证手机号」