腾讯云短信实战:Spring Boot接入YML配置与签名/模板/发送/统计/状态/号码包工具类详解

发布于:2025-07-16 ⋅ 阅读:(18) ⋅ 点赞:(0)

下面是一个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();
        }
    }
}

关键说明:

  1. 认证信息:SecretId/SecretKey在腾讯云控制台获取

  2. 短信签名:需提前在控制台申请并通过审核

  3. 模板参数:模板中的变量使用{1}、{2}格式

  4. 国际短信:将International参数设为1

  5. 错误处理:实际使用需添加更完善的异常处理

  6. 限流控制:腾讯云默认限流300次/秒,需注意控制发送频率

注意:以上代码中的部分API调用(如号码包操作)做了简化处理,实际使用时请参考腾讯云官方文档完善具体实现。


网站公告

今日签到

点亮在社区的每一天
去签到