美文网首页Laravel开发实践Laravel
Laravel 使用阿里云短信发送验证码

Laravel 使用阿里云短信发送验证码

作者: 嘉勇__Lynne | 来源:发表于2019-01-25 14:26 被阅读3次

    安装:composer require mrgoon/aliyun-sms dev-master

    在config/app.php里的providers配置

    'providers'=>[
            /**
             * 阿里云短信
             */
            Mrgoon\AliSms\ServiceProvider::class,
    ]
    

    顺便设置别名

    'aliases' => [
          /**
             * 阿里云短信
             */
            'AliSms'=>Mrgoon\AliSms\ServiceProvider::class,
    ]
    

    运行 php artisan vendor:publish 命令

    配置config/aliyunsms.php

    return [
        'access_key'        => env('ALIYUN_ACCESSKEYID'), // accessKey
        'access_secret'     => env('ALIYUN_ACCESSKEYSECRET'), // accessSecret
        'sign_name'         => env('ALIYUN_SMS_SIGN_NAME'), // 签名
    ];
    
    

    在.env文件配置以下三项

    ALIYUN_ACCESSKEYID=签名id
    ALIYUN_ACCESSKEYSECRET=签名key 密码
    ALIYUN_SMS_SIGN_NAME=你的签名
    

    在Driver文件夹新建一个AliAliSMSDrv.php

    class AliSMSDrv
    {
    
        /**
         * 发送验证码
         * @param $account
         * @param $msg
         * @return bool|mixed
         */
        public function sendCode($account,$msg)
        {
            $response = $this->sendSMS($account,array('msgno'=>$msg));
            return $response;
        }
    
        /**
         * 通用
         * @param $mobile   手机号
         * @param $data     数据格式
         * $data = array('key1'=>'value1','key2'=>'value2', …… )
         * @param string $templateCode  短信模板Code
         * @return bool
         */
        public static function sendSMS($mobile, $data, $templateCode='你的模板id') {
    
            $aliSms = new AliSms();
            $response = $aliSms->sendSms($mobile,$templateCode, $data);
            if($response->Message == 'OK'){
                return true;
            }else {
                return false;
            }
    
        }
    
    }
    
    

    接着在需要使用的地方调用

    验证码业务逻辑层

    <?php
    /**
     * 验证码业务逻辑层
     * Created by PhpStorm.
     * User: Administrator
     * Date: 2018/12/26
     * Time: 10:12
     */
    namespace App\Services;
    use App\Models\ValidateCode;
    use App\Models\User;
    use App\Driver\AliSMSDrv;
    use App\Exceptions\WrongException;
    
    class ValidateCodeService extends BaseModelService {
        const PHONE_VALIDATE = 'phone';//获取手机验证码
        private $phone_driver = AliSMSDrv::class;
        protected static function getModel()
        {
            return ValidateCode::class;
        }
        /**
         * 生成随机的短信验证码,修改验证码长度在AppServiceProvider中验证码拓展校验
         */
        private function genValidateCode()
        {
            return mt_rand(000000,999999);
        }
        /**
         * 获取验证码
         */
        public function  getCode($account,$type)
        {
            //生成随机的验证码
            $code = $this->genValidateCode();
            //发送验证码
            $driver = new $this->phone_driver();
            $result = $driver->sendCode($account,$code);
            if (!$result) {
                throw new WrongException('发送失败');
            }
            //删除旧的验证码
            ValidateCode::where(['account'=>$account,'v_type'=>$type])->delete();
            //发送成功后将验证码保存到数据库
            $validate_code = new ValidateCode();
            $validate_code->account = $account;
            $validate_code->v_type = $type;
            $validate_code->send_time = time();
            $validate_code->v_code = $code;
            if(!$validate_code->save()){
                throw new WrongException('发送验证码失败');
            }
            return $code;
        }
     
        /**
         * 验证验证码是否正确
         */
        public function checkCode($mobile,$v_code)
        {
            $limit_secords = 900 + time();
            $record = ValidateCode::where('send_time','<',$limit_secords)
                ->where('account', '=', $mobile)
                ->orderBy('v_id','desc')
                ->first();
            if($record){
                if ($record->v_times >= 5) {
                    throw new WrongException('请重新获取验证码');
                }
                $record->v_times = $record->v_times + 1;
                $record->save();
                if($record->v_code == $v_code){
                    ValidateCode::destroy($record->v_id);
                    return true;
                }
            }
            throw new WrongException('验证码错误');
        }
    }
    

    相关文章

      网友评论

        本文标题:Laravel 使用阿里云短信发送验证码

        本文链接:https://www.haomeiwen.com/subject/xdbmjqtx.html