认证服务---整合短信验证码,验证码倒计时,验证码防刷校验 【一】

三连哦

前言

将短信验证码整合到自己的分布式微服务项目中,在注册新用户的时候,商品购买支付,充值等业务中调用短信验证。需要注意的几个点。不同的服务可能都需要调用短信验证码功能,因此,可以将短信验证的接口单独写在第三方服务中。其它服务只需要通过远程调用,便可以达到代码复用的效果。

1、短信验证的接口

这个需要购买阿里云的接口验证接口,免费的可以使用20来次,也可以低价购买更多的次数。
连接直达:阿里云 短信验证接口

2、如何使用

接口文档中有详细的说明
接口使用说明:短信验证接口使用说明

以下代码中的appcode在你购买玩商品后,在商品详情页面,可以看到

public static void main(String[] args) {
    
    
	    String host = "https://dfsns.market.alicloudapi.com";
	    String path = "/data/send_sms";
	    String method = "POST";
	    String appcode = "你自己的AppCode";
	    Map<String, String> headers = new HashMap<String, String>();
	    //最后在header中的格式(中间是英文空格)为Authorization:APPCODE 83359fd73fe94948385f570e3c139105
	    headers.put("Authorization", "APPCODE " + appcode);
	    //根据API的要求,定义相对应的Content-Type
	    headers.put("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8");
	    Map<String, String> querys = new HashMap<String, String>();
	    Map<String, String> bodys = new HashMap<String, String>();
	    bodys.put("content", "code:1234");
	    bodys.put("phone_number", "156*****140");
	    bodys.put("template_id", "CST_ptdie100");


	    try {
    
    
	    	/**
	    	* 重要提示如下:
	    	* HttpUtils请从
	    	* https://github.com/aliyun/api-gateway-demo-sign-java/blob/master/src/main/java/com/aliyun/api/gateway/demo/util/HttpUtils.java
	    	* 下载
	    	*
	    	* 相应的依赖请参照
	    	* https://github.com/aliyun/api-gateway-demo-sign-java/blob/master/pom.xml
	    	*/
	    	HttpResponse response = HttpUtils.doPost(host, path, method, headers, querys, bodys);
	    	System.out.println(response.toString());
	    	//获取response的body
	    	//System.out.println(EntityUtils.toString(response.getEntity()));
	    } catch (Exception e) {
    
    
	    	e.printStackTrace();
	    }
	}

3、整合到项目中

将改接口的使用整合到第三方服务中,类似写一个接口。不再赘述

4、其它服务调用

其它服务调用之前需要注意的点:要开启服务远程调用功能。然后是远程调用的实现。之前有写过远程调用的具体实现,这里不在赘述。

4.1 发送验证码(验证码仿刷)

为了防止在短时间内重复多次发送验证码,可以使用redis用来设置一个可过期的key,key没有过期的情况下。不给调用远程服务中的发送验证码接口。

    @ResponseBody
    @GetMapping(value = "/sms/sendCode")
    public R sendCode(@RequestParam("phone") String phone) {
    
    

        //1、接口防刷
        String redisCode = stringRedisTemplate.opsForValue().get(AuthServerConstant.SMS_CODE_CACHE_PREFIX + phone);
        if (!StringUtils.isEmpty(redisCode)) {
    
    
            //活动存入redis的时间,用当前时间减去存入redis的时间,判断用户手机号是否在60s内发送验证码
            long currentTime = Long.parseLong(redisCode.split("_")[1]);
            if (System.currentTimeMillis() - currentTime < 60000) {
    
    
                //60s内不能再发
                return R.error(BizCodeEnume.SMS_CODE_EXCEPTION.getCode(),BizCodeEnume.SMS_CODE_EXCEPTION.getMsg());
            }
        }

        //2、验证码的再次效验 redis.存key-phone,value-code
        int code = (int) ((Math.random() * 9 + 1) * 100000);
        String codeNum = String.valueOf(code);
        String redisStorage = codeNum + "_" + System.currentTimeMillis();

        //存入redis,防止同一个手机号在60秒内再次发送验证码
        stringRedisTemplate.opsForValue().set(AuthServerConstant.SMS_CODE_CACHE_PREFIX+phone,
                redisStorage,10, TimeUnit.MINUTES);

        thirdPartFeignService.sendCode(phone, codeNum);

        return R.ok();
    }

5、遇到的问题

1、要使用官方提供的HttpUtils进行下载。
地址:HttpUtils官方提供地址下载

2、远程服务调用失败,jar包冲突问题。

3、如果传入的手机号为空,直接发送验证嘛,调用远程服务也会报错。

6、实现的效果

6.1 发送验证码界面

在这里插入图片描述

6.2 手机短信接收

在这里插入图片描述

6.3 查看redis中的存值情况

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_43304253/article/details/130043170
今日推荐