欢迎各位兄弟 发布技术文章

这里的技术是共享的

You are here

短信验证 限制访问次数 提交次数

<?php
namespace App\Http\Controllers\Api;

use App\Http\Controllers\Controller;
use App\Obj\User;
use Illuminate\Http\Request;
use Symfony\Component\HttpKernel\Exception\AccessDeniedHttpException;
use Cache;
use Symfony\Component\HttpKernel\Exception\ConflictHttpException;
use Symfony\Component\HttpKernel\Exception\ServiceUnavailableHttpException;

class SendPhoneCheckMsgController extends Controller{
    use ThrottlesPhoneCheck;

    public function __construct()
    {
        $guard = $this->getGuard();
        $this->middleware($guard ? 'guest:'.$guard : 'guest', ['except' => 'getLogout']);
        $this->middleware('geetest', ['except' => ['postLogin']]);
        $this->middleware('throttleIP:5,1,10', ['except' => ['postLogin']]);
    }

    protected function isValidPhoneNum($num = ''){
        if(!$num)return false;
        preg_match('/^1[0-9]{10}$/',$num,$res);
        if($res[0]===$num)return true;
        return false;
    }
    protected function sendInvalidPhoneNumberResponse(Request $request){
        if ($request->ajax() || $request->wantsJson()) {
            throw new AccessDeniedHttpException('手机号码输入不正确');
        } else {
            return redirect()->back()->withErrors(['手机号码输入不正确'])->withInput($request->all());
        }
    }

    /**
     * @param $num
     */
    protected function checkPhoneRegistered($num){
        if(count(User::where('phone_number',$num)->get())>0)throw new ConflictHttpException('该手机已注册,请直接登录');
    }

    /**
     * Get the guard to be used during authentication.
     *
     * @return string|null
     */
    protected function getGuard()
    {
        return property_exists($this, 'guard') ? $this->guard : null;
    }

    /**
     * @param Request $request
     * @return array
     */
    public function sendRegistCheckMsg(Request $request)
    {
        $validator = \Validator::make($request->all(),[
            'phone_number'=>'required'
        ]);
        if($validator->fails()||!$this->isValidPhoneNum($request->input('phone_number')))$this->sendInvalidPhoneNumberResponse($request);
        if($this->hasLocked($request))throw new AccessDeniedHttpException('请求发送短信频繁,请在'.$this->tryAfter($request).'秒后再试');

        $this->checkPhoneRegistered($request->input('phone_number'));
        $this->lockPhone($request,45/60);
        $result = \PhoneMessage::regist($request->input('phone_number'));
        if(!$result)return ['短信发送成功'];
        throw new ServiceUnavailableHttpException(60,'服务器错误:'.json_encode($result));
    }
}


trait ThrottlesPhoneCheck
{

    protected function lockPhone(Request $request,$decayMinutes){
        Cache::add($this->getPhoneKey($request).':lockout', time() + ($decayMinutes * 60), $decayMinutes);
    }

    protected function getPhoneKey(Request $request){
        return 'phone_num'.$request->input($this->phoneNumFormName());
    }
    protected function hasLocked(Request $request){
        return Cache::has($this->getPhoneKey($request).':lockout');
    }
    protected function tryAfter(Request $request)
    {
        return (int)Cache::get($this->getPhoneKey($request).':lockout') - time();
    }
    protected function phoneNumFormName()
    {
        return property_exists($this, 'phoneNumFormName') ? $this->phoneNumFormName : 'phone_number';
    }

}

来自 https://git.oschina.net/peterq/nkt/raw/master/app/Http/Controllers/Api/SendPhoneCheckMsgController.php
普通分类: