|
@@ -7,6 +7,7 @@ import com.miaxis.common.constant.SmsTemplateConstants;
|
|
|
import com.miaxis.common.core.domain.Response;
|
|
|
import com.miaxis.common.core.domain.ResponseEnum;
|
|
|
import com.miaxis.common.sms.Client;
|
|
|
+import com.miaxis.common.utils.RedisPrefixUtils;
|
|
|
import org.springframework.beans.factory.annotation.Autowired;
|
|
|
import org.springframework.beans.factory.annotation.Value;
|
|
|
import org.springframework.data.redis.core.RedisTemplate;
|
|
@@ -31,7 +32,7 @@ public class SmsServiceImpl implements ISmsService {
|
|
|
private final String MOBILE_REGEX = "^((13[0-9])|(14[0-9])|(15[0-9])|(17[0-9])|(18[0-9])|(19[0-9]))\\d{8}$";//手机号码验证
|
|
|
private final Integer SMS_MAX_COUNT = 500 ;//每天系统发送最大次数(预留)
|
|
|
private final Integer MAX_COUNT = 5 ;//每个手机号验证发送最大次数
|
|
|
- private final long SEND_INTERVAL = 2 ;//发送间隔时间
|
|
|
+ private final long SEND_INTERVAL = 3 ;//发送间隔时间
|
|
|
|
|
|
|
|
|
@Value("${sms_user_name}")
|
|
@@ -74,7 +75,22 @@ public class SmsServiceImpl implements ISmsService {
|
|
|
}
|
|
|
try{
|
|
|
|
|
|
- //验证手机号
|
|
|
+ //生成redis 验证码key前缀 验证次数key前缀
|
|
|
+ Map<String, String> map = RedisPrefixUtils.smsRedisPrefix(smsParameter.getType(), smsParameter.getPhone());
|
|
|
+ smsParameter.setKeyPrefix(map.get("keyPrefix"));
|
|
|
+ smsParameter.setVerificationCount(map.get("smsKeyCountPrefix"));
|
|
|
+
|
|
|
+ if ("login".equals(smsParameter.getType())){
|
|
|
+ smsParameter.setSmsTemplateConstants(SmsTemplateConstants.login);
|
|
|
+ }
|
|
|
+ if ("signUp".equals(smsParameter.getType())){
|
|
|
+ smsParameter.setSmsTemplateConstants(SmsTemplateConstants.signUp);
|
|
|
+ }
|
|
|
+ if ("modify".equals(smsParameter.getType())){
|
|
|
+ smsParameter.setSmsTemplateConstants(SmsTemplateConstants.modify);
|
|
|
+ }
|
|
|
+
|
|
|
+ //验证缓存信息
|
|
|
Response resultJson = validateMobile(smsParameter);
|
|
|
if("500".equals(resultJson.getCode().toString())) {
|
|
|
return resultJson;
|
|
@@ -145,14 +161,14 @@ public class SmsServiceImpl implements ISmsService {
|
|
|
*/
|
|
|
private Response validateMobile(SmsParameter smsParameter){
|
|
|
|
|
|
- if(redisTemplate.hasKey(smsParameter.getVerificationCount() + smsParameter.getPhone())){
|
|
|
+ if(redisTemplate.hasKey(smsParameter.getVerificationCount())){
|
|
|
// 验证发送时间
|
|
|
- if (redisTemplate.hasKey(smsParameter.getKeyPrefix() + smsParameter.getPhone())){
|
|
|
+ if (redisTemplate.hasKey(smsParameter.getKeyPrefix())){
|
|
|
return Response.error(500,"验证码还未过期,不能重新发送!");
|
|
|
}
|
|
|
|
|
|
// 验证发送次数
|
|
|
- Integer count = Integer.valueOf(redisTemplate.opsForValue().get(smsParameter.getVerificationCount() + smsParameter.getPhone()).toString());
|
|
|
+ Integer count = Integer.valueOf(redisTemplate.opsForValue().get(smsParameter.getVerificationCount()).toString());
|
|
|
if(count >= MAX_COUNT) {
|
|
|
return Response.error(500,"当前手机号发送验证码次数过多!");
|
|
|
}
|
|
@@ -169,25 +185,25 @@ public class SmsServiceImpl implements ISmsService {
|
|
|
private void writeCache(String code,SmsParameter smsParameter){
|
|
|
|
|
|
//该手机号首次获取验证码
|
|
|
- if(!redisTemplate.hasKey(smsParameter.getKeyPrefix() + smsParameter.getPhone()) && !redisTemplate.hasKey(smsParameter.getVerificationCount() + smsParameter.getPhone())){
|
|
|
+ if(!redisTemplate.hasKey(smsParameter.getKeyPrefix()) && !redisTemplate.hasKey(smsParameter.getVerificationCount())){
|
|
|
synchronized(this){
|
|
|
//设置该手机号验证码 两分钟过期
|
|
|
- redisTemplate.opsForValue().set(smsParameter.getKeyPrefix() + smsParameter.getPhone() , code, SEND_INTERVAL, TimeUnit.MINUTES);
|
|
|
+ redisTemplate.opsForValue().set(smsParameter.getKeyPrefix() , code, SEND_INTERVAL, TimeUnit.MINUTES);
|
|
|
//设置该手机号验证次数 一天过期
|
|
|
- redisTemplate.opsForValue().set(smsParameter.getVerificationCount() + smsParameter.getPhone() , "1",1,TimeUnit.DAYS);
|
|
|
+ redisTemplate.opsForValue().set(smsParameter.getVerificationCount() , "1",1,TimeUnit.DAYS);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
//多次获取验证码
|
|
|
- if (redisTemplate.hasKey(smsParameter.getVerificationCount() + smsParameter.getPhone()) && !redisTemplate.hasKey(smsParameter.getKeyPrefix() + smsParameter.getPhone())){
|
|
|
+ if (redisTemplate.hasKey(smsParameter.getVerificationCount()) && !redisTemplate.hasKey(smsParameter.getKeyPrefix())){
|
|
|
//判断该手机验证次数
|
|
|
- Integer count = Integer.valueOf(redisTemplate.opsForValue().get(smsParameter.getVerificationCount() + smsParameter.getPhone()).toString());
|
|
|
+ Integer count = Integer.valueOf(redisTemplate.opsForValue().get(smsParameter.getVerificationCount()).toString());
|
|
|
if (count < MAX_COUNT){
|
|
|
synchronized(this){
|
|
|
//该手机号验证次数+1 一天过期
|
|
|
- redisTemplate.opsForValue().set(smsParameter.getVerificationCount() + smsParameter.getPhone(),String.valueOf(count+1),1,TimeUnit.DAYS);
|
|
|
+ redisTemplate.opsForValue().set(smsParameter.getVerificationCount() ,String.valueOf(count+1),1,TimeUnit.DAYS);
|
|
|
//设置该手机号验证码 两分钟过期
|
|
|
- redisTemplate.opsForValue().set(smsParameter.getKeyPrefix() + smsParameter.getPhone() , code, SEND_INTERVAL, TimeUnit.MINUTES);
|
|
|
+ redisTemplate.opsForValue().set(smsParameter.getKeyPrefix() , code, SEND_INTERVAL, TimeUnit.MINUTES);
|
|
|
}
|
|
|
}
|
|
|
}
|