sms整合 阿里云发送短信校验短信
发送短信工具类
package com.huhu.smscenter.utils;
import com.aliyuncs.DefaultAcsClient;
import com.aliyuncs.IAcsClient;
import com.aliyuncs.dysmsapi.model.v20170525.SendSmsRequest;
import com.aliyuncs.dysmsapi.model.v20170525.SendSmsResponse;
import com.aliyuncs.exceptions.ClientException;
import com.aliyuncs.http.MethodType;
import com.aliyuncs.profile.DefaultProfile;
import com.aliyuncs.profile.IClientProfile;
import com.huhu.smscenter.constant.SmsConstant;
import java.io.InputStream;
import java.util.Properties;
/**
* 发送短信工具类
*
* @Package: PACKAGE_NAME
* @ClassName: SmsUtil
* @author: 7
* @date: 2022/1/16 12:35
*/
public class SmsUtil {
/**
* 发送短信
*
* @param phoneNumbers 手机号
* @param param 验证码
* @throws ClientException
*/
public static void sendShortMessage(String phoneNumbers, String param) throws Exception {
// TODO: 2022/1/18 从配置文件读取 Smscenter配置
Properties dbProps = new Properties();
//使用类加载器取加载配置文件
InputStream is = SmsUtil.class.getResourceAsStream(SmsConstant.classpath);
dbProps.load(is);
//获取配置
String accesskeyid = dbProps.getProperty(SmsConstant.accessKeyId);
String accessKeySecret = dbProps.getProperty(SmsConstant.accessKeySecret);
String area = dbProps.getProperty(SmsConstant.area);
String domain = dbProps.getProperty(SmsConstant.domain);
String product = dbProps.getProperty(SmsConstant.product);
//由于中文会乱码所以处理中文乱码
String signame = dbProps.getProperty(SmsConstant.signName);
//设置签名设置模板
String templateCode = dbProps.getProperty(SmsConstant.templateCode);
// 设置超时时间
System.setProperty("sun.net.client.defaultConnectTimeout", "10000");
System.setProperty("sun.net.client.defaultReadTimeout", "10000");
// 初始化ascClient
IClientProfile profile = DefaultProfile.getProfile(area, accesskeyid, accessKeySecret);
DefaultProfile.addEndpoint(area, area, product, domain);
IAcsClient acsClient = new DefaultAcsClient(profile);
// 组装请求对象
SendSmsRequest request = new SendSmsRequest();
// 使用post提交
request.setMethod(MethodType.POST);
request.setPhoneNumbers(phoneNumbers);
// 短信签名
request.setSignName(signame);
// 短信模板
request.setTemplateCode(templateCode);
request.setTemplateParam("{\"code\":\"" + param + "\"}");
SendSmsResponse sendSmsResponse = acsClient.getAcsResponse(request);
if (sendSmsResponse.getCode() != null && "OK".equals(sendSmsResponse.getCode())) {
// 请求成功
System.out.println("发送成功!");
} else {
System.err.println("发送失败!" + sendSmsResponse.getMessage());
}
}
}
Controller层:
sms整合 阿里云发送短信校验短信
Controller层:
/**
* @Package: com.huhu.login.controller
* @ClassName: LoginController
* @author: 7
* @date: 2022/1/17 11:26
*/
@Slf4j
@Controller()
@RequestMapping("/smscenter")
public class SmsController {
/**
* 短信业务层
*/
@Autowired
private SmsService smsService;
/**
* 判断用户是否是第一次登录
*
* @param smsDto
* @return
*/
@RequestMapping("/isfirstlogin")
@ResponseBody
public ResponseEntity isFirstlogin(@RequestBody() SmsDto smsDto) {
if (null == smsDto) {
return (ResponseEntity) ResponseEntity.status(HttpStatus.HTTP_BAD_REQUEST);
}
return smsService.isfirst(smsDto);
}
/**
* 发送验证码
*
* @param smsDto
* @return
*/
@RequestMapping("/sendVerificationCode")
@ResponseBody
public ResponseEntity sendVerificationCode(@RequestBody SmsDto smsDto) throws Exception {
if (smsDto == null) {
ResponseEntity.status(HttpStatus.HTTP_BAD_REQUEST);
}
return smsService.sendVerificationCode(smsDto);
}
/**
* @param phone 手机号
* @param checkCode 验证码
* @return
*/
@RequestMapping("/verificationCode")
@ResponseBody
public ResponseEntity verificationCode(@RequestParam("phone") String phone, @RequestParam("checkCode") String checkCode) {
if (phone == null && checkCode == null) {
ResponseEntity.status(HttpStatus.HTTP_BAD_REQUEST);
}
return smsService.verificationCode(phone, checkCode);
}
}
Service接口层:
/**
* @Package: com.huhu.login.service
* @InterfaceName: SmsService
* @author: 7
* @date: 2022/1/17 14:59
*/
public interface SmsService {
/**
* 发送验证码
*
* @param smsDto
* @return
*/
ResponseEntity sendVerificationCode(SmsDto smsDto) throws Exception;
/**
* 是否是第一次登录
*
* @param smsDto
* @return
*/
ResponseEntity isfirst(SmsDto smsDto);
/**
* 校验验证码
*
* @param phone
* @param checkCode
* @return
*/
ResponseEntity verificationCode(String phone, String checkCode);
}
Service接口层:
/**
* @Package: com.huhu.login.service
* @InterfaceName: SmsService
* @author: 7
* @date: 2022/1/17 14:59
*/
public interface SmsService {
/**
* 发送验证码
*
* @param smsDto
* @return
*/
ResponseEntity sendVerificationCode(SmsDto smsDto) throws Exception;
/**
* 是否是第一次登录
*
* @param smsDto
* @return
*/
ResponseEntity isfirst(SmsDto smsDto);
/**
* 校验验证码
*
* @param phone
* @param checkCode
* @return
*/
ResponseEntity verificationCode(String phone, String checkCode);
}
ServiceImpl 实现层
Serviceimpl业务层:
利用Session设置 短信验证码的过期时间
/**
* @Package: com.huhu.login.service.impl
* @ClassName: SmsServiceImpl
* @author: 7
* @date: 2022/1/17 15:01
*/
@SuppressWarnings("all")
@Service
public class SmsServiceImpl implements SmsService {
@Autowired
private SmsLoginDao smsloginDao;
private Map<String, String> map = new HashMap<>();
private Session session = null;
/**
* 是否是第一次登录
*
* @param smsDto
* @return
*/
@Override
public ResponseEntity isfirst(SmsDto smsDto) {
Integer result = smsloginDao.findBydeviceId(smsDto.getDeviceId(), smsDto.getLoginType());
//不是空的 直接登录
return result <= NumberEnum.ZERO.getValue() ? ResponseEntity.ok(HttpStatus.HTTP_ACCEPTED) : ResponseEntity.ok(HttpStatus.HTTP_OK);
}
/**
* 发送短息
*
* @param smsDto
* @return
* @throws Exception
*/
@Override
public ResponseEntity sendVerificationCode(SmsDto smsDto) throws Exception {
session = SecurityUtils.getSubject().getSession(true);
//判断手机号格式是否正确
if (!PhoneUtils.validatePhoneNumber(smsDto.getPhone())) {
return ResponseEntity.ok(HttpStatus.HTTP_BAD_REQUEST);
}
Device device = new Device();
String code = PhoneUtils.getRandomNum().toString();
//将验证码存入sessionv 设置超时间一分钟
session.setAttribute(smsDto.getPhone(), code);
session.setTimeout(60000);
//发送验证码
SmsUtil.sendShortMessage(smsDto.getPhone(), code);
//设备标识入库
String s = "";
s = s.valueOf(SnowFlakeUtils.getFlowIdInstance().nextId());
device.setId(s);
device.setDeviceId(smsDto.getDeviceId());
device.setLoginType(smsDto.getLoginType());
device.setLogon_Time(new Date());
Boolean result = smsloginDao.saveDeviceIdInfo(device);
return result ? ResponseEntity.ok(HttpStatus.HTTP_OK) : ResponseEntity.ok("设备信息保存失败!");
}
/**
* 校验验证码
*
* @param phone 手机号
* @param checkCode 验证码
* @return
*/
@Override
public ResponseEntity verificationCode(String phone, String checkCode) {
String code = (String) session.getAttribute(phone);
if (null == code || !code.equals(checkCode)) {
return ResponseEntity.ok("验证码错误或者 session中的验证码已失效!");
}
//校验完毕删除Session中的验证码
session.removeAttribute(phone);
return ResponseEntity.ok(HttpStatus.HTTP_OK);
}
}
Dao层 保存数据
/**
* @Package: com.huhu.login.dao
* @ClassName: SmsDao
* @author: 7
* @date: 2022/1/17 15:23
*/
@MyBatisDao
public interface SmsLoginDao extends CrudDao<Device> {
Integer findBydeviceId(@Param("deviceId") String deviceId, @Param("loginType") Integer loginType);
Boolean saveDeviceIdInfo(Device device);
}