最近呢用到了短信服务,这次我使用的是阿里的SMS短信服务,就此对于SpringBoot接入短信服务来给大家简单的总结一下。因为也是用到了短信服务的开发工具包,所以接入起来也是非常简单方便的,下面一起来看看。
这次介绍的是SpringBoot接入SMS服务,阿里SMS对于Java的支持还是比较简单的,对于接入只需要一个开发工具包即可。
1.引入SMS依赖
SMS开发工具包这个里面封装了接入短信服务基本的东西,有了这个开发包接入短信服务就变的容易的许多,这块还是比较不错的。
<!-- sms -->
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>alibabacloud-dysmsapi20170525</artifactId>
<version>2.0.22</version>
</dependency>
2.application.yml配置短信密钥
这里的密钥正常来讲在短信服务平台开通了短信服务以后就可以拿到,自己可以去短信模块看一眼,这个是关键。
###############################################
######################sms######################
###############################################
aliyun:
sms:
access-key-id: xxxxxx
access-key-secret: xxxxxx
3.SmsService服务实现
这是短信服务接入的主要步骤,这些在阿里短信平台的接入文档中也可以找到,具体的参数那里也比较详细,有需要的小伙伴可以自行翻阅,这里就直接弄过来简单的改一下。
package cn.youhaveme.service.impl;
import cn.hutool.json.JSONUtil;
import cn.youhaveme.service.SmsService;
import com.aliyun.auth.credentials.Credential;
import com.aliyun.auth.credentials.provider.StaticCredentialProvider;
import com.aliyun.sdk.service.dysmsapi20170525.AsyncClient;
import com.aliyun.sdk.service.dysmsapi20170525.models.SendSmsRequest;
import com.aliyun.sdk.service.dysmsapi20170525.models.SendSmsResponse;
import darabonba.core.client.ClientOverrideConfiguration;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import java.util.concurrent.CompletableFuture;
@Service("smsService")
@Slf4j
public class SmsServiceImpl implements SmsService {
@Value("${aliyun.sms.access-key-id}")
private String accessKeyId;
@Value("${aliyun.sms.access-key-secret}")
private String accessKeySecret;
@Override
public void sendSms(String phoneNumber, String templateCode, String templateParam) {
AsyncClient client = null;
try {
StaticCredentialProvider provider = StaticCredentialProvider.create(
Credential.builder()
.accessKeyId(accessKeyId)
.accessKeySecret(accessKeySecret)
.build());
client = AsyncClient.builder()
.region("cn-hangzhou")
.credentialsProvider(provider)
.overrideConfiguration(ClientOverrideConfiguration.create()
.setEndpointOverride("dysmsapi.aliyuncs.com"))
.build();
SendSmsRequest sendSmsRequest = SendSmsRequest.builder()
// 模版签名
.signName("YouHaveMe")
.templateCode(templateCode)
.phoneNumbers(phoneNumber)
.templateParam(templateParam)
.build();
CompletableFuture<SendSmsResponse> response = client.sendSms(sendSmsRequest);
SendSmsResponse sendSmsResponse = response.get();
log.info(JSONUtil.toJsonStr(sendSmsResponse));
} catch (Exception e) {
log.error("短信服务发送异常", e);
} finally {
if (client != null) {
client.close();
}
}
}
}
4.SMS消费者
这里我没有通过Controller调用短信服务接口,我是通过消费Kafka的消息去发送短信的,直接通过接口调用也是一样的操作。
package cn.youhaveme.kafka.consumer;
import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;
import cn.youhaveme.kafka.constant.TopicConst;
import cn.youhaveme.service.CodeTransferService;
import cn.youhaveme.service.SmsService;
import lombok.extern.slf4j.Slf4j;
import org.apache.kafka.clients.consumer.ConsumerRecord;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.kafka.annotation.KafkaListener;
@Configuration
@Slf4j
public class SmsConsumer {
@Autowired
private SmsService smsService;
@Autowired
private CodeTransferService codeTransferService;
@KafkaListener(id = "smsConsumer", topics = TopicConst.SMS, groupId = "sms")
public void smsConsumer(ConsumerRecord<String, String> record) {
try {
JSONObject requestJson = JSONUtil.parseObj(record.value());
String templateCode = codeTransferService.getOuterCode("SMS_TEMPLATE_CODE", requestJson.getStr("templateCode"));
smsService.sendSms(requestJson.getStr("phoneNumber"),
templateCode,
requestJson.getStr("param"));
} catch (Exception e) {
log.error("【Kafka消费短信异常】:{}--{}--{}", record.topic(), record.partition(), record.key(), e);
}
}
}
到这里我通过SpringBoot接入阿里SMS短信服务就已经完成了,看着是不是特别简单的,其实正常的短信服务要比我这个规范的多,我这里只是演示一个简单的接入过程,有短信服务需求的小伙伴们可以尝试一波。