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

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

关键说明:

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

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

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

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

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

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/news/914599.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/914599.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Java篇】IntelliJ IDEA 安装与基础配置指南

序 本篇文章将介绍IDEA 2023 版本。 提高开发人员的生产力。无论您是刚开始接触编程的新手&#xff0c;还是经验丰富的开发专家。 一&#xff1a;官网下载安装包&#xff1a; IDEA下载链接 这个版本可以根据自己的需要选择。 二、安装方法 双击进这个.exe文件 这里要选择合…

2-Nodejs运行JS代码

2-Nodejs运行JS代码 创建一个 js 文件编写 JS 代码 要注意的是&#xff0c;在nodejs环境中不能操作浏览器 DOM 对象相关的api&#xff0c;在Nodejs 中运行 JS 代码 按住 shift 键&#xff0c;在 js 文件所在文件夹空白处右键&#xff0c;选择 Powershell 窗口执行如下命令&…

vue中使用西瓜播放器xgplayer (封装)+xgplayer-hls 播放.m3u8格式视频

1.西瓜播放器官网 http://h5player.bytedance.com/guide/2.安装 # 最新稳定版 $ npm install xgplayer对于已有项目也可以通过 CDN 引入&#xff0c;代码如下&#xff1a; <script src"//unpkg.byted-static.com/xgplayer/2.31.2/browser/index.js" type"tex…

2025-07-15通过边缘线检测图像里的主体有没有出血

本节观点&#xff1a;一个好的提问就已经解决了问题的90%。 对于问题的描述正确与否决定了解决问题的方法和路径&#xff0c;所以我们在AI时代必须要学会正确的描述问题和表达问题&#xff0c;否则即使有AI辅助也是很难精准的解决问题。 我的问题&#xff1a; 如何利用代码从图…

【Docker基础】Dockerfile指令速览:文件与目录操作指令详解

目录 引言 1 ADD&#xff1a;高级文件复制与解压 1.1 指令简介 1.2 语法 1.3 功能详解 1.4 使用场景 1.5 执行流程 1.6 示例 1.7 注意事项 2 WORKDIR&#xff1a;设置工作目录 2.1 指令简介 2.2 语法 2.3 使用场景 2.4 创建流程 2.5 示例 2.6 注意事项 3 VOLU…

Python 程序设计讲义(2):Python 概述

Python 程序设计讲义&#xff08;2&#xff09;&#xff1a;Python 概述 一、Python 语言的发展史 Python 语言诞生于 1990 年。 2002 年 10 月&#xff0c;Python2.0 正式发布。 2008 年 12 月&#xff0c;Python3.0 正式发布。 Python3.0 在语法层面和解释器内部做了很多重大…

多租户SaaS系统中设计安全便捷的跨租户流程共享

四维协同架构​​,结合动态授权、加密传输、行为审计和智能策略 一、​​权限控制体系​​ 1. ​​动态权限模型​ ​ 2. ​​授权策略实现​​ ​​RBAC+ABAC混合模型​​ 在流程表增加shared_tenants字段存储授权信息,结合属性动态校验: CREATE TABLE workflow_process…

Spring Ioc Bean 到底是什么

Bean 到底是什么&#xff1f; 简单来说&#xff0c;Spring Bean 就是一个由 Spring IoC 容器负责创建、管理和装配的 Java 对象。 它不是一种新的技术&#xff0c;它本质上还是一个普普通通的 Java 对象&#xff08;POJO - Plain Old Java Object&#xff09;&#xff0c;但它的…

【PCIe 总线及设备入门学习专栏 5.1.1 -- PCIe PERST# 信号的作用】

文章目录 PCIe PERSTN#PERST# 信号作用概述简要定义PERST# 的关键功能PERST# 的时序图示意Synopsys PCIe EP IP 中 PERST# 的作用关键信号接口典型复位流程示例代码(Verilog for Synopsys PCIe)PERST# 使用场景举例(Synopsys PCIe EP)1. 系统上电初始化2. 热复位特定设备3.…

使用python的pillow模块将图片转化为灰度图,获取值和修改值

