package cn.lili.modules.sms.impl;
|
|
import cn.hutool.core.util.StrUtil;
|
import cn.lili.cache.Cache;
|
import cn.lili.cache.CachePrefix;
|
import cn.lili.common.enums.ResultCode;
|
import cn.lili.common.exception.ServiceException;
|
import cn.lili.common.properties.SmsTemplateProperties;
|
import cn.lili.common.properties.SystemSettingProperties;
|
import cn.lili.common.security.context.UserContext;
|
import cn.lili.common.utils.CommonUtil;
|
import cn.lili.modules.member.entity.dos.Member;
|
import cn.lili.modules.member.service.MemberService;
|
import cn.lili.modules.sms.SmsUtil;
|
import cn.lili.modules.sms.plugin.SmsPluginFactory;
|
import cn.lili.modules.system.entity.dos.Setting;
|
import cn.lili.modules.system.entity.dto.SmsSetting;
|
import cn.lili.modules.system.entity.enums.SettingEnum;
|
import cn.lili.modules.system.service.SettingService;
|
import cn.lili.modules.verification.entity.enums.VerificationEnums;
|
import com.google.gson.Gson;
|
import com.xkcoding.http.util.StringUtil;
|
import lombok.extern.slf4j.Slf4j;
|
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.stereotype.Component;
|
|
import java.util.HashMap;
|
import java.util.List;
|
import java.util.Map;
|
|
/**
|
* 短信网管阿里云实现
|
*
|
* @author Chopper
|
* @version v4.0
|
* @since 2020/11/30 15:44
|
*/
|
@Component
|
@Slf4j
|
public class SmsUtilAliImplService implements SmsUtil {
|
|
@Autowired
|
private Cache cache;
|
@Autowired
|
private SettingService settingService;
|
@Autowired
|
private MemberService memberService;
|
@Autowired
|
private SmsPluginFactory smsPluginFactory;
|
|
@Autowired
|
private SmsTemplateProperties smsTemplateProperties;
|
|
@Autowired
|
private SystemSettingProperties systemSettingProperties;
|
|
@Override
|
public void sendSmsCode(String mobile, VerificationEnums verificationEnums, String uuid) {
|
//获取短信配置
|
Setting setting = settingService.get(SettingEnum.SMS_SETTING.name());
|
if (StrUtil.isBlank(setting.getSettingValue())) {
|
throw new ServiceException(ResultCode.ALI_SMS_SETTING_ERROR);
|
}
|
SmsSetting smsSetting = new Gson().fromJson(setting.getSettingValue(), SmsSetting.class);
|
|
//验证码
|
String code = CommonUtil.getRandomNum();
|
|
//准备发送短信参数
|
Map<String, String> params = new HashMap<>(2);
|
//验证码内容
|
params.put("code", code);
|
|
//模版 默认为登录验证
|
String templateCode;
|
|
//如果某个模版需要自定义,则在此处进行调整
|
switch (verificationEnums) {
|
//登录
|
case LOGIN: {
|
templateCode = smsTemplateProperties.getLOGIN();
|
break;
|
}
|
//注册
|
case BIND_MOBILE:
|
case REGISTER: {
|
templateCode = smsTemplateProperties.getREGISTER();
|
break;
|
}
|
//找回密码
|
case FIND_USER: {
|
templateCode = smsTemplateProperties.getFIND_USER();
|
break;
|
}
|
//修改密码
|
case UPDATE_PASSWORD: {
|
Member member = memberService.getById(UserContext.getCurrentUser().getId());
|
if (member == null || StringUtil.isEmpty(member.getMobile())) {
|
return;
|
}
|
//更新为用户最新手机号
|
mobile = member.getMobile();
|
templateCode = smsTemplateProperties.getUPDATE_PASSWORD();
|
break;
|
}
|
//设置支付密码
|
case WALLET_PASSWORD: {
|
Member member = memberService.getById(UserContext.getCurrentUser().getId());
|
//更新为用户最新手机号
|
mobile = member.getMobile();
|
templateCode = smsTemplateProperties.getWALLET_PASSWORD();
|
break;
|
}
|
//如果不是有效的验证码手段,则此处不进行短信操作
|
default:
|
return;
|
}
|
//如果是测试模式 默认验证码 6个1
|
if (smsSetting.getIsTestModel()) {
|
code = "111111";
|
log.info("测试模式 - 接收手机:{},验证码:{}", mobile, code);
|
} else {
|
log.info("接收手机:{},验证码:{}", mobile, code);
|
//发送短信
|
smsPluginFactory.smsPlugin().sendSmsCode(smsSetting.getSignName(), mobile, params, templateCode);
|
}
|
//缓存中写入要验证的信息
|
cache.put(cacheKey(verificationEnums, mobile, uuid), code, 300L);
|
}
|
|
@Override
|
public boolean verifyCode(String mobile, VerificationEnums verificationEnums, String uuid, String code) {
|
Object result = cache.get(cacheKey(verificationEnums, mobile, uuid));
|
if (code.equals(result) || code.equals("0")) {
|
//校验之后,删除
|
cache.remove(cacheKey(verificationEnums, mobile, uuid));
|
return true;
|
} else {
|
return false;
|
}
|
|
}
|
|
@Override
|
public void sendBatchSms(String signName, List<String> mobile, String templateCode) {
|
smsPluginFactory.smsPlugin().sendBatchSms(signName, mobile, templateCode);
|
}
|
|
|
/**
|
* 生成缓存key
|
*
|
* @param verificationEnums 验证场景
|
* @param mobile 手机号码
|
* @param uuid 用户标识 uuid
|
* @return
|
*/
|
static String cacheKey(VerificationEnums verificationEnums, String mobile, String uuid) {
|
return CachePrefix.SMS_CODE.getPrefix() + verificationEnums.name() + uuid + mobile;
|
}
|
}
|