controller
@PostMapping("/sendSmsCode")
public AjaxResult sendSmsCode(@RequestBody Map<String,String> params){
return verifyCodeService.sendSmsCode(params);
}
serviceImpl
@Autowired
private RedisClient redisClient;
@Autowired
private SsoMapper ssoMapper;
@Autowired
private SmsClient smsClient;
@Override
public AjaxResult sendSmsCode(Map<String, String> params) {
//接收参数
String mobile = params.get("mobile");
String imageCode = params.get("imageCode");
String imageCodeKey = params.get("imageCodeKey");
//2.1 图片验证 通过key从redis获取存放验证码和输入的进行对比
String imgCodeForRedis = redisClient.get(imageCodeKey);
if(imgCodeForRedis == null || !imageCode.equals(imgCodeForRedis)){
return AjaxResult.me().setSuccess(false).setMessage("验证码不正常");
}
if(mobile == null){
return AjaxResult.me().setSuccess(false).setMessage("手机号码不正确");
}
List<Sso> ssos = ssoMapper.selectList(new EntityWrapper<Sso>().eq("phone", mobile));
if(ssos != null && ssos.size() > 0){
return AjaxResult.me().setSuccess(false).setMessage("你的手机号已注册,可直接使用");
}
// 三 发送短信验证码
return sendSmsCode(mobile);
}
private AjaxResult sendSmsCode(String mobile) {
// 一 先产生一个验证码
String smsKey = "SMS_CODE:"+mobile;
String smsCode = StrUtils.getComplexRandomString(4);
System.out.println("smsKey:"+smsKey);
System.out.println("smsCode(1):"+smsCode);
//二 如果原来验证码有效,替换生成哪个
String smsCodeForRedis = redisClient.get(smsKey);
System.out.println("smsCodeForRedis:"+smsCodeForRedis);
if(StringUtils.hasLength(smsCodeForRedis)){
//2如果有效,判断是否已经过了重发时间,如果没有过就报错
String[] split = smsCodeForRedis.split(":");
String timeStr = split[1];
long time = System.currentTimeMillis()-Long.valueOf(timeStr);
if(time<1000*60){
return AjaxResult.me().setSuccess(false).setMessage("请不要重复发送验证码");
}
//如果过了,替换原来的验证码
smsCode = split[0];
System.out.println("smsCode(2):"+smsCode);
}
//存储到redis
redisClient.addForTime(smsKey,smsCode+":"+System.currentTimeMillis(),60*5);//五分钟过期
System.out.println("[lixingjun]已发送验证码"+smsCode+"到用户手机"+mobile);
Map<String,String> params = new HashMap<>();
params.put("smsMob",mobile);
params.put("smsText","验证码为:"+smsCode+"请在5分钟内使用");
smsClient.send(JSONObject.toJSONString(params));
return AjaxResult.me();
}
SmsClient
@FeignClient(value = "HRM-COMMON",fallbackFactory = SmsClientFallbackFactory.class)
@RequestMapping("/sms")
public interface SmsClient {
@PostMapping
AjaxResult send(@RequestParam String params);
}
托底方法(略)
RedisClient
@FeignClient(value = "HRM-COMMON", fallbackFactory = RedisClientFallbackFactory.class )//服务提供
@RequestMapping("/redis")
public interface RedisClient {
@PostMapping
AjaxResult add(@RequestParam(value = "key",required = true) String key,@RequestParam(value = "value",required = true) String value);
@DeleteMapping
AjaxResult del(@RequestParam(value = "key",required = true) String key);
@GetMapping
String get(@RequestParam(value = "key",required = true) String key);
@PostMapping("/time")
AjaxResult addForTime(@RequestParam(value = "key",required = true) String key,@RequestParam(value = "value",required = true) String value,
@RequestParam(value = "time",required = true)Integer time);
}
托底方法(略)
公共服务controller
@RestController
@RequestMapping("/sms")
public class SmsController {
@Autowired
private ISmsService smsService;
@PostMapping
AjaxResult send(@RequestParam String params){
System.out.println("SmsController_params"+params);
Map<String,String> paramsTmp = JSONObject.parseObject(params, Map.class);
paramsTmp.put("Uid", SmsContants.SMS_UID);
paramsTmp.put("Key",SmsContants.SMS_KEY);
return smsService.sendSmsCode(paramsTmp);
}
}
公共服务Service
@Service
public class SmsServiceImpl implements ISmsService {
//参数可变
@Override
public AjaxResult sendSmsCode(Map<String, String> params) {
PostMethod post = null;
try {
HttpClient client = new HttpClient();
post = new PostMethod("http://utf8.api.smschinese.cn");
post.addRequestHeader("Content-Type",
"application/x-www-form-urlencoded;charset=utf-8");//在头文件中设置转码
//动态参数 //map===>list====>array
List<NameValuePair> datas = new ArrayList<>();
for (String key : params.keySet()) {
datas.add( new NameValuePair(key, params.get(key) ));
}
NameValuePair[] data = datas.toArray(new NameValuePair[]{});
post.setRequestBody(data);
client.executeMethod(post);
Header[] headers = post.getResponseHeaders();
int statusCode = post.getStatusCode(); //400 404 200 500
String result = new String(post.getResponseBodyAsString().getBytes("utf-8"));
System.out.println("statusCode:"+statusCode);
System.out.println(result); //打印返回消息状态
if (statusCode==200){
//对各种错误码进行处理
return AjaxResult.me().setMessage(result);
}else{
return AjaxResult.me().setSuccess(false).setMessage(result);
}
}catch (Exception e){
e.printStackTrace();
}
finally {
if (post != null) {
post.releaseConnection();
}
}
return null;
}
}
constants
//这两个值来自于中国网建注册之后得到的(记得填写短信签名)
public interface SmsContants {
//中国网建
public static final String SMS_UID = "lixingjun_";
//密钥
public static final String SMS_KEY= "d41d8cd98f00b204e980";
}