package cn.gistack.sm.sms.controller;
|
|
import cn.com.flaginfo.sdk.cmc.api.sms.dynsend.DynSMSSendRequest;
|
import cn.com.flaginfo.sdk.cmc.api.sms.send.SMSSendRequest;
|
import cn.gistack.sm.sms.entity.SmsRecord;
|
import cn.gistack.sm.sms.service.ISmsRecordService;
|
import cn.gistack.sm.sms.util.SmsUtils;
|
import cn.gistack.system.user.entity.User;
|
import cn.gistack.system.user.feign.IUserClient;
|
import lombok.AllArgsConstructor;
|
import lombok.extern.slf4j.Slf4j;
|
import org.springblade.core.redis.cache.BladeRedis;
|
import org.springblade.core.tool.api.R;
|
import org.springframework.web.bind.annotation.*;
|
|
import java.util.List;
|
import java.util.regex.Matcher;
|
import java.util.regex.Pattern;
|
import static cn.gistack.common.cache.CacheNames.PHONE_KEY;
|
|
/**
|
* 短信发送控制层
|
* @author zhongrj
|
* @date 2023-04-22
|
*/
|
@Slf4j
|
@RestController
|
@RequestMapping("/sms/sms")
|
@AllArgsConstructor
|
public class SmsController {
|
|
private final ISmsRecordService smsRecordService;
|
|
private final BladeRedis bladeRedis;
|
|
private final IUserClient userClient;
|
|
@GetMapping("/test")
|
public void setRedis(){
|
saveCodeForRedis("super_admin","123456");
|
}
|
|
/**
|
* 发送登录验证码
|
* request 必须包含手机号
|
* @param request
|
* @return
|
*/
|
@PostMapping("/sendCode")
|
public R test(@RequestBody SMSSendRequest request){
|
// 手机号码校验
|
if(validatePhone(request.getUserNumber())) {
|
//设置模板相关信息
|
String templateId = "2431012205498";
|
String randNumber = SmsUtils.getRandNumber();
|
String content = "您的登录验证码是" + randNumber + ",5分钟内有效,请勿泄漏,如非本人操作,请忽略此信息";
|
request.setMessageContent(content);
|
request.setTemplateId(templateId);
|
// 发送操作
|
String sendMsg = SmsUtils.sendMsg(request);
|
// 记录发送记录操作
|
saveSendRecord(request, sendMsg);
|
// 保存验证码到 redis
|
saveCodeForRedis(request.getUserNumber(), randNumber);
|
// 返回发送信息
|
return R.data(sendMsg);
|
}
|
// 返回发送信息
|
return R.fail(400,"该手机号不存在!");
|
}
|
|
/**
|
* 校验手机号码正确性
|
* @param userNumber
|
* @return
|
*/
|
private boolean validatePhone(String userNumber) {
|
// 校验手机号码正确性
|
if (validator(userNumber)){
|
// 校验该账户是否已注册,通过手机号查询用户是否存在,tenantId 暂时写死,未登陆情况 tenantId 获取不到
|
R<List<User>> list = userClient.userInfoByPhone("000000", userNumber);
|
if (list.getData().size()>0){
|
return true;
|
}
|
return false;
|
}
|
return false;
|
}
|
|
/**
|
* 校验手机号码
|
*/
|
public static boolean validator(String phone) {
|
String regex = "^((13[0-9])|(14[5,7,9])|(15([0-3]|[5-9]))|(166)|(17[0,1,3,5,6,7,8])|(18[0-9])|(19[8|9]))\\d{8}$";
|
if (phone.length() != 11) {
|
return false;
|
} else {
|
Pattern p = Pattern.compile(regex);
|
Matcher m = p.matcher(phone);
|
boolean isMatch = m.matches();
|
return isMatch;
|
}
|
}
|
|
/**
|
* 保存验证码到 redis
|
* @param userNumber
|
* @param randNumber
|
*/
|
private void saveCodeForRedis(String userNumber, String randNumber) {
|
bladeRedis.setEx(PHONE_KEY + userNumber,randNumber,5*60L);
|
}
|
|
/**
|
* 发送记录保存
|
* @param request 发送信息
|
* @param sendMsg 响应数据
|
*/
|
private void saveSendRecord(SMSSendRequest request, String sendMsg) {
|
SmsRecord smsRecord = new SmsRecord();
|
smsRecord.setPhone(request.getUserNumber());
|
smsRecord.setContent(request.getMessageContent());
|
smsRecord.setTemplateId(request.getTemplateId());
|
smsRecord.setResContent(sendMsg);
|
//插入记录
|
smsRecordService.save(smsRecord);
|
}
|
|
@PostMapping("/test1")
|
public R test1(@RequestBody DynSMSSendRequest request){
|
return R.data(SmsUtils.dynSendMethod(request));
|
}
|
}
|