下面是一个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**********EGTIOsecret-key: Gu5t9xGARN**********7vCKsdk-app-id: 1400****sign-name: 腾讯云测试region: ap-guangzhoutemplate-id: 1234567conn-timeout: 60write-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;@Autowiredpublic 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;@Autowiredpublic 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;@Autowiredpublic 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;@Autowiredpublic 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); // 格式: yyyyMMddreq.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;@Autowiredpublic 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"; // 验证码模板IDString 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调用(如号码包操作)做了简化处理,实际使用时请参考腾讯云官方文档完善具体实现。