个人项目:社交支付项目(小老板)
作者:三哥(https://j3cod3.cn)
本篇为从 0 到 1 的一个,用 Java 对接腾讯短信发送功能的一篇流程文章。而标题中的 44 大洋则是用来购买短信套餐,当然如果你是首次使用腾讯云平台则可以享受【免费使用】这一功能(我是老用户)。
那,废话不多说,我们往下看对接步骤。
1、短信套餐
我们先来购买以下短信套餐,这里选择腾讯云,地址:
https://cloud.tencent.com/act/cps/redirect?redirect=2496&cps_key=85dced045eb1cad8a10f2c9f393eb308&from=console
当然,套餐我们有两种选择方式:
- 免费试用
- 购买
1)先来看看,免费试用
-
点击云通信中的短信服务
2)再来看,购买套餐
-
地址:https://cloud.tencent.com/act/pro/618season?cps_key=85dced045eb1cad8a10f2c9f393eb308&fromSource=gwzcw.6731510.6731510.6731510&utm_id=gwzcw.6731510.6731510.6731510&utm_medium=cps&page=seckill_season
3)如果购买了或者有试用套餐,这里会显示你的套餐信息
我这里是用了 44 块钱购买了一个套餐,但是它附赠了 100 条短信,所以我一共有 1100 条短信发送的资格。
2、短信配置
短信配置主要分三部分:
- 签名
- 模板
- 应用
进入短信控制台,先完成如下部分的内容填写:
注意:这里选择的类型是个人网站,所以必须要有已备案的域名信息
填写信息这里就不截图了,如果你有已经备案的域名,那么就按照人家给的步骤一次填写就行。至于短信模板就是你要发给用户的一段中文内容,当然里面也可以预留占位符,灵活改变内容。
如果信息填写成功,并审核通过之后会回显如下内容:
接着就要开始创建应用了:
3、创建你的云 API 密钥
地址:https://console.cloud.tencent.com/cam/capi
ok,此刻我们的所有准备工作都已经做完了,那此时我们应有如下的资源:
- 短信套餐(就是你能发送多少条短信的资格)
- 短信签名
- 短信模板
- 应用
- 云 API
4、Java 编码实现短信发送
现在是万事俱备了,就差写代码实现了。而因为腾讯对于 API 鉴权这块非常复杂所以腾讯建议我们使用他们提供的 SDK 进行开发,所以本次代码的编写也其 SDK 上做了一些微调而已。
1)引入依赖:
<!-- 腾讯短信sdk -->
<dependency>
<groupId>com.tencentcloudapi</groupId>
<artifactId>tencentcloud-sdk-java</artifactId>
<version>3.1.270</version>
</dependency>
2)编写短信发送 util
// 注意引入 lombok
@Slf4j
public class SendSmsUtil {
public static Boolean sendSms(SendSmsRequest request) {
Credential cred = new Credential(request.getSecretId(), request.getSecretKey());
SmsClient client = new SmsClient(cred, "ap-guangzhou");
final var req = new com.tencentcloudapi.sms.v20210111.models.SendSmsRequest();
req.setPhoneNumberSet(new String[]{"+86" + request.getPhone()});
req.setSmsSdkAppId(request.getSmsSdkAppId());
req.setSignName(request.getSignName());
req.setTemplateId(request.getTemplateId());
req.setTemplateParamSet(request.getTemplateParamSet());
SendSmsResponse res = null;
try {
res = client.SendSms(req);
} catch (TencentCloudSDKException e) {
log.error("发送短信出错:", e);
return Boolean.FALSE;
}
log.error("发送短信结果:", SendSmsResponse.toJsonString(res));
if (Objects.nonNull(res.getSendStatusSet()) && res.getSendStatusSet().length > 0 && "Ok".equals(res.getSendStatusSet()[0].getCode())){
return Boolean.TRUE;
}
return Boolean.FALSE;
}
/**
* 参数对象
*/
@Data
public static class SendSmsRequest {
/**
* 电话
*/
private String phone;
/**
* 短信签名内容,必须填写已审核通过的签名
*/
private String signName;
/**
* 模板 ID: 必须填写已审核通过的模板 ID
*/
private String templateId;
/**
* 模板参数: 模板参数的个数需要与 TemplateId 对应模板的变量个数保持一致,若无模板参数,则设置为空
*/
private String[] templateParamSet;
/**
* 应用id
*/
private String smsSdkAppId;
/**
* 云api密钥中的 secretId
*/
private String secretId;
/**
* 云api密钥中的 secretKey
*/
private String secretKey;
}
}
3)测试
public class SendSmsUtil {
public static void main(String[] args) {
SendSmsRequest request = new SendSmsRequest();
request.setPhone("电话");
request.setSmsSdkAppId("应用id");
request.setSecretId("API的SecretId");
request.setSecretKey("API的SecretKey");
request.setSignName("签名内容");
request.setTemplateId("模板id");
// 这个值,要看你的模板中是否预留了占位符,如果没有则不需要设置
request.setTemplateParamSet(new String[]{"模板中的参数值,如果没有则为空"});
SendSmsUtil.sendSms(request);
}
}
此时,手机会收到一条短信:
到此呢,我们对接腾讯短信这一功能就算是实现了,但是这仅仅是开发的一部分,我们只是封装了一个小小的发送短信工具类而已。还没有结合具体的业务来运用这个短信发送功能,后续我打算用该功能实现一个用户注册,并考虑性能、安全等因素对其进行优化。