发送验证码-整合阿里云短信服务功能与电子邮箱通知功能

一、整合阿里云短信服务功能

登录阿里云,搜索短信服务(SMS),进入工作台后由于没有已上线的项目所以没有办法申请到短信模板和短信签名,所以这里使用的是阿里云短信服务的测试,我们只需要绑定一个测试手机号,就可以使用专用的测试模板与测试签名。

 我们需要先载入所需要的依赖,也可以直接使用官方提供的文档,点击下方的<调用API发送短信>就可以找到提供好的接口。我这里两个方法都测试了,最后使用的是谷粒学苑上版本比较老的方法

        <!--    JSON格式转换    -->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
        </dependency>

        <dependency>
            <groupId>com.aliyun</groupId>
            <artifactId>aliyun-java-sdk-core</artifactId>
        </dependency>

版本分别是fastjson:1.2.28     aliyun-sdk:4.5.1

controller调用service中的send方法

    public R sendMsg(@PathVariable String phone) {
        //先从redis中拿验证码 code
        String code = redisTemplate.opsForValue().get(phone);
        if(!StringUtils.isEmpty(code)) {
            return R.success();
        }
        //如果redis中没有验证码 那么才进行发送 code
        code = RandomUtil.getSixBitRandom();
        Map<String,Object> param = new HashMap<>();
        param.put("code", code);
        Boolean isSend = smsService.send(param,phone);
        if (isSend) {
            // 发送成功后将code存入redis 并且设置过期时间 5 MIN
            redisTemplate.opsForValue().set(phone, code, 5, TimeUnit.MINUTES);
            return R.success();
        }else {
            return R.error();
        }
    }
    public Boolean send(Map<String, Object> param, String phone) {
        if (StringUtils.isEmpty(phone)) return false;
        DefaultProfile profile = DefaultProfile.getProfile("default", "<your-access-key-id>", "<your-access-key-secret>");
        /** use STS Token
         DefaultProfile profile = DefaultProfile.getProfile(
         IAcsClient client = new DefaultAcsClient(profile);

        //设置相关固定的参数
            CommonRequest request = new CommonRequest();
            request.setMethod(MethodType.POST);
            request.setDomain("dysmsapi.aliyuncs.com");
            request.setVersion("2017-05-25");
            request.setAction("SendSms");
            //设置发送相关的参数
            request.putQueryParameter("PhoneNumbers", phone);
            //这个是测试专用的签名
            request.putQueryParameter("SignName", "阿里云短信测试");
            //这个是测试专用的模板代码
            request.putQueryParameter("TemplateCode", "SMS_154950909");
            //使用fastjson将map转成string
            request.putQueryParameter("TemplateParam", JSON.toJSONString(param));
        try {

            CommonResponse rsp = client.getCommonResponse(request);
            boolean success = rsp.getHttpResponse().isSuccess();
            return success;
        } catch (ServerException e) {
            e.printStackTrace();
        } catch (ClientException e) {
            System.out.println("ErrCode:" + e.getErrCode());
            System.out.println("ErrMsg:" + e.getErrMsg());
            System.out.println("RequestId:" + e.getRequestId());
        }
        return null;
    }

随即将服务启动,打开我们的swagger-ui测试一下功能,这里输入我们在阿里云绑定好的手机号,点击send,不出意外的话不出10秒我们就拿到了我们随机生成的验证码,并且这个验证码也存入到了我们的redis中。

上面使用到了一个生成随机数的radom工具类如下

public class RandomUtil {

	private static final Random random = new Random();
	private static final DecimalFormat fourdf = new DecimalFormat("0000");
	private static final DecimalFormat sixdf = new DecimalFormat("000000");

	public static String getFourBitRandom() {
		return fourdf.format(random.nextInt(10000));
	}

	public static String getSixBitRandom() {
		return sixdf.format(random.nextInt(1000000));
	}

	/**
	 * 给定数组,抽取n个数据
	 * @param list
	 * @param n
	 * @return
	 */
	public static ArrayList getRandom(List list, int n) {

		Random random = new Random();
		HashMap<Object, Object> hashMap = new HashMap<Object, Object>();

		// 生成随机数字并存入HashMap
		for (int i = 0; i < list.size(); i++) {
			int number = random.nextInt(100) + 1;
			hashMap.put(number, i);
		}

		// 从HashMap导入数组
		Object[] robjs = hashMap.values().toArray();
		ArrayList r = new ArrayList();
		// 遍历数组并打印数据
		for (int i = 0; i < n; i++) {
			r.add(list.get((int) robjs[i]));
			System.out.print(list.get((int) robjs[i]) + "\t");
		}
		System.out.print("\n");
		return r;
	}
}

