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

追求适度,才能走向成功;人在顶峰,迈步就是下坡;身在低谷,抬足既是登高;弦,绷得太紧会断;人,思虑过度会疯;水至清无鱼,人至真无友,山至高无树;适度,不是中庸,而是一种明智的生活态度。

导读:本篇文章讲解 认证服务—整合短信验证码,验证码倒计时,验证码防刷校验 【一】,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com,来源:原文


三连哦

前言

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

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中的存值情况

在这里插入图片描述

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/131445.html

(0)
飞熊的头像飞熊bm

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!