<?php    
    namespace App\Http\Controllers\M\Member;
    use App\Library\Common;
    use App\Library\Sms;
    use App\Library\Util;
    use App\Library\Y;
    use App\Models\Area;
    use App\Models\Company\Company;
    use App\Models\EmailCode;
    use App\Models\Member\Member;
    use App\Models\Member\MemberConnect;
    use App\Models\SmsCode;
    use Illuminate\Http\Request;
    use App\Http\Controllers\Controller;
    use Illuminate\Support\Facades\Auth;
    use Illuminate\Support\Facades\Cache;
    use Illuminate\Support\Facades\Hash;
    use Illuminate\Support\Facades\Log;
    use Illuminate\Support\Facades\Mail;
    use Illuminate\Support\Facades\Session;
    class IndexController extends Controller
    {
        //
         protected function guard()
         {
              return Auth::guard('member');
         }
         /**
          * 手机登录
          * @param Request $request
          * @return mixed
          */
         public function mobile_login(Request $request){
              $current_name = '手机登录';
              $menu = 'member';
              if($request->isMethod('post'))
              {
                   $phone = trim($request->get('phone'));
                   $code = trim($request->get('code'));
                   //判断手机验证码是否正确
                   $phoneCode = SmsCode::where(['phone' => $phone])->where(['code' => $code])->where(['type' => 'login'])->where(['status' => 1])->where('created_at', '>', date("Y-m-d H:i:s", strtotime("-10 minute")))->first();
                   if (!$phoneCode) {
                        return Y::error('手机短信验证码不正确!', ["code" => "VERIFY_ERROR"]);
                   }
                   $member = Member::where('phone','=',$phone)->first();
                   if(!$member){
                        return Y::error('手机号码没有注册!');
                   }
                   $this->guard()->login($member);
                   //$this->guard()->loginUsingId($member->id);
                   return Y::success('登录成功!' ,["code"=>"SUCCESS"]);
              }else{
                   return view('new_m.index.mobile_login', compact('current_name', 'menu'));
              }
         }
          */
         public function send_phone_login_code(Request $request){
              $phone = $request->get('phone');
              if (!Util::isMobile($phone)) {
                   return Y::error('手机号码验证失败!', ["code" => "ERROR_FORMAT"]);
              }
              //判断手机是否注册过
              $member = Member::where('phone', '=', $phone)->first();
              if(!$member){
                   return Y::error('手机号码还没注册,请先注册!');
              }
              //判断数据库是否有3分钟内没验证的code
              $smsCode = SmsCode::where(['phone' => $phone])->where(['status' => 1])->where('type','=','login')->where('created_at', '>', date("Y-m-d H:i:s", strtotime("-3 minute")))->take(1)->orderBy('id', 'desc')->get();
              if (!$smsCode->isEmpty()) {
                   return Y::error('请不要重复发送!', ["code" => "ERROR_REPEAT"]);
              }
              $ip = $request->getClientIp();
              //1个ip 一天只能发送获取10次
              if(Common::verifySmsCount($ip) >20){
                   return Y::error('您当天累计已发送20次!', ["code" => "ERROR_REPEAT"]);
              }
              //生成6位code,保存email code表
              $code = mt_rand(100000, 999999);
              $data = array(
                   'phone' => $phone,
                   'code' => $code,
                   'type' => 'login',
                   'status' => 1,
                   'ip'=> $ip
              );
              $createData = SmsCode::create($data);
              if (!$createData) {
                   return Y::error('发送失败,请联系管理员!', ["code" => "ERROR_CREATE"]);
              }
              $msg['code'] = $code;
              $template = 'bs_login';
              Sms::sendSms($phone, $msg, $template);
              return Y::success('发送短信成功!请查收!', ["code" => "SUCCESS"]);
         }
    }

阿里短信-适用Laravel、Yii、Thinkphp等任何PHP项目

安装composer require flc/dysms

    <?php    
    namespace App\Library;
    use Flc\Dysms\Client;
    use Flc\Dysms\Request\SendSms;
    class Sms
    {
        //发短信
        public static function sendSms($mobile,$msg,$template='buy_register')
        {
            $config = [
                'accessKeyId'    => config('app.sms.AccessKeyId'),
                'accessKeySecret' => config('app.sms.AccessKeySecret')
            ];
            $template = config('app.sms.template')[$template];
            $client  = new Client($config);
            $sendSms = new SendSms();
            $sendSms->setPhoneNumbers($mobile);
            $sendSms->setSignName(config('app.sms.Signature'));
            $sendSms->setTemplateCode($template);
            $sendSms->setTemplateParam($msg);
            $sendSms->setOutId('demo');
            return $client->execute($sendSms);
        }
    }

