package com.kidgrow.sms.lanchuang.controller; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; import com.kidgrow.common.model.ResultBody; import com.kidgrow.common.utils.DateUtils; import com.kidgrow.redis.util.RedisUtils; import com.kidgrow.sms.util.SmsChuangLanUtils; import io.swagger.annotations.Api; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import java.util.*; @RestController @RequestMapping("smsChangLan") @Api(tags = "创蓝短信模块") public class SmsChuangLanController { @Value("${chuanglan.sms.sendUrl}") private String CHUANGLAN_SMS_SENDURL; @Value("${chuanglan.sms.account}") private String CHUANGLAN_SMS_ACCOUNT; @Value("${chuanglan.sms.password}") private String CHUANGLAN_SMS_PASSWORD; @Value("${chuanglan.sms.num}") private Integer CHUANGLAN_SMS_NUM; @Value("${chuanglan.sms.timeLimit}") private Integer CHUANGLAN_SMS_TIMELIMIT; @Autowired private RedisUtils redisUtils; /** * type 为类型, "type":"LOGIN_SMS" 为登录,"type":"PASSWORD_SMS" 为密码找回,"type":"REGISTER_SMS" 为 * @param map * @return */ @PostMapping("send") public ResultBody sendVerificationCode(@RequestBody Map map) { if(CHUANGLAN_SMS_NUM==null){ CHUANGLAN_SMS_NUM=5; } Object phone = map.get("phone"); if (map.get("phone")==null||"".equals(map.get("phone"))){ return ResultBody.failed("请输入手机号"); } Object type = map.get("type"); if (map.get("type")==null||"".equals(map.get("type"))){ return ResultBody.failed("请输入保存的类型"); } String verificationCode=""; Random random=new Random(); for (int i = 0; i < 6; i++) { int i1 = random.nextInt(9); verificationCode+=i1; } try { //组装发送消息的内容 map.put("account", CHUANGLAN_SMS_ACCOUNT);//API账号 map.put("password", CHUANGLAN_SMS_PASSWORD);//API密码 map.put("report","false"); map.put("msg","您好,您的验证码是"+verificationCode); //在Redis中获取 Object hget = redisUtils.hget(map.get("type").toString(), map.get("phone").toString()); JSONObject jsonObject =new JSONObject(); Map cunMap=new HashMap<>(); cunMap.put("verificationCode",verificationCode); cunMap.put("count",CHUANGLAN_SMS_NUM);//总共 if(hget==null){ String send = SmsChuangLanUtils.send(map, CHUANGLAN_SMS_SENDURL); jsonObject=JSON.parseObject(send); String s1 = DateUtils.formatCurrentDateTime(); cunMap.put("date",s1); cunMap.put("remnant",CHUANGLAN_SMS_NUM-1);//剩余 Date date2 = DateUtils.addMilliseconds(DateUtils.parseDate(s1), CHUANGLAN_SMS_TIMELIMIT); cunMap.put("endTime",DateUtils.formatDateTime(date2)); }else { JSONObject redisJson = JSON.parseObject(JSON.toJSONString(hget)); Object remnantObject = redisJson.get("remnant"); if(remnantObject instanceof Integer){ Integer remnant=(Integer)remnantObject; if(remnant>0){ String send = SmsChuangLanUtils.send(map, CHUANGLAN_SMS_SENDURL); jsonObject=JSON.parseObject(send); String s1 = DateUtils.formatCurrentDateTime(); cunMap.put("date",DateUtils.formatCurrentDateTime()); cunMap.put("remnant",remnant-1);//剩余 Date date2 = DateUtils.addMilliseconds(DateUtils.parseDate(s1), CHUANGLAN_SMS_TIMELIMIT); cunMap.put("endTime",DateUtils.formatDateTime(date2)); }else{ return ResultBody.failed().data("每个手机号限用"+CHUANGLAN_SMS_NUM+"次"); } }else { return ResultBody.failed(); } } if ("0".equals(jsonObject.get("code"))) { redisUtils.hset(map.get("type").toString(), map.get("phone").toString(),cunMap,DateUtils.getSecondsNextEarlyMorning()); // return ResultBody.ok().data(verificationCode); return ResultBody.ok(); } else { return ResultBody.failed(); } } catch (Exception e) { e.printStackTrace(); return ResultBody.failed(); } } @PostMapping("verification") public ResultBody verification(@RequestBody Map map){ Object phone = map.get("phone"); if (map.get("phone")==null||"".equals(map.get("phone"))){ return ResultBody.failed("请输入手机号"); } Object verificationCode = map.get("verificationCode"); if (map.get("verificationCode")==null||"".equals(map.get("verificationCode"))){ return ResultBody.failed("请输入保存的类型"); } Object type = map.get("type"); if (map.get("type")==null||"".equals(map.get("type"))){ return ResultBody.failed("请输入保存的类型"); } Object hget = redisUtils.hget(map.get("type").toString(), map.get("phone").toString()); if(hget!=null){ JSONObject redisJson = JSON.parseObject(JSON.toJSONString(hget)); Object verificationCodeObject = redisJson.get("verificationCode"); if(verificationCode.equals(verificationCodeObject)){ Object date = redisJson.get("date"); long time = DateUtils.addMilliseconds(DateUtils.parseDate(date.toString()), CHUANGLAN_SMS_TIMELIMIT).getTime(); Date dateNow=new Date(); long timeNow = dateNow.getTime(); if(timeNow<=time){ return ResultBody.ok(); }else { return ResultBody.failed("验证码超时"); } }else { return ResultBody.failed("验证码错误"); } }else { return ResultBody.failed("该手机号没有验证码"); } } //获取 存放 Redis的时间 秒(到今晚的秒数) public Long getSecondsNextEarlyMorning() { Date afterDay = DateUtils.getAfterDay(new Date()); String s = DateUtils.formatDate(afterDay, null); Date date = DateUtils.parseDate(s); System.out.println(date.getTime()-System.currentTimeMillis()); long second= (date.getTime()-System.currentTimeMillis())/1000; return second; } }