使用python的pillow模块可以将图片转化为灰度图&#xff0c; 可以获取灰度图的特定点值&#xff0c;区域值&#xff0c; 修改值并保存到图片 图片转换为灰度图 from PIL import Image# 打开图片 image Image.open("d://python//2//1.jpg")gray_image image.convert…

记忆力训练day41

通常是一个地点记2组词 数字和人体记忆宫殿更注重 即时性&#xff1b;地点记忆宫殿是长久性

自动微分模块

一.前言本章节我们是要学习梯队计算&#xff0c;⾃动微分&#xff08;Autograd&#xff09;模块对张量做了进⼀步的封装&#xff0c;具有⾃动求导功能。⾃动微分模块是构成神经⽹络 训练的必要模块&#xff0c;在神经⽹络的反向传播过程中&#xff0c;Autograd 模块基于正向计算…

深度学习·目标检测和语义分割基础

边缘框 不是标准的x&#xff0c;y坐标轴。边缘框三种表示&#xff1a;左上右下下坐标&#xff0c;左上坐标长宽&#xff0c;中心坐标长宽 COCO 目标检测数据集的格式&#xff1a;注意一个图片有多个物体&#xff0c;使用csv或者文件夹结构的格式不可取。 锚框算法 生成很多…

ffmpeg音视频处理大纲

FFmpeg 是一个功能强大的开源音视频处理工具集&#xff0c;其核心代码以 C 语言实现。下面从源码角度分析 FFmpeg 如何实现转码、压缩、提取、截取、拼接、合并和录屏等功能&#xff1a; 一、FFmpeg 核心架构与数据结构 FFmpeg 的源码结构围绕以下核心组件展开&#xff1a; lib…

网络安全小练习

一、docker搭建 1.安装 2.改变镜像源&#xff08;推荐国内镜像源&#xff1a;阿里云镜像源&#xff09; 登录阿里云容器镜像源服务&#xff08; 阿里云登录 - 欢迎登录阿里云&#xff0c;安全稳定的云计算服务平台 &#xff09; 复制系统分配的专属地址 配置 sudo mkdir …

数据结构——顺序表的相关操作

一、顺序表基础认知​1.顺序表的定义与特点​顺序表是数据结构中一种线性存储结构&#xff0c;它将数据元素按照逻辑顺序依次存储在一片连续的物理内存空间中。简单来说&#xff0c;就是用一段地址连续的存储单元依次存放线性表的元素&#xff0c;且元素之间的逻辑关系通过物理…

2025最新国产用例管理工具评测:Gitee Test、禅道、蓝凌测试、TestOps 哪家更懂研发协同?

在快节奏的 DevOps 时代&#xff0c;测试用例管理已不再是 QA 的独角戏&#xff0c;而是穿透需求—开发—测试—交付全流程的核心枢纽。想象一下&#xff0c;如果用例结构混乱&#xff0c;覆盖不全&#xff0c;甚至丢失版本变更历史&#xff0c;不仅协作乱&#xff0c;还影响交…

在线评测系统开发交流

https://space.bilibili.com/700332132?spm_id_from333.788.0.0 实验内容爬虫Web系统设计数据分析实验指导爬虫Web系统设计自然语言处理与信息检索数据可视化评分标准FAQ实验二&#xff1a;在线评测系统实验概述实验内容Step1&#xff1a;题目管理Step2&#xff1a;题目评测S…

Linux操作系统从入门到实战(十)Linux开发工具(下)make/Makefile的推导过程与扩展语法

Linux操作系统从入门到实战&#xff08;十&#xff09;Linux开发工具&#xff08;下&#xff09;make/Makefile的推导过程与扩展语法前言一、 make/Makefile的推导过程1. 先看一个完整的Makefile示例2. make的工作流程&#xff08;1&#xff09;寻找Makefile文件&#xff08;2&…

NFS磁盘共享

步骤&#xff1a;注意事项‌&#xff1a;确保服务端防火墙关闭&#xff0c;或者允许2049端口通信&#xff0c;客户端需具备读写权限。服务器端安装NFS服务器&#xff1a;sudo apt-get install nfs-kernel-server # Debian/Ubuntu sudo yum install nfs-utils # Ce…