废话不多说 直接开始
首先我们加入依赖
com.tencentcloudapi
tencentcloud-sdk-java
3.1.62
我把它封装在一个util类里面了 大家可以直接拿着用
package cn.kgc.qh.util;
import com.netflix.client.ClientException;
import com.tencentcloudapi.common.Credential;
import com.tencentcloudapi.common.exception.TencentCloudSDKException;
import com.tencentcloudapi.common.profile.ClientProfile;
import com.tencentcloudapi.common.profile.HttpProfile;
import com.tencentcloudapi.sms.v20190711.SmsClient;
import com.tencentcloudapi.sms.v20190711.models.SendSmsRequest;
import com.tencentcloudapi.sms.v20190711.models.SendSmsResponse;
import org.springframework.stereotype.Component;
/**
* @Description: TODO
* @author: 小孟
* @date: 2021年12月20日 13:23
*/
@Component
public class TengXunSMSUtils {
public static final String VALIDATE_CODE = "866988";
publicboolean sendShortMessage(String templateCode, String phoneNum, String param) throws ClientException {
try {
/*
* CAM 密钥查询:https://console.cloud.tencent.com/cam/capi
*/
Credential cred = new Credential("secretId", "secretKey");
// 无特殊需求可以跳过
HttpProfile httpProfile = new HttpProfile();
httpProfile.setReqMethod("POST");
httpProfile.setConnTimeout(60);
httpProfile.setEndpoint("sms.tencentcloudapi.com");
ClientProfile clientProfile = new ClientProfile();
clientProfile.setSignMethod("HmacSHA256");
clientProfile.setHttpProfile(httpProfile);
/* 实例化 SMS 的 client 对象
* 第二个参数是地域信息,可以直接填写字符串 ap-guangzhou,或者引用预设的常量 */
SmsClient client = new SmsClient(cred, "ap-guangzhou", clientProfile);
/* 实例化一个请求对象,根据调用的接口和实际情况,可以进一步设置请求参数
* 您可以直接查询 SDK 源码确定接口有哪些属性可以设置
* 属性可能是基本类型,也可能引用了另一个数据结构
* 推荐使用 IDE 进行开发,可以方便地跳转查阅各个接口和数据结构的文档说明 */
com.tencentcloudapi.sms.v20190711.models.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 */
String SdkAppid = "这里必填";
req.setSmsSdkAppid(SdkAppid);
/* 短信签名内容: 使用 UTF-8 编码,必须填写已审核通过的签名,可登录 [短信控制台] 查看签名信息 */
String sign = "自己签名";
req.setSign(sign);
/* 国际/港澳台短信 senderid: 国内短信填空,默认未开通,如需开通请联系 [sms helper] */
String senderid = "";
req.setSenderId(senderid);
/* 模板 ID: 必须填写已审核通过的模板 ID,可登录 [短信控制台] 查看模板 ID */
req.setTemplateID(templateCode);
/* 下发手机号码,采用 e.164 标准,+[国家或地区码][手机号]
* 例如+8613711112222, 其中前面有一个+号 ,86为国家码,13711112222为手机号,最多不要超过200个手机号*/
String[] phoneNumber = {"+86" + phoneNum + ""};
req.setPhoneNumberSet(phoneNumber);
/* 模板参数: 若无模板参数,则设置为空*/
String[] templateParams = {param};
req.setTemplateParamSet(templateParams);
/* 通过 client 对象调用 SendSms 方法发起请求。注意请求方法名与请求对象是对应的
* 返回的 res 是一个 SendSmsResponse 类的实例,与请求对象对应 */
SendSmsResponse res = client.SendSms(req);
// 输出 JSON 格式的字符串回包
System.out.println(SendSmsResponse.toJsonString(res));
// 可以取出单个值,您可以通过官网接口文档或跳转到 response 对象的定义处查看返回字段的定义
System.out.println(res.getRequestId());
} catch (TencentCloudSDKException e) {
e.printStackTrace();
}
return true;
}
}
这里写个控制器测试一下:
- 第一个参数 模板ID
- 第二个参数 手机号
- 第三个参数 验证码 这里我没有用随机数产生
package cn.kgc.qh.controller;
import cn.kgc.qh.util.TengXunSMSUtils;
import com.netflix.client.ClientException;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
/**
* @Description: TODO
* @author: 小孟
* @date: 2021年12月20日 13:34
*/
@RestController
@RequestMapping("/TXController")
public class TXController {
@Resource
private TengXunSMSUtils tengXunSMSUtils;
@PostMapping("/TX")
public boolean TX(@RequestParam String templateCode, @RequestParam String phoneNum, @RequestParam String param)
throws ClientException {return tengXunSMSUtils.sendShortMessage(templateCode, phoneNum, param);
}
}
下面是短信发送成功后 1分钟之内不能发送短信,redis中可以保存短信3分钟
@PostMapping("/codeTX")
public CommonsResponse getCodeTX(@RequestParam String phone) {
//判断存入的验证码是否在1分钟以内 如果在就不能在获取
String TempCodeTx = (String) redisUtil.get("TX" + CacheConstants.CACHE_PREFIX_CODE + phone);
if (!StringUtils.isBlank(TempCodeTx)) {
long times1 = Long.parseLong(TempCodeTx.split("_")[1]);
long times2 = new Date().getTime();
if (times2 - times1 <= 60000) {
return CommonsResponse.builder().code(200).data("-1")
.message("验证码没到1分钟不能获取").build();
}
}
//产生随机数
String sendCode = String.valueOf(RandomValueUtil.getNum(1000, 9999));
String code = sendCode + "_" + new Date().getTime();
redisUtil.set("TX" + CacheConstants.CACHE_PREFIX_CODE + phone, code, 180);
tengXunYunSendMsgFeignClient.TX("自己模板的ID", phone, sendCode);
return CommonsResponse.builder().code(200).data("1")
.message("发送成功!!!").build();
}
一个非常简单的注册 从刚刚保存的redis 拿出code 来和用户输入的code 做对比 在通过MD5+盐的方式保存用户的密码
@PostMapping("/insert")
public CommonsResponse insert(@RequestBody UmsMemberDTO umsMemberDTO) {
String redisUms = (String) redisUtil.get("TX" + CacheConstants.CACHE_PREFIX_CODE + umsMemberDTO.getMobile());
String dd = redisUms.split("_")[0];
if (redisUms == null || !dd.equals(umsMemberDTO.getCode())) {
return CommonsResponse.builder().code(200).data(false).message("失败").build();
}BCryptPasswordEncoder bCryptPasswordEncoder = new BCryptPasswordEncoder();
String tempPassword = bCryptPasswordEncoder.encode(umsMemberDTO.getPassword());
umsMemberDTO.setPassword(tempPassword);
umsClink.insert(umsMemberDTO);
return CommonsResponse.builder().code(200).data(true).message("成功!").build();
}
结果是成功的!短信发出! 如果没有签名可以去我的博客里看我的另一篇文章 百分百注册腾讯云签名!
【java|SpringBoot整合腾讯云短信服务实现发送短信功能(一篇就够了)】
推荐阅读
- docker|Docker 搭建redis集群
- java基础|TCC分布式事务——设计思想及其可能遇到的问题
- java基础|mq消息积压怎么对应
- java基础|springboot优雅实现工厂模式,策略模式——利用spring自动注入list,map性质
- MySQL|深入浅出MySQL灵魂十连问,你真的有把握吗()
- MySQL|来自大厂面试官的MySQL灵魂十连问,你真的有把握全部回答出来吗()
- 博士毕业选择回老家县城大专任教,事业编、副教授待遇、外加几十万安家费...
- apache|Apache Log4j2远程代码执行漏洞(CVE-2021-44228)漏洞复现
- Java学习之路|两万字长文总结,梳理 Java 入门进阶那些事(推荐收藏)