本文使用SpringBoot 框架,针对腾讯云发送短信方法做了一定程度的封装。
准备工作1. 首先需要开通腾讯云的短信服务参考:
腾讯云发送短信验证码服务—csdn
首次开通会赠送100条短信的免费额度,用于个人的测试完全够了
2. 申请签名和模板 由【控制台】进入短信的管理界面,选择【快速入门】,平台将会引导创建签名和短信模板(图中已经创建完成且审核通过)
注意:创建的签文和模板都属于国内短信
创建签名:
如果选择签名类型为网站则必须要有一个已经备案的域名
注意:
-
假设网站备案名称为【腾讯云】,那么签名内容需要变为【腾讯云个人网】,否者审核不会通过
-
证明材料必须要上传网站备案的后台截图,如果是ICP备案查询的截图无法通过审核
-
申请说明中填写自己的备案域名即可
如果没有备案域名也可以申请一个个人公众号,然后再选择【签名类型】为公众号创建一个签名。
创建模板:
模板的审核比签名更简单,只需要符合规范即可,不需要证明材料,直接使用标准模板审核成功率更高。
最后等待审核通过。
代码编写参考:
腾讯云短信服务Java SDK
具体使用请参考官方文档。本文使用 SpringBoot 开发,对官方文档中发送短信的方法做了一定程度的封装。
本文使用的短信模板为:
您正在申请手机注册,验证码为:{1},{2}分钟内有效!
参数提取
首先将腾讯云短信服务的一些相关参数提取出来,作为一个配置类,从配置类中读取相关参数
@Data // lombok 省略get/set方法
@Component
@ConfigurationProperties(prefix = "tencent.sms") // 读取配置文件中tencent.sms 为前缀的配置信息
public class TencentSmsProperties {
private String secretId;
private String secretKey;
private String sdkAppId;
private String signName;
private Map templateIdMap;
String senderid = "";
private String extendCode = "";
}
配置文件 application.yml:
# 腾讯云短信服务
tencent:
sms:
secret-id: "AKIXXXXXoCQO5VeW7RVJp42kBKCn7AwXXXXX"
secret-key: "A3kAXXXXXvRgtqWv3uUnoY1EBsIXXXXX"
sdk-app-id: 1400611234
sign-name: "网站名称个人网"
# 模板ID映射,key任意设置,value为审核通过模板ID
template-id-map:
register: "1260123"
forget: "1260258"
# 以下两项非必填
# senderid: ""
# extend-code: ""
SpringBoot 将会自动把以上配置信息注入TencentSmsProperties类中,可以通过自动注入注解获取
编写Service层@Service
public class MsmServiceImpl implements MsmService {
public static final int REGISTER_CODE_VALID_TIME = 5;
@Resource
TencentSmsProperties smsProperties;
@Autowired
private RedisTemplate redisTemplate;
@Override
public boolean checkVerCodeIsExist(String phoneNum) {
String verCode = redisTemplate.opsForValue().get(phoneNum);
return !StringUtils.isEmpty(verCode);
}
@Override
public boolean sendVerCodeToPhone(String phoneNum,
String sessionContext,
String templateId,
String[] templateParamSet) {
try {
Credential cred = new Credential(smsProperties.getSecretId(),
smsProperties.getSecretKey());
// 实例化一个http选项,可选,没有特殊需求可以跳过
HttpProfile httpProfile = new HttpProfile();
// 设置代理
// httpProfile.setProxyHost("真实代理ip");
// httpProfile.setProxyPort(真实代理端口);
httpProfile.setReqMethod("POST");
httpProfile.setConnTimeout(60);
httpProfile.setEndpoint("sms.tencentcloudapi.com");
ClientProfile clientProfile = new ClientProfile();
clientProfile.setSignMethod("HmacSHA256");
clientProfile.setHttpProfile(httpProfile);
SmsClient client = new SmsClient(cred, "ap-guangzhou",clientProfile);
SendSmsRequest req = new SendSmsRequest();
String sdkAppId = smsProperties.getSdkAppId();
req.setSmsSdkAppId(sdkAppId);
String signName = smsProperties.getSignName();
req.setSignName(signName);
String senderid = smsProperties.getSenderid();
req.setSenderId(senderid);
// String sessionContext = "xxx";
req.setSessionContext(sessionContext);
String extendCode = smsProperties.getExtendCode();
req.setExtendCode(extendCode);
// String templateId = smsProperties.getTemplateIdMap().get("register");
req.setTemplateId(templateId);
String[] phoneNumberSet = {phoneNum};
req.setPhoneNumberSet(phoneNumberSet);
// String[] templateParamSet = {"5678", "5"};
req.setTemplateParamSet(templateParamSet);
SendSmsResponse res = client.SendSms(req);
// 输出json格式的字符串回包
// System.out.println(SendSmsResponse.toJsonString(res));
// 也可以取出单个值,你可以通过官网接口文档或跳转到response对象的定义处查看返回字段的定义
// System.out.println(res.getRequestId());
} catch (TencentCloudSDKException e) {
e.printStackTrace();
return false;
}
return true;
}
@Override
public boolean sendRegisterVerCode(String phoneNum) {
// 格式校验... ; 防止短信验证码接口被恶意调用攻击...
// 使用 hutool 工具包生成6位随机数
String verCode = RandomUtil.randomNumbers(6);
String[] templateParamSet = new String[]{verCode, REGISTER_CODE_VALID_TIME + ""};
// 将验证码缓存至redis中并设置过期时间
redisTemplate.opsForValue().set(phoneNum, verCode, REGISTER_CODE_VALID_TIME, TimeUnit.MINUTES);
return sendVerCodeToPhone(phoneNum,
"userId",
smsProperties.getTemplateIdMap().get("register"),
templateParamSet);
}
}
以上代码中使用了redis缓存验证码,可以更具项目需求进行更换。控制层代码根据项目需求完成即可,这里不贴代码。
注意:如果项目有上线需求一定要做好对于短信验证码接口被恶意调用的防范措施 ===> 参考
参考资料- 如何防止短信验证码接口被恶意调用攻击?
- 腾讯云发送短信验证码服务—csdn
- 腾讯云短信服务Java SDK—官方文档
个人博客地址:https://orange-code.gitee.io/



