class Sms {
const EXPIRE_SEC = 300; // 过期时间间隔 5分钟
const RESEND_SEC = 60; // 重发时间间隔
const ONE_DAY_FREQ = 10; // 每日向同一个手机号发短信的次数
public $error = '';
protected $sms_status = array(
"0" => "短信发送成功",
"-1" => "参数不全",
);
/**
* 向指定手机号发送验证码
* @param $phone
* @param $imei
* @return bool
*/
public function sendVerifyCode($phone, $sendtype) {
if (!$this->isMobile($phone)) {
$this->error = '这个手机号很奇葩哦,请正确输入后重试';
return false;
}
$where['phone'] = $phone;
$start = strtotime(date('Y-m-d 00:00:00'));
$where['createtime'] = ['between', [$start, time()]];
$list = SmsModel::getAll('id, expiretime, createtime', $where, 'id desc');
// 验证码重发限制
if($list) {
$data = $list[0];
if ((time() > $data['createtime']) && (time() < ($data['createtime'] + self::RESEND_SEC))) {
$this->error = '短信已在1分钟内发出,请耐心等待';
return false;
}
}
$imeiCnt = count($list);
if ($imeiCnt >= self::ONE_DAY_FREQ) {
$this->error = '当日已超过验证码发送设备限制';
return false;
}
// 获取验证码
$vc = strval(rand(1000, 9999));
$expire_min = self::EXPIRE_SEC / 60;
switch ($sendtype) {
case '1':
$content = '【xxxx】你的注册验证码是:'.$vc.',在'.$expire_min.'分钟内有效。请勿告知他人。';
break;
case '2':
$content = '【xxxx】你的找回密码验证码是:'.$vc.',在'.$expire_min.'分钟内有效。请勿告知他人。';
break;
default:
$this->error = '发送验证码类型错误';
return false;
break;
}
$result = $this->send($phone, $content);
if ($result != '') {
if($result == 0) {
$save_res = $this->saveSmsInfo($phone, $content, $vc);
if($save_res) {
return true;
}
}else{
$this->error = $this->sms_status[$result];
return false;
}
}
$this->error = '发送失败';
return false;
}
/**
* 向指定手机号发送短信
* @param $phone
* @param $content
* @return bool
*/
public function send($phone, $content) {
// TODO 调用具体服务商API
}
/**
* [saveSmsInfo 保存短信信息]
* @param [type] $phone [手机号]
* @param [type] $content [内容]
* @param [type] $verifycode [验证码]
* @return [type] [bool]
*/
private function saveSmsInfo($phone, $content, $verifycode) {
$data = [
'phone' => $phone,
'content' => $content,
'verifycode' => $verifycode,
'ip' => request()->ip(),
'createtime' => time(),
'expiretime' => time() + self::EXPIRE_SEC,
];
return SmsModel::addData($data);
}
/**
* 判断是否为合法手机号
* @param $phone
* @return bool
*/
private function isMobile($phone) {
if (preg_match('/^1\d{10}$/', $phone)) return true;
return false;
}
/**
* 验证短信验证码
* @param $phone
* @param $vc
* @return bool
*/
public function checkVerifyCode($phone, $verifycode) {
$vcData = SmsModel::where(['phone' => $phone])->field('verifycode, expiretime')->order('id desc')->find();
if ($vcData && $vcData->verifycode == $verifycode) {
if($vcData->expiretime >= time()) {
return true;
}
}
return false;
}
}