springboot 集成腾讯云国内短信
国内短信快速入门
步骤1:开通短信服务
注册腾讯云账号
- 如果您还没有腾讯云账号,您需要 注册腾讯云 账号,并完成 企业实名认证。
- 如果您已有实名认证的腾讯云账号,请直接进行下一步操作。
申请开通短信服务
说明:
首次登录短信控制台时,需要申请开通短信服务。
- 登录 短信控制台,勾选【我已阅读并同意 腾讯云短信 服务协议】,单击【开始接入】即可开通。
- 在左侧导航栏选择【快速入门】,单击【开始创建】进入短信发送流程指引页面。
步骤2:配置短信内容
一个完整的短信由短信签名和短信正文内容组成,您可以根据业务需求分别设置不同的模板,然后组合成最终短信内容:【短信签名】短信正文内容
。短信签名和模板提交后,我们会在2个小时左右完成审核,如有需求可设置常用手机和邮箱,用于及时接收该应用短信内容审核通知。
创建签名
- 在 快速入门 页面,单击【开始创建】。
结合实际情况和 签名审核标准 设置以下参数:
- 签名用途:选择【自用(签名为本账号实名认证的公司、网站、产品名等)】。
- 签名类型:选择【公司】。
- 签名内容:输入
腾讯云
。 - 证明类型:选择【三证合一】。
- 证明上传:上传证书照片或扫描件。
- 单击【确定】。
等待签名审核,当状态变为【已通过】时,短信签名才可用。
创建正文模板
- 在 快速入门 页面,单击【开始创建】。
结合实际情况和 正文模板审核标准 设置以下参数:
- 模板名称:输入
验证码
。 - 短信类型:选择【普通短信】。
- 短信内容:输入
您的验证码是:{1}
。
- 模板名称:输入
- 单击【确定】。
等待正文模板审核,当状态变为【已通过】时,正文模板才可用。
步骤3:等待审核
短信签名和正文模板提交后,我们将会在2个小时左右完成审核,如有需求可设置常用手机和邮箱,用于及时接收短信内容审核通知。
在 快速入门 页面,您可以单击【查看】快速查看签名或正文模板的审核状态,待签名与正文模板状态变为【已通过】时才可用。
步骤4:发送短信
1. 接口描述
接口请求域名: sms.tencentcloudapi.com 。
短信发送接口,用户给用户发短信验证码、通知类短信或营销短信。
- 注:由于云 API3.0 安全性有所提升,所以接口鉴权较为复杂,建议使用 SDK 来使用云短信服务。
- 您可以在 API 3.0 Explorer 中直接运行该接口,可以先免去签名计算步骤。运行成功后,API Explorer可以自动生成SDK代码示例。
默认接口请求频率限制:3000次/秒。
推荐使用 API Explorer
点击调试
API Explorer 提供了在线调用、签名验证、SDK 代码生成和快速检索接口等能力。您可查看每次调用的请求内容和返回结果以及自动生成 SDK 调用示例。
2. 输入参数
以下请求参数列表仅列出了接口请求参数和部分公共参数,完整公共参数列表见 公共请求参数。
参数名称 | 必选 | 类型 | 描述 |
---|---|---|---|
Action | 是 | String | 公共参数,本接口取值:SendSms。 |
Version | 是 | String | 公共参数,本接口取值:2019-07-11。 |
Region | 否 | String | 公共参数,本接口不需要传递此参数。 |
PhoneNumberSet.N | 是 | Array of String | 下发手机号码,采用 e.164 标准,格式为+[国家或地区码][手机号],单次请求最多支持200个手机号且要求全为境内手机号或全为境外手机号。 例如:+8613711112222, 其中前面有一个+号 ,86为国家码,13711112222为手机号。 |
TemplateID | 是 | String | 模板 ID,必须填写已审核通过的模板 ID。模板ID可登录 短信控制台 查看,若向境外手机号发送短信,仅支持使用国际/港澳台短信模板。 |
SmsSdkAppid | 是 | String | 短信SdkAppid在 短信控制台 添加应用后生成的实际SdkAppid,示例如1400006666。 |
Sign | 否 | String | 短信签名内容,使用 UTF-8 编码,必须填写已审核通过的签名,签名信息可登录 短信控制台 查看。注:国内短信为必填参数。 |
TemplateParamSet.N | 否 | Array of String | 模板参数,若无模板参数,则设置为空。 |
ExtendCode | 否 | String | 短信码号扩展号,默认未开通,如需开通请联系 sms helper。 |
SessionContext | 否 | String | 用户的 session 内容,可以携带用户侧 ID 等上下文信息,server 会原样返回。 |
SenderId | 否 | String | 国内短信无senderid,无需填写该项;若需开通国际/港澳台短信senderid,请联系smshelper。 |
3. 输出参数
参数名称 | 类型 | 描述 |
---|---|---|
SendStatusSet | Array of SendStatus | 短信发送状态。 |
RequestId | String | 唯一请求 ID,每次请求都会返回。定位问题时需要提供该次请求的 RequestId。 |
项目结构
SmsConfiguration.java
package com.demo.config;
import cn.hutool.core.util.StrUtil;
import com.tencentcloudapi.common.Credential;
import com.tencentcloudapi.sms.v20190711.SmsClient;
import com.tencentcloudapi.sms.v20190711.models.SendSmsRequest;
import com.tencentcloudapi.sms.v20190711.models.SendSmsResponse;
import com.tencentcloudapi.sms.v20190711.models.SendStatus;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Configuration;
/**
* @author 闰土的猹猹君
*/
@Configuration(proxyBeanMethods = false)
@EnableConfigurationProperties(SmsProperties.class)
public class SmsConfiguration {
private SmsProperties smsProperties;
public SmsConfiguration(SmsProperties smsProperties) {
this.smsProperties = smsProperties;
}
/**
* 发送验证码
*
* @param phone 手机号
* @param code 验证码
*/
public void sendSms(String phone, int code) {
try {
/* 必要步骤:
* 实例化一个认证对象,入参需要传入腾讯云账户密钥对 secretId 和 secretKey
* 本示例采用从环境变量读取的方式,需要预先在环境变量中设置这两个值
* 您也可以直接在代码中写入密钥对,但需谨防泄露,不要将代码复制、上传或者分享给他人
* CAM 密钥查询:https://console.cloud.tencent.com/cam/capi*/
Credential cred = new Credential(smsProperties.getSecretId(), smsProperties.getSecretKey());
/* 实例化 SMS 的 client 对象
* 第二个参数是地域信息,可以直接填写字符串 ap-guangzhou,或者引用预设的常量 */
SmsClient client = new SmsClient(cred, "ap-guangzhou");
/* 实例化一个请求对象,根据调用的接口和实际情况,可以进一步设置请求参数
* 您可以直接查询 SDK 源码确定接口有哪些属性可以设置
* 属性可能是基本类型,也可能引用了另一个数据结构
* 推荐使用 IDE 进行开发,可以方便地跳转查阅各个接口和数据结构的文档说明 */
SendSmsRequest req = new SendSmsRequest();
/* 填充请求参数,这里 request 对象的成员变量即对应接口的入参
* 您可以通过官网接口文档或跳转到 request 对象的定义处查看请求参数的定义
* 基本类型的设置:
* 帮助链接:
* 短信控制台:https://console.cloud.tencent.com/smsv2
* sms helper:https://cloud.tencent.com/document/product/382/3773 */
/* 短信应用 ID: 在 [短信控制台] 添加应用后生成的实际 SDKAppID,例如1400006666 */
req.setSmsSdkAppid(smsProperties.getAppId());
/* 短信签名内容: 使用 UTF-8 编码,必须填写已审核通过的签名,可登录 [短信控制台] 查看签名信息 */
req.setSign(smsProperties.getSign());
/* 模板 ID: 必须填写已审核通过的模板 ID,可登录 [短信控制台] 查看模板 ID */
req.setTemplateID(smsProperties.getTemplateId());
req.setTemplateParamSet(new String[]{"" + code, "3"});
/* 下发手机号码,采用 e.164 标准,+[国家或地区码][手机号]
* 例如+8613711112222, 其中前面有一个+号 ,86为国家码,13711112222为手机号,最多不要超过200个手机号*/
String[] phoneNumbers = new String[1];
phoneNumbers[0] = StrUtil.format("+86{}", phone);
req.setPhoneNumberSet(phoneNumbers);
/* 通过 client 对象调用 SendSms 方法发起请求。注意请求方法名与请求对象是对应的
* 返回的 res 是一个 SendSmsResponse 类的实例,与请求对象对应 */
SendSmsResponse res = client.SendSms(req);
SendStatus[] sendStatusSet = res.getSendStatusSet();
SendStatus sendStatus = sendStatusSet[0];
if ("Ok".equals(sendStatus.getCode())) {
// 发送短信成功,存储这个验证码,后续验证
}
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 生成验证码
*
* @param len 长度
* @return
*/
public int randomNum(int len) {
StringBuffer sb = new StringBuffer("1");
for (int i = 0; i < len; i++) {
sb.append("0");
}
int value = Integer.parseInt(sb.toString());
return (int) (Math.random() * (value * 0.9) + (value * 0.1));
}
}
SmsProperties.java
package com.demo.config;
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
/**
* @author 闰土的猹猹君
*/
@Data
@ConfigurationProperties(prefix = "sms")
public class SmsProperties {
/**
* 腾讯云账户密钥对 secretId
*/
private String secretId;
/**
* 腾讯云账户密钥对 secretKey
*/
private String secretKey;
/**
* 短信应用 ID
*/
private String appId;
/**
* 短信签名内容
*/
private String sign;
/**
* 模板 ID
*/
private String templateId;
}
SmsController.java
package com.demo.controller;
import com.demo.config.SmsConfiguration;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
/**
* @author 闰土的猹猹君
*/
@RestController
public class SmsController {
@Autowired
private SmsConfiguration smsConfiguration;
/**
* 发送验证码
*
* @param phone 手机号
*/
@RequestMapping("/sendSms")
public void sendSms(
@RequestParam("phone") String phone
) {
smsConfiguration.sendSms(phone, smsConfiguration.randomNum(6));
}
}
DemoApplication.java
package com.demo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
/**
* @author 闰土的猹猹君
*/
@SpringBootApplication
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}
application.yml
sms:
app-id: #短信应用 ID
secret-id: #腾讯云账户密钥对 secretId
secret-key: #腾讯云账户密钥对 secretKey
template-id: #模板 ID
sign: #短信签名内容
pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.example</groupId>
<artifactId>springboot-sms</artifactId>
<version>1.0-SNAPSHOT</version>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.4.3</version>
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
</dependency>
<!--腾讯云短信-->
<dependency>
<groupId>com.tencentcloudapi</groupId>
<artifactId>tencentcloud-sdk-java</artifactId>
<version>3.1.62</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>5.6.1</version>
</dependency>
</dependencies>
</project>
还没有评论,来说两句吧...