下面是一个Spring Boot集成腾讯云短信服务的详细示例,包含配置和6个工具类(签名、模板、发送、统计、状态),采用YML配置:
1. 添加Maven依赖
<dependency>
<groupId>com.tencentcloudapi</groupId>
<artifactId>tencentcloud-sdk-java</artifactId>
<version>3.1.270</version>
</dependency>
2. application.yml 配置
tencent:
sms:
secret-id: AKIDz8krbsJ5**********EGTIO
secret-key: Gu5t9xGARN**********7vCK
sdk-app-id: 1400****
sign-name: 腾讯云测试
region: ap-guangzhou
template-id: 1234567
conn-timeout: 60
write-timeout: 60
3. 配置读取类
@Component
@ConfigurationProperties(prefix = "tencent.sms")
public class TencentSmsConfig {
private String secretId;
private String secretKey;
private String sdkAppId;
private String signName;
private String region;
private String templateId;
private int connTimeout;
private int writeTimeout;
// Getters and Setters
}
4. 工具类实现
(1) 短信签名工具类 SmsSignUtils
@Component
public class SmsSignUtils {
private final SmsClient client;
private final String sdkAppId;
@Autowired
public SmsSignUtils(TencentSmsConfig config) {
Credential cred = new Credential(config.getSecretId(), config.getSecretKey());
HttpProfile httpProfile = new HttpProfile();
httpProfile.setConnTimeout(config.getConnTimeout());
httpProfile.setWriteTimeout(config.getWriteTimeout());
ClientProfile clientProfile = new ClientProfile();
clientProfile.setHttpProfile(httpProfile);
this.client = new SmsClient(cred, config.getRegion(), clientProfile);
this.sdkAppId = config.getSdkAppId();
}
// 添加短信签名
public AddSmsSignResponse addSign(String signName, int signType, String document) throws Exception {
AddSmsSignRequest req = new AddSmsSignRequest();
req.setSignName(signName);
req.setSignType((long) signType);
req.setDocumentType(new Long[]{5L}); // 5-三证合一
req.setInternational(0L); // 国内短信
req.setCertificateUrls(new String[]{document});
return client.AddSmsSign(req);
}
// 删除短信签名
public DeleteSmsSignResponse deleteSign(long signId) throws Exception {
DeleteSmsSignRequest req = new DeleteSmsSignRequest();
req.setSignId(signId);
return client.DeleteSmsSign(req);
}
// 获取签名状态
public DescribeSmsSignListResponse getSignStatus(long[] signIds) throws Exception {
DescribeSmsSignListRequest req = new DescribeSmsSignListRequest();
req.setSignIdSet(signIds);
req.setInternational(0L);
return client.DescribeSmsSignList(req);
}
}
(2) 短信模板工具类 SmsTemplateUtils
@Component
public class SmsTemplateUtils {
private final SmsClient client;
private final String sdkAppId;
@Autowired
public SmsTemplateUtils(TencentSmsConfig config) {
Credential cred = new Credential(config.getSecretId(), config.getSecretKey());
HttpProfile httpProfile = new HttpProfile();
httpProfile.setConnTimeout(config.getConnTimeout());
httpProfile.setWriteTimeout(config.getWriteTimeout());
ClientProfile clientProfile = new ClientProfile();
clientProfile.setHttpProfile(httpProfile);
this.client = new SmsClient(cred, config.getRegion(), clientProfile);
this.sdkAppId = config.getSdkAppId();
}
// 创建模板
public AddSmsTemplateResponse createTemplate(String templateName, String templateContent, int type) throws Exception {
AddSmsTemplateRequest req = new AddSmsTemplateRequest();
req.setTemplateName(templateName);
req.setTemplateContent(templateContent);
req.setSmsType((long) type); // 0-普通短信 1-营销短信
req.setInternational(0L);
req.setRemark("系统自动创建");
return client.AddSmsTemplate(req);
}
// 删除模板
public DeleteSmsTemplateResponse deleteTemplate(long templateId) throws Exception {
DeleteSmsTemplateRequest req = new DeleteSmsTemplateRequest();
req.setTemplateId(templateId);
return client.DeleteSmsTemplate(req);
}
// 获取模板审核状态
public DescribeSmsTemplateListResponse getTemplateStatus(long[] templateIds) throws Exception {
DescribeSmsTemplateListRequest req = new DescribeSmsTemplateListRequest();
req.setTemplateIdSet(templateIds);
req.setInternational(0L);
return client.DescribeSmsTemplateList(req);
}
}
(3) 短信发送工具类 SmsSendUtils
@Component
public class SmsSendUtils {
private final SmsClient client;
private final String sdkAppId;
private final String signName;
@Autowired
public SmsSendUtils(TencentSmsConfig config) {
Credential cred = new Credential(config.getSecretId(), config.getSecretKey());
HttpProfile httpProfile = new HttpProfile();
httpProfile.setConnTimeout(config.getConnTimeout());
httpProfile.setWriteTimeout(config.getWriteTimeout());
ClientProfile clientProfile = new ClientProfile();
clientProfile.setHttpProfile(httpProfile);
this.client = new SmsClient(cred, config.getRegion(), clientProfile);
this.sdkAppId = config.getSdkAppId();
}
// 单发短信
public SendSmsResponse sendSingleSms(String phone, String templateId, String[] params) throws Exception {
SendSmsRequest req = new SendSmsRequest();
req.setPhoneNumberSet(new String[]{phone});
req.setSmsSdkAppId(sdkAppId);
req.setSignName(signName);
req.setTemplateId(templateId);
req.setTemplateParamSet(params);
return client.SendSms(req);
}
// 群发短信
public SendSmsResponse sendMultiSms(String[] phones, String templateId, String[] params) throws Exception {
SendSmsRequest req = new SendSmsRequest();
req.setPhoneNumberSet(phones);
req.setSmsSdkAppId(sdkAppId);
req.setSignName(signName);
req.setTemplateId(templateId);
req.setTemplateParamSet(params);
return client.SendSms(req);
}
}
(4) 短信统计工具类 SmsStatisticsUtils
@Component
public class SmsStatisticsUtils {
private final SmsClient client;
private final String sdkAppId;
@Autowired
public SmsStatisticsUtils(TencentSmsConfig config) {
Credential cred = new Credential(config.getSecretId(), config.getSecretKey());
HttpProfile httpProfile = new HttpProfile();
httpProfile.setConnTimeout(config.getConnTimeout());
httpProfile.setWriteTimeout(config.getWriteTimeout());
ClientProfile clientProfile = new ClientProfile();
clientProfile.setHttpProfile(httpProfile);
this.client = new SmsClient(cred, config.getRegion(), clientProfile);
this.sdkAppId = config.getSdkAppId();
}
// 获取发送数据统计
public SendStatusStatisticsResponse getSendStats(String startDate, String endDate) throws Exception {
SendStatusStatisticsRequest req = new SendStatusStatisticsRequest();
req.setStartDateTime(startDate); // 格式: yyyyMMdd
req.setEndDataTime(endDate);
req.setSmsSdkAppId(sdkAppId);
req.setLimit(100L);
return client.SendStatusStatistics(req);
}
// 获取回执数据统计
public CallbackStatusStatisticsResponse getCallbackStats(String startDate, String endDate) throws Exception {
CallbackStatusStatisticsRequest req = new CallbackStatusStatisticsRequest();
req.setStartDateTime(startDate);
req.setEndDataTime(endDate);
req.setSmsSdkAppId(sdkAppId);
return client.CallbackStatusStatistics(req);
}
}
(5) 短信状态拉取工具类 SmsStatusUtils
@Component
public class SmsStatusUtils {
private final SmsClient client;
private final String sdkAppId;
@Autowired
public SmsStatusUtils(TencentSmsConfig config) {
Credential cred = new Credential(config.getSecretId(), config.getSecretKey());
HttpProfile httpProfile = new HttpProfile();
httpProfile.setConnTimeout(config.getConnTimeout());
httpProfile.setWriteTimeout(config.getWriteTimeout());
ClientProfile clientProfile = new ClientProfile();
clientProfile.setHttpProfile(httpProfile);
this.client = new SmsClient(cred, config.getRegion(), clientProfile);
this.sdkAppId = config.getSdkAppId();
}
// 拉取短信发送状态
public PullSmsSendStatusResponse pullSendStatus(int limit) throws Exception {
PullSmsSendStatusRequest req = new PullSmsSendStatusRequest();
req.setLimit((long) limit);
req.setSmsSdkAppId(sdkAppId);
return client.PullSmsSendStatus(req);
}
// 拉取短信回复状态
public PullSmsReplyStatusResponse pullReplyStatus(int limit) throws Exception {
PullSmsReplyStatusRequest req = new PullSmsReplyStatusRequest();
req.setLimit((long) limit);
req.setSmsSdkAppId(sdkAppId);
return client.PullSmsReplyStatus(req);
}
}
5. 使用示例
@RestController
@RequestMapping("/sms")
public class SmsController {
@Autowired private SmsSendUtils sendUtils;
@Autowired private SmsTemplateUtils templateUtils;
// 发送验证码
@PostMapping("/sendCode")
public String sendCode(@RequestParam String phone) {
try {
String templateId = "123456"; // 验证码模板ID
String code = String.valueOf((int)(Math.random()*9000 + 1000));
sendUtils.sendSingleSms(phone, templateId, new String[]{code, "5"});
return "发送成功";
} catch (Exception e) {
return "发送失败: " + e.getMessage();
}
}
// 创建模板
@PostMapping("/createTemplate")
public String createTemplate() {
try {
AddSmsTemplateResponse res = templateUtils.createTemplate(
"验证码模板",
"您的验证码是{1},有效期{2}分钟",
0
);
return "模板ID: " + res.getAddSmsTemplateStatus().getTemplateId();
} catch (Exception e) {
return "创建失败: " + e.getMessage();
}
}
}
关键说明:
认证信息:SecretId/SecretKey在腾讯云控制台获取
短信签名:需提前在控制台申请并通过审核
模板参数:模板中的变量使用{1}、{2}格式
国际短信:将International参数设为1
错误处理:实际使用需添加更完善的异常处理
限流控制:腾讯云默认限流300次/秒,需注意控制发送频率
注意:以上代码中的部分API调用(如号码包操作)做了简化处理,实际使用时请参考腾讯云官方文档完善具体实现。