config app.php  配置文件

    <?php    
    return [
        'sms' => [
            'AccessKeyId' => 'BLTAI4KRPdEZTPNIuCl',
            'AccessKeySecret' => 'PYNzU78mnNVBoPLORxDmtBAJzGNdfX8',
            'Signature' => '一览网',
            'template' => [
                'bs_login'=> 'SMS_204287763',
                'bs_register'=> 'SMS_204440138'
            ]
        ],
    ];

php view模板

@extends('new_m.base')    
    @section('content')
        <form id="login_form" action="{{route('m.mobile_login')}}" method="post">
            @csrf
            <div class="m_block">
                <ul>
                    <li>
                        <input name="phone" id="phone" type="text" class="line-input" placeholder="请输入手机号码" autocomplete="off">
                    </li>
                    <li>
                        <input name="code" id="code" type="text" class="line-input" placeholder="请输入短信验证码" autocomplete="off"><input type="button"  class="yzm" id="sendPhoneLoginCode" value="获取验证码">
                    </li>
                </ul>
            </div>
            <div class="m_block_btn">
                <button type="button" class="submit_btn" onclick="javascript:mobile_login();">登录</button>
            </div>
        </form>
    @endsection

JS处理

    // 定时器    
    var wait = 180;
    get_code_time = function (o) {
        if (wait == 0) {
            o.removeAttribute("disabled");
            o.value = "获取验证码";
            wait = 180;
        } else {
            o.setAttribute("disabled", true);
            o.value = "(" + wait + ")秒后重新获取";
            wait--;
            setTimeout(function () {
                get_code_time(o)
            }, 1000)
        }
    };
    /**
     * 短信登录
     * @returns {boolean}
     */
    function mobile_login() {
        var phone = $.trim($("#phone").val());
        var code = $.trim($("#code").val());
        if (isPhoneNo(phone) == false) {
            $("#phone").focus();
            layer.msg('请输入合法的号码');
            return false;
        }
        if (code.length != 6){
            $("#code").focus();
            layer.msg('请输入正确的验证码');
            return false;
        }
        $.ajax({
            url: $("#login_form").attr('action'),
            data: $("#login_form").serializeArray(),
            type: 'post',
            cache: false,
            dataType: 'json',
            success: function (data) {
                if(data.code == 0){
                    layer.msg(data.msg, {
                        time: 1000, end: function () {
                            window.location.href = '/member/index';
                        }
                    });
                }else{
                    layer.msg(data.msg);
                    return false;
                }
            },
            error: function () {
                layer.msg('系统异常,请联系客服人员!');
            }
        });
    }
    $("#sendPhoneLoginCode").click(function(){
        var phone = $.trim($("#phone").val());
        var _token = $("input[name='_token']").val();
        var o = this;
        if (isPhoneNo(phone) == false) {
            $("#phone").focus();
            layer.msg('请输入合法的号码');
            return false;
        }
        //发送验证码
        $.ajax({
            url: "/users/send_phone_login_code",
            data: { "_token": _token, "phone": phone},
            type: "post",
            dataType: 'json',
            success:function (data) {
                if(data.code == 0){
                    get_code_time(o);
                }
                layer.msg(data.msg);
            },
            error:function (data) {
                layer.msg(data.msg);
            }
        });
    });

发送短信sql

CREATE TABLE `c_sms_codes`  (    
      `id` int(11) NOT NULL AUTO_INCREMENT,
      `phone` varchar(50) CHARACTER SET utf8 COLLATE utf8_unicode_ci NULL DEFAULT '' COMMENT '验证邮件',
      `code` char(20) CHARACTER SET utf8 COLLATE utf8_unicode_ci NULL DEFAULT '' COMMENT '验证码',
      `ip` varchar(30) CHARACTER SET utf8 COLLATE utf8_unicode_ci NULL DEFAULT '',
      `status` tinyint(4) NULL DEFAULT 1 COMMENT '0已验证 1 未验证',
      `type` char(10) CHARACTER SET utf8 COLLATE utf8_unicode_ci NULL DEFAULT '' COMMENT '类型',
      `created_at` timestamp(0) NULL DEFAULT NULL,
      `updated_at` timestamp(0) NULL DEFAULT NULL,
      PRIMARY KEY (`id`) USING BTREE
    ) ENGINE = InnoDB AUTO_INCREMENT = 11 CHARACTER SET = utf8 COLLATE = utf8_bin COMMENT = '手机验证验证码' ROW_FORMAT = Dynamic;