二、整合电子邮箱发送验证码功能

首先登录个人电子邮箱,开启POP3/SMTP服务并且拿到授权码,然后导入springboot整合的mail依赖,紧接在去配置文件配置我们mail的各种基础信息包括上面的授权码,最后我们就可以去service中实现这个功能了。

 上依赖

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-mail</artifactId>
        </dependency>

添加配置文件

spring:
  # 邮箱配置信息
  mail:
    host: smtp.163.com
    username: xxxxxxx@163.com
    password: 授权码<我们上面开启服务后弹出的>
    default-encoding: utf-8

开始实现功能,邮箱和发短信差不多,只不过是两者需要设置的参数不同,我们在发短信时需要设置签名和模板,我们在邮箱要设置发送者和接收者,邮件没有模板我们可以定义在配置文件里,说到底也还是一个调用邮件服务器的方法罢了。

    public Boolean sendEmailCode(Map<String, Object> param, String email) {
        if (StringUtils.isEmpty(email)) return false;
        // 设置发送相关参数
        SimpleMailMessage simpleMailMessage = new SimpleMailMessage();
        simpleMailMessage.setFrom(from);    //发送者
        simpleMailMessage.setTo(email);     //收件者
        simpleMailMessage.setSubject("整合邮件发送业务,实现随机验证码的发送。");   //主题
        simpleMailMessage.setText("您的验证码为:  "+ param.values() + "  此验证码五分钟内有效。"); //邮件内容
        mailSender.send(simpleMailMessage);

        redisTemplate.opsForValue().set(email, JSON.toJSONString(param), 5, TimeUnit.MINUTES);
        if ((redisTemplate.opsForValue().get(email)).equals(JSON.toJSONString(param))) {
            return true;
        }else {
            return false;
        }

上面from是我定义到配置文件里,通过@Value来获取得到的,还注入了redis来实现存放,用来判断是否保存成功(因为我是在不知道怎么判断是否发送成功了,就用了这个依据试一试,感觉不是很严谨)。有更好建议的小伙伴call我😿😿😿!

添加一下功能实现的截图吧,不加白不加了属于。

 


我今天写了注册功能测试发现电子邮箱发送的验证码格式有错误,修改了两边要么是带[验证码]要么是“验证码”,这种就导致我们输入的验证码与实现类中进行对比的验证码肯定是不一致的,以至于我们注册就会失败,所以今天进行改进。

电子右键的code就直接使用String的形式传递了,取出来的验证码首先取消他的双引号,判定验证码发送是否成功的方式更改为redis根据key查询数据库取出来的值是否为空。

 // 校验验证码是否正确 判断验证码是否为空
        String emailCode = redisTemplate.opsForValue().get(email);
        // 将redis中的验证码去掉双引号进行后续的比较
        emailCode = emailCode.replace("\"","");
        if (StringUtils.isEmpty(code)) {
            throw new LeaderException(20001, "注册失败,验证码不能为空");
        }
        if (!code.equals(emailCode)) {
            throw new LeaderException(20001, "注册失败,请输入正确的邮箱验证码");
        }
redisTemplate.opsForValue().set(email, code, 5, TimeUnit.MINUTES);
        if (!StringUtils.isEmpty((redisTemplate.opsForValue().get(email).toString()))) {
            return true;
        }else {
            return false;
        }

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

OtnIOs

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值