Spring Boot 阿里云短信平台手机验证码测试

  1. 登录阿里云搜索短信服务
  2. 充值两三块钱
  3. 配置签名
  4. 设置短信模板
  5. 启动Redis
  6. 创建 Spring Boot 工程

1. 导入依赖

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>com.aliyun</groupId>
            <artifactId>aliyun-java-sdk-core</artifactId>
            <version>4.6.0</version>
        </dependency>
        <dependency>
            <groupId>com.aliyun</groupId>
            <artifactId>aliyun-java-sdk-dysmsapi</artifactId>
            <version>1.1.0</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
        </dependency>
        <dependency>
            <groupId>cn.hutool</groupId>
            <artifactId>hutool-all</artifactId>
            <version>5.7.22</version>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.78</version>
        </dependency>
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
            <version>2.13.0</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-configuration-processor</artifactId>
            <optional>true</optional>
        </dependency>

2. 配置类

@Configuration
public class AliyunMsgConfig {
    @Resource
    MsgProperites msgProperites;

    @Bean
    public IAcsClient iAcsClient() throws ClientException {
        DefaultProfile profile = DefaultProfile.getProfile(msgProperites.getRegionId(), msgProperites.getAccessKeyId(), msgProperites.getAccessKeySecret());
        IAcsClient client = new DefaultAcsClient(profile);
        return client;
    }
}

3. 配置属性类

@Data
@Component
@ConfigurationProperties("aliyun.msg")
public class MsgProperites {
    private String regionId;
    private String accessKeyId;
    private String accessKeySecret;
    private String signName;
    private String templateCode;
}

4. 配置文件

aliyun:
  msg:
    #  "cn-beijing"
    regionid: "cn-hangzhou"
    access-key-id: ""
    access-key-secret: ""
    sign-name: ""
    template-code: 
spring:
  redis:
    host: 你的redis的IP
    port: 6379
    database: 1
    password: ""
    #  s  表示  m 分钟  h  小时  d  天
    timeout: 3s
    jedis:
      pool:
        # 最大连接数
        max-active: 10
        # 连接池最大存活数
        max-idle: 8
        # 连接池最小存活数
        min-idle: 2    

5. 业务层

发送短信

@Service
public class MsgServiceImpl implements MsgService {
    public static final String PREFIX_REDIS_KEY = "msg:phone:";
    @Resource
    MsgProperites msgProperites;
    @Resource
    IAcsClient client;
    @Resource
    ValueOperations<String, Object> valueOperations;
    @Resource
    ObjectMapper objectMapper;

    /**
     * @param phone
     * @return
     */
    @Override
    public String sendMsg(String phone) {
        String number = RandomUtil.randomNumbers(6);
        MsgTemplateParam msgTemplateParam = new MsgTemplateParam();
        msgTemplateParam.setCode(number);
        SendSmsRequest request = new SendSmsRequest();
        request.setPhoneNumbers(phone);
        request.setSignName(msgProperites.getSignName());
        request.setTemplateCode(msgProperites.getTemplateCode());
        try {
            request.setTemplateParam(objectMapper.writeValueAsString(msgTemplateParam));
            SendSmsResponse response = client.getAcsResponse(request);
            if ("OK".equals(response.getCode())) {
                valueOperations.set(PREFIX_REDIS_KEY + phone, number, Duration.ofMinutes(5));
            }
        } catch (ClientException | JsonProcessingException e) {

        }
        return "success";
    }

}

6.验证码

@Data
public class MsgTemplateParam {
    private String code;
}

7. 用户业务层

验证码

  1. 获取验证码
  2. 删除验证码
@Service
public class UserServiceImpl implements UserService {
    @Resource
    ValueOperations<String, Object> valueOperations;
    @Resource
    RedisTemplate<String, Object> redisTemplate;

    @Override
    public String login(String phone, String code) {
        String tempCode = (String) valueOperations.get(MsgServiceImpl.PREFIX_REDIS_KEY + phone);
        if (!ObjectUtils.isEmpty(tempCode) && tempCode.equals(code)) {
            //删除键
            redisTemplate.delete(MsgServiceImpl.PREFIX_REDIS_KEY + phone);
            return "sucess";
        }
        return null;
    }
}

8. Redis 模板


/**
 * 1 定制Redistemplate
 * jackson
 * fastjson
 * <hasKey,Map<key,>>
 */
@Configuration
public class RedisConfig {
    /**
     * @return
     */
    @Bean
    public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {
        RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
        //  用户对象保存
//        user:1  user  转化json存redis
//        redisTemplate.setKeySerializer();
//        redisTemplate.setValueSerializer();
//        redisTemplate.setHashKeySerializer();
//        redisTemplate.setHashValueSerializer();
        // 配置序列化方式
        StringRedisSerializer serializer = new StringRedisSerializer();
        redisTemplate.setKeySerializer(serializer);
        redisTemplate.setHashKeySerializer(serializer);
        Jackson2JsonRedisSerializer<Object> jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer<>(Object.class);
        redisTemplate.setValueSerializer(jackson2JsonRedisSerializer);
        redisTemplate.setHashValueSerializer(jackson2JsonRedisSerializer);
        //将自定的RedisTemplate注入到容器中
        redisTemplate.setConnectionFactory(redisConnectionFactory);
        return redisTemplate;
    }

    @Bean
    public ValueOperations<String, Object> valueOperations(RedisTemplate<String, Object> redisTemplate) {
        return redisTemplate.opsForValue();
    }


    @Bean
    public ListOperations<String, Object> listOperations(RedisTemplate<String, Object> redisTemplate) {
        return redisTemplate.opsForList();
    }

    @Bean
    public SetOperations<String, Object> setOperations(RedisTemplate<String, Object> redisTemplate) {
        return redisTemplate.opsForSet();
    }


    @Bean
    public ZSetOperations<String, Object> zSetOperations(RedisTemplate<String, Object> redisTemplate) {
        return redisTemplate.opsForZSet();
    }

    @Bean
    public HashOperations<String, String, Object> hashOperations(RedisTemplate<String, Object> redisTemplate) {
        return redisTemplate.opsForHash();
    }
}

  1. 测试
@SpringBootTest
class SpringAliyunMsgApplicationTests {
    @Resource
    UserService userService;
    @Resource
    MsgService msgService;

    @Test
    void contextLoads() {
        msgService.sendMsg("你的电话");
    }

    @Test
    void login() {
        userService.login("你的电话", "637101");
    }
}

在这里插入图片描述

在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值