- 登录阿里云搜索短信服务
- 充值两三块钱
- 配置签名
- 设置短信模板
- 启动Redis
- 创建 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. 用户业务层
验证码
- 获取验证码
- 删除验证码
@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();
}
}
- 测试
@SpringBootTest
class SpringAliyunMsgApplicationTests {
@Resource
UserService userService;
@Resource
MsgService msgService;
@Test
void contextLoads() {
msgService.sendMsg("你的电话");
}
@Test
void login() {
userService.login("你的电话", "637101");
}
}