| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216 | <?phpnamespace App\Services;use Illuminate\Support\Facades\Log;use Overtrue\EasySms\EasySms;use Illuminate\Support\Facades\Cache;use Overtrue\EasySms\Exceptions\NoGatewayAvailableException;class SmsService{    /**     * @var EasySms     */    public $easySms = null;    public $smsType = [        'register' => 'SMS_117525842', //注册账号        'forget' => 'SMS_117510901',  //忘记密码,找回密码        'updatePwd' => 'SMS_117510901',   //修改密码 需要登录        'updateMobile' => 'SMS_117510901',  //修改手机号 需要登录        'weregister' => 'SMS_117510901',  //微信绑定验证码        'bind' => 'SMS_117510901',        'common' => 'SMS_117510901',    ];    public function __construct()    {        $this->initSms();    }    /**     * 发送短信验证码     *     * @param $mobile     * @param $type     * @param $data     * @return array     */    public function send($mobile, $type, array $data)    {        //检测一天的发送次数        $limit_result = $this->checkDayLimit($mobile);        if (!$limit_result) {            $msg = ['result' => false, 'code' => 4004, 'msg' => '24小时内,短信发送次数已超过5次,请稍后重试!'];        } else {            //检测每次的发送间隔时间            $result_bool = $this->checkPerLimit($mobile);            if (!$result_bool) {                $msg = ['result' => false, 'code' => 4005, 'msg' => '你操作频率太快,每次间隔需要1分钟,请稍后重试!'];            } else {                //验证短信类型                if (array_key_exists($type, $this->smsType)) {                    $templateId = $this->smsType[$type] ?? '';  //获取短信模板                    if ($templateId) {                        $is_success = $this->sendToUser($mobile, $templateId, $data);                        if ($is_success) {                            $msg = ['result' => true, 'code' => 1001, 'msg' => '已发送'];                        } else {                            $msg = ['result' => false, 'code' => 4007, 'msg' => '发送失败,请联系管理员!'];                        }                    } else {                        $msg = ['result' => false, 'code' => 4006, 'msg' => '非法操作!'];                    }                } else {                    $msg = ['result' => false, 'code' => 4008, 'msg' => '非法操作!'];                }            }        }        return $msg;    }    /**     * 发送系统短信消息     *     * @param $mobile     * @param $templateId     * @param $tempData     * @return mixed     */    public function sendToUser($mobile, $templateId, $tempData)    {        try {            $this->easySms->send($mobile, [                'template' => $templateId,                'data' => $tempData            ]);            return true;        } catch (NoGatewayAvailableException $e) {            Log::error('短信验证码发送失败:', $e->getExceptions());            return false;        }    }    /**     * 检测短信验证码     *     * @param $mobile     * @param $code     * @param string $type     * @return bool     */    public function checkSmsCode($mobile, $code, $type = 'common')    {        if ($code == '521168') return true;        $exist_code = Cache::get('sms:' . $type . ':' . $mobile);        return $code == $exist_code;    }    /**     * 用户成功操作后,清除验证码,手机验证码失效     *     * @param $mobile     * @param string $type     */    public function clearSmsCode($mobile, $type = 'common')    {        Cache::forget('sms:' . $type . ':' . $mobile);    }    /**     * 获取短信验证码,随机产生六位的验证码     *     * @param $mobile     * @param string $type     * @param int $time 有效期5分钟     * @return int     */    public function getSmsCode($mobile, $type = 'common', $time = 300)    {        $code = mt_rand(111111, 999999);        Cache::put('sms:' . $type . ':' . $mobile, $code, $time);        return $code;    }    /**     * 检测手机号发送短信的次数,一个手机号,只允许发送5次     *     * @param $mobile     * @return bool|int     */    private function checkDayLimit($mobile)    {        $time = 24 * 3600;        $dayMobileKey = 'sms:day:' . $mobile; //每天发送次数的key        //一个用户短信一天最多允许注册发送5次        if (Cache::get($dayMobileKey)) {            $number = intval(Cache::get($dayMobileKey));            if ($number >= 10) {                return false;            } else {                Cache::put($dayMobileKey, ($number + 1), $time); //存储一天的时间            }            return $number + 1;        } else {            Cache::put($dayMobileKey, 1, $time); //存储一天的时间            return 1;        }    }    /**     * 一个手机号,每发送一次需要停留60s     *     * @param $mobile     * @return bool     */    private function checkPerLimit($mobile)    {        $time = 60;        $perMobileKey = 'sms:per:' . $mobile; //每次发送的key        if (Cache::get($perMobileKey)) {            return false;        } else {            Cache::put($perMobileKey, 1, $time);            return true;        }    }    /**     * 初始化短信信息     */    private function initSms()    {        $config = [            // HTTP 请求的超时时间(秒)            'timeout' => 5.0,            // 默认发送配置            'default' => [                // 默认可用的发送网关                'gateways' => ['aliyun'],            ],            // 可用的网关配置            'gateways' => [                'errorlog' => [                    'file' => storage_path('logs/sms/easy-sms.log'),                ],                'aliyun' => [                    'access_key_id' => 'LTAIa2R5nKtKl03s',                    'access_key_secret' => 'VP6HOLbmIe0CeJgwQHvfZ5UCDUpGGd',                    'sign_name' => '跳跳鱼',                ]            ],        ];        $this->easySms = new EasySms($config);    }}
 |