一、简介

springboot + 阿里云短信服务获取登录注册验证码,通过 redis 存储验证码并设置过期时间

二、实现
1、代码用到的参数说明

以下参数在阿里云平台获取(阿里云个人用户如果没有认证的网站、app 仅支持创建验证码签名和短信模板)
AccessKey ID ---------- 点击用户头像, AccessKey 管理获取
AccessKey Secret ---------- 点击用户头像, AccessKey 管理获取
PhoneNumbers ---------- 电话号
SignName ---------- 短信签名名称:开启短信服务,进入控制台点击左侧国内消息添加
TemplateCode ---------- 短信模板ID:开启短信服务,进入控制台点击左侧国内消息添加
TemplateParam ---------- 短信模板中的参数,json 类型 {"code":6379}

2、添加依赖
  <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
        <dependency>
            <groupId>com.aliyun</groupId>
            <artifactId>dysmsapi20170525</artifactId>
            <version>2.0.9</version>
        </dependency>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.75</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
        </dependency>
3、配置 yml

配置 redis 用来存储验证码过期时间

server:
  port: 9000
spring:
  redis:
    port: 6379
    host: 127.0.0.1
    password: 123456
4、代码

阿里云官网 SDK 示例:https://next.api.aliyun.com/api/Dysmsapi/2017-05-25/SendSms

@RestController
@CrossOrigin
public class Login {

    @Autowired
    RedisTemplate<String, String> redisTemplate;

    @RequestMapping("/getSms/{phone}")
    public String getSms(@PathVariable("phone") String phone) {
        String s = redisTemplate.opsForValue().get(phone);
        if (!StringUtils.isEmpty(s)) {
            Long expire = redisTemplate.getExpire(phone);
            return phone + ":" + "验证码还有" + expire + "s 过期,可以继续使用";
        }
		String verify = UUID.randomUUID().toString().replace("-", "").substring(0, 4);
        JSONObject jsonObject = new JSONObject();
        jsonObject.put("code", verify);
        JSONObject sendResult = SendSms.send("18700217355", jsonObject.toJSONString());
        if (sendResult.getString("Code").equals("OK")) {
           /* redisTemplate.opsForValue().set(phone,verify);
            redisTemplate.expireAt(phone,new Date(System.currentTimeMillis()+1000*60));*/
           // 设置短信验证码过期时间一分钟
            redisTemplate.opsForValue().set(phone, verify, 1, TimeUnit.MINUTES);
            return phone + ":" + "验证码发送成功 verify: " + verify;
        }
        return phone + ":" + "验证码发送失败:  " + sendResult.getString("Message");
    }

SendSms

public class SendSms {
    public static com.aliyun.dysmsapi20170525.Client createClient(String accessKeyId, String accessKeySecret) throws Exception {
        Config config = new Config()
                // 您的AccessKey ID
                .setAccessKeyId(accessKeyId)
                // 您的AccessKey Secret
                .setAccessKeySecret(accessKeySecret);
        // 访问的域名
        config.endpoint = "dysmsapi.aliyuncs.com";
        return new com.aliyun.dysmsapi20170525.Client(config);
    }

    public static JSONObject send(String phone, String verify) throws Exception {
        JSONObject jsonObject = new JSONObject();
        com.aliyun.dysmsapi20170525.Client client = SendSms.createClient("***********", "************");
        SendSmsRequest sendSmsRequest = new SendSmsRequest()
                .setPhoneNumbers(phone) // 手机号
                .setSignName("****") // 短信签名名称
                .setTemplateCode("*****") // 短信模板CODE
                .setTemplateParam(verify); // 验证码
        SendSmsResponse sendSmsResponse = client.sendSms(sendSmsRequest);
        jsonObject.put("Code", sendSmsResponse.getBody().getCode());
        jsonObject.put("Message", sendSmsResponse.getBody().getMessage());
        return jsonObject;
    }
}
三 、测试

短信发送成功
在这里插入图片描述
短信验证码未过期
在这里插入图片描述

发送失败
在这里插入图片描述

短信
在这里插入图片描述

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