先 创建sms短信微服务工程,有可能很多工程要使用我们创建的短信服务.
项目环境: SpringBoot SpringClould
步骤:
- config
SmsConfiguration:
/**
* 创建阿里云短信的客户端,把客户端放入ioc容器
*/
@Configuration
@EnableConfigurationProperties(SmsProperties.class) //从配置文件中读取内容
public class SmsConfiguration {
/**
* 初始化 阿里云短信客户端
* @param prop
* @return
*/
@Bean
public IAcsClient acsClient(SmsProperties prop){
DefaultProfile profile = DefaultProfile.getProfile(
prop.getRegionID(),
prop.getAccessKeyId(),
prop.getAccessKeySecret());
return new DefaultAcsClient(profile);
}
}
SmsProperties:
读取配置文件中定义需要的实体
@Data
@ConfigurationProperties(prefix = "ly.sms")
//这里的prefix = "ly.sms"代表读取配置文件中配置的前缀
public class SmsProperties {
private String accessKeyId;//: LTAI4GECXLNqMYLULWMAWm4U
private String accessKeySecret;//: IgT4T7uyd5lLl4Xtg2oYLKGb6YuI52
private String signName;//: 顺义leyou项目 # 签名名称
private String verifyCodeTemplate;//: SMS_169636334 # 模板名称
private String domain;//: dysmsapi.aliyuncs.com # 域名
private String action;//: SendSMS # API类型,发送短信
private String version;//: 2017-05-25 # API版本,固定值
private String regionID;//: cn-hangzhou # 区域id
}
- contants
public final class SmsConstants {
/**
* 请求参数
*/
public static final String SMS_PARAM_KEY_PHONE = "PhoneNumbers";
public static final String SMS_PARAM_KEY_SIGN_NAME = "SignName";
public static final String SMS_PARAM_KEY_TEMPLATE_CODE = "TemplateCode";
public static final String SMS_PARAM_KEY_TEMPLATE_PARAM= "TemplateParam";
/**
* 响应结果
*/
public static final String SMS_RESPONSE_KEY_CODE = "Code";
public static final String SMS_RESPONSE_KEY_MESSAGE = "Message";
/**
* 状态
*/
public static final String OK = "OK";
}
- listener 短信监听器使用的是mq
/**
* 发验证码短信的监听器
*/
@Slf4j
@Component //交给包扫描的注解,让他扫描这个类
@RocketMQMessageListener(consumerGroup = SMS_VERIFY_CODE_CONSUMER,
topic = SMS_TOPIC_NAME,
selectorExpression = VERIFY_CODE_TAGS)
public class SendMessageListener implements RocketMQListener<String> {
@Autowired
private SmsHelp smsHelp; //短信工具类
@Autowired
private SmsProperties prop;
/**
* 验证码短信
* @param message {"phone":12312,"code":"12345613"}
*/
@Override //message参数内容
public void onMessage(String message) {
//日志
log.info("[sms服务]接收到消息,msg={}",message);
Map<String, String> msg = JsonUtils.toMap(message, String.class, String.class);
//将这个手机号拿出来,然后删掉,要的是code:"code":"12345613"
String phone = msg.remove("phone");
//sdk需要的param内容是{"code":"1111"}
smsHelp.sendMessage(phone,prop.getSignName(),prop.getVerifyCodeTemplate(),JsonUtils.toString(msg));
}
}
- utils
/**
* 短信工具类
*/
@Slf4j
@Component //放入Soc容器中
public class SmsHelp {
private IAcsClient client;
private SmsProperties prop;
public SmsHelp(IAcsClient client, SmsProperties prop) {
this.client = client;
this.prop = prop;
}
public void sendMessage(String phone,String signName,String template,String param){
CommonRequest request = new CommonRequest();
request.setProtocol(ProtocolType.HTTPS);
request.setMethod(MethodType.POST);
request.setDomain(prop.getDomain());
request.setVersion(prop.getVersion());
request.setAction(prop.getAction());
request.putQueryParameter(SMS_PARAM_KEY_PHONE, phone);
request.putQueryParameter(SMS_PARAM_KEY_SIGN_NAME, signName);
request.putQueryParameter(SMS_PARAM_KEY_TEMPLATE_CODE, template);
request.putQueryParameter(SMS_PARAM_KEY_TEMPLATE_PARAM, param);
try {
CommonResponse response = client.getCommonResponse(request);
if(response.getHttpStatus() >= 300){
log.error("【SMS服务】发送短信失败。响应信息:{}", response.getData());
}
// 获取响应体
Map<String, String> resp = JsonUtils.toMap(response.getData(), String.class, String.class);
// 判断是否是成功
if(!StringUtils.equals(OK, resp.get(SMS_RESPONSE_KEY_CODE))){
// 不成功,
log.error("【SMS服务】发送短信失败,原因{}", resp.get(SMS_RESPONSE_KEY_MESSAGE));
throw new LyException(ExceptionEnum.SEND_MESSAGE_ERROR);
}
log.info("【SMS服务】发送短信成功,手机号:{}, 响应:{}", phone, response.getData());
} catch (ServerException e) {
log.error("【SMS服务】发送短信失败,服务端异常。", e);
} catch (ClientException e) {
log.error("【SMS服务】发送短信失败,客户端异常。", e);
}
}
}
- 启动类LySms
@SpringBootApplication
public class LySms {
public static void main(String[] args) {
SpringApplication.run(LySms.class, args);
}
}
- application.yml
server:
port: 8086
spring:
application:
name: sms-service
rocketmq:
name-server: 127.0.0.1:9876
producer: #用于测试
group: ${spring.application.name} #生产者组
send-message-timeout: 20000 #超时时间
# 自己去阿里云短信注册,然后去申请模板
ly:
sms:
accessKeyId: LTAI4GECXLNqMYLULWMAWm4U
accessKeySecret: IgT4T7uyd5lLl4Xtg2oYLKGb6YuI52
signName: leyou项目 # 签名名称
verifyCodeTemplate: SMS_169636334 # 模板名称
domain: dysmsapi.aliyuncs.com # 域名
action: SendSMS # API类型,发送短信
version: 2017-05-25 # API版本,固定值
regionID: cn-hangzhou # 区域id
- 测试发送验证码短信TestSms
@RunWith(SpringRunner.class)
@SpringBootTest
public class TestSendSms {
@Autowired
private RocketMQTemplate rocketMQTemplate;
/**
* 发送rocketMQ的消息
*/
@Test
public void testSend(){
String dest = SMS_TOPIC_NAME+":"+ VERIFY_CODE_TAGS;
HashMap<String, String> msg = new HashMap<>();
msg.put("phone","电话号码");
msg.put("code","467512");
rocketMQTemplate.convertAndSend(dest, JsonUtils.toString(msg));
}
}
11. common公共的工具类[这里是一个独立的微服务工程]
![在这里插入图片描述](https://img-blog.csdnimg.cn/2020073123465178.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NTU5MTYxNw==,size_16,color_FFFFFF,t_70)
```java
public abstract class RocketMQConstants {
public static final class TOPIC {
/**
* 短信服务
*/
public static final String SMS_TOPIC_NAME = "ly-sms-topic";
}
public static final class TAGS {
/**
* 发送短信验证码TAGS
*/
public static final String VERIFY_CODE_TAGS = "sms-verify-code";
}
public static final class CONSUMER{
/**
* 短信发送 的消费者
*/
public static final String SMS_VERIFY_CODE_CONSUMER = "SMS_VERIFY_CODE_CONSUMER";
}
pom依赖:
<dependencies>
<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>
<groupId>com.aliyun</groupId>
<artifactId>aliyun-java-sdk-core</artifactId>
<version>4.1.1</version>
</dependency>
<!--MQ依赖-->
<dependency>
<groupId>org.apache.rocketmq</groupId>
<artifactId>rocketmq-spring-boot-starter</artifactId>
<version>2.0.2</version>
</dependency>
<!--这个就是上面那个common工程的依赖-->
<dependency>
<groupId>com.leyou</groupId>
<artifactId>ly-common</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
</dependencies>
<!--打包-->
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>