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.entity.SmsRequest; 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 com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; 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.Arrays; 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); JSONObject jsonObject = JSON.parseObject(sendMsg); // 记录发送记录操作 saveSendRecord(request, sendMsg); // 保存验证码到 redis saveCodeForRedis(request.getUserNumber(), randNumber); // 返回发送信息 return R.data(jsonObject); } // 返回发送信息 return R.fail(400,"该手机号不存在!"); } /** * 校验手机号码正确性 * @param userNumber * @return */ private boolean validatePhone(String userNumber) { // 校验手机号码正确性 if (validator(userNumber)){ // 校验该账户是否已注册,通过手机号查询用户是否存在,tenantId 暂时写死,未登陆情况 tenantId 获取不到 R> list = userClient.userInfoByPhoneOrAccount("000000", userNumber); if (list.getData().size()>0){ return true; } return false; } return false; } /** * 校验手机号码 */ public static boolean validator(String phone) { if (null!=phone && !phone.equals("")) { 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; } } return false; } /** * 保存验证码到 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); } /** * 发送邮件提醒 * @param smsRequest * @return */ @PostMapping("/sendEmailMsg") public R sendEmailMsg(@RequestBody SmsRequest smsRequest){ // 处理数据(可能是多个手机号情况) List list = Arrays.asList(smsRequest.getPhone().split(",")); // 遍历 for (String phone : list) { DynSMSSendRequest dynSMSSendRequest = new DynSMSSendRequest(); dynSMSSendRequest.setTemplateId("2431012165299"); dynSMSSendRequest.setDynData(new String[][]{{"手机号码", "标题"}, {phone, smsRequest.getContent()}}); // 手机号校验 if(validator(phone)) { // 发送邮件短信 String dynSendMsg = SmsUtils.dynSendMethod(dynSMSSendRequest); // 记录保存 SMSSendRequest request = new SMSSendRequest(); request.setUserNumber(phone); request.setMessageContent(smsRequest.getContent()); request.setTemplateId(dynSMSSendRequest.getTemplateId()); // 记录发送记录操作 saveSendRecord(request, dynSendMsg); }else { // 手机号有误记录 // 记录保存 SMSSendRequest request = new SMSSendRequest(); request.setUserNumber(phone); request.setMessageContent(smsRequest.getContent()); request.setTemplateId(dynSMSSendRequest.getTemplateId()); // 记录发送记录操作 saveSendRecord(request, "手机号错误未发送..."); } } return R.status(true); } }