中国网建——短信验证码

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";
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值