SpringBoot调用腾讯云API发送短信
-
打开官网申请申请短信应用,申请签名与模板
-
打开腾讯云的控制台API页面
- 导入maven的依赖,参照官网要求填写签名与模板ID等,在把生成的代码拿过来调试
<dependency>
<groupId>com.tencentcloudapi</groupId>
<artifactId>tencentcloud-sdk-java</artifactId>
<!-- go to https://search.maven.org/search?q=tencentcloud-sdk-java and get the latest version. -->
<!-- 请到https://search.maven.org/search?q=tencentcloud-sdk-java查询所有版本,最新版本如下 -->
<version>3.1.838</version>
</dependency>
public class SendSms
{
public static void main(String [] args) {
try{
// 实例化一个认证对象,入参需要传入腾讯云账户 SecretId 和 SecretKey,此处还需注意密钥对的保密
// 代码泄露可能会导致 SecretId 和 SecretKey 泄露,并威胁账号下所有资源的安全性。以下代码示例仅供参考,建议采用更安全的方式来使用密钥,请参见:https://cloud.tencent.com/document/product/1278/85305
// 密钥可前往官网控制台 https://console.cloud.tencent.com/cam/capi 进行获取
Credential cred = new Credential("SecretId", "SecretKey");
// 实例化一个http选项,可选的,没有特殊需求可以跳过
HttpProfile httpProfile = new HttpProfile();
httpProfile.setEndpoint("sms.tencentcloudapi.com");
// 实例化一个client选项,可选的,没有特殊需求可以跳过
ClientProfile clientProfile = new ClientProfile();
clientProfile.setHttpProfile(httpProfile);
// 实例化要请求产品的client对象,clientProfile是可选的
SmsClient client = new SmsClient(cred, "ap-beijing", clientProfile);
// 实例化一个请求对象,每个接口都会对应一个request对象
SendSmsRequest req = new SendSmsRequest();
String[] phoneNumberSet1 = {"你的手机号"};
req.setPhoneNumberSet(phoneNumberSet1);
req.setSmsSdkAppId("1400849908"); // SDK ID
req.setSignName("我的技术分享个人网"); // 申请的签名名称
req.setTemplateId("1907520"); // 模板ID
String[] templateParamSet1 = {"6666"}; // 测试验证码
req.setTemplateParamSet(templateParamSet1);
// 返回的resp是一个SendSmsResponse的实例,与请求对象对应
SendSmsResponse resp = client.SendSms(req);
// 输出json格式的字符串回包
System.out.println(SendSmsResponse.toJsonString(resp));
} catch (TencentCloudSDKException e) {
System.out.println(e.toString());
}
}
}
- 查看请求返回的信息
{"SendStatusSet":[{"SerialNo":"3369:294906593316931104718082751","PhoneNumber":"手机号","Fee":1,"SessionContext":"","Code":"Ok","Message":"send success","IsoCode":"CN"}],"RequestId":"69aceba9-a43d-434c-9021-e7320ef52d49"}
- 手机查收到短信
继续二次封装成工具类供我们简单使用
1.将调用api需要的参数全部写到yml中
myapp:
secretId: XXXXXXXXXXXXXXXXXXXXXXX
secretKey: XXXXXXXXXXXXXXXXXXXXXXX
smsSdkAppId: XXXXXXXXXXXXXXXXXXXXXXX
signName: XXXXXXXXXXXXXXXXXXXXXXX
TemplateId: XXXXXXXXXXXXXXXXXXXXXXX
2.写一个类接收参数,用ConfigurationProperties自动配置,注意set方法不要写成静态得了
@Component
@ConfigurationProperties(prefix = "myapp")
public class MyAppPropertiesDto {
private static String secretId;
private static String secretKey;
private static String smsSdkAppId;
private static String signName;
private static String TemplateId;
public static String getSecretId() {
return secretId;
}
public void setSecretId(String secretId) {
MyAppPropertiesDto.secretId = secretId;
}
public static String getSecretKey() {
return secretKey;
}
public void setSecretKey(String secretKey) {
MyAppPropertiesDto.secretKey = secretKey;
}
public static String getSmsSdkAppId() {
return smsSdkAppId;
}
public void setSmsSdkAppId(String smsSdkAppId) {
MyAppPropertiesDto.smsSdkAppId = smsSdkAppId;
}
public static String getSignName() {
return signName;
}
public void setSignName(String signName) {
MyAppPropertiesDto.signName = signName;
}
public static String getTemplateId() {
return TemplateId;
}
public void setTemplateId(String templateId) {
MyAppPropertiesDto.TemplateId = templateId;
}
}
3.在写一个工具类帮我们实现封装这些配置,只需要传入手机号和验证码即可发送参数。
@Component
@Slf4j
public class SmsUtil {
private static SmsClient client = null;
// 初始化操作
@PostConstruct // 对象创建的时候执行
public void init() {
client = createClient(MyAppPropertiesDto.getSecretId(), MyAppPropertiesDto.getSecretKey());
}
// 提供一个公共方法发送验证码
public static void smsValicode(String phone, String code) {
// 实例化一个请求对象,每个接口都会对应一个request对象
SendSmsRequest req = new SendSmsRequest();
String[] phoneNumberSet1 = {phone}; // 手机号
req.setPhoneNumberSet(phoneNumberSet1);
req.setSmsSdkAppId(MyAppPropertiesDto.getSmsSdkAppId()); // sdkId
req.setSignName(MyAppPropertiesDto.getSignName()); // 签名
req.setTemplateId(MyAppPropertiesDto.getTemplateId()); // 模板Id
String[] templateParamSet1 = {code}; // 发送的验证码
req.setTemplateParamSet(templateParamSet1);
// 返回的resp是一个SendSmsResponse的实例,与请求对象对应
SendSmsResponse resp = null;
try {
resp = client.SendSms(req);
} catch (TencentCloudSDKException e) {
log.info("create Sms client error ");
throw new RuntimeException(e);
}
// 输出json格式的字符串回包
System.out.println(SendSmsResponse.toJsonString(resp));
}
// 创建客户端
private static SmsClient createClient(String secretId, String secretKey) {
// 实例化一个认证对象,入参需要传入腾讯云账户 SecretId 和 SecretKey,此处还需注意密钥对的保密
// 代码泄露可能会导致 SecretId 和 SecretKey 泄露,并威胁账号下所有资源的安全性。以下代码示例仅供参考,建议采用更安全的方式来使用密钥,请参见:https://cloud.tencent.com/document/product/1278/85305
// 密钥可前往官网控制台 https://console.cloud.tencent.com/cam/capi 进行获取
Credential cred = new Credential(secretId, secretKey);
// 实例化一个http选项,可选的,没有特殊需求可以跳过
HttpProfile httpProfile = new HttpProfile();
httpProfile.setEndpoint("sms.tencentcloudapi.com");
// 实例化一个client选项,可选的,没有特殊需求可以跳过
ClientProfile clientProfile = new ClientProfile();
clientProfile.setHttpProfile(httpProfile);
// 实例化要请求产品的client对象,clientProfile是可选的
SmsClient client = new SmsClient(cred, "ap-beijing", clientProfile);
return client;
}
}
4.最后写成接口直接调用即可
@RestController
public class SmsController {
@GetMapping("/sms")
public String sendSms() {
SmsUtil.smsValicode("手机号", "2654");
return "ok";
}
}
总结
代码写的略显粗糙,总体无伤大雅,仅为学习所用。
评论区