腾讯云配置
首先在腾讯云搜索短信
然后按要求创建短信签名,短信模板。短信模板很容易审核,但是签名比较复杂,需要按要求填写和上传相关信息。如果驳回可以查看哪里出问题,然后继续提交审核。
成功以后可以查看,要记住签名内容,下面会用到。
都创建成功以后就可以编写后端代码了
后端逻辑实现
在pom.xml中导入依赖
<!--腾讯云短信-->
<dependency>
<groupId>com.tencentcloudapi</groupId>
<artifactId>tencentcloud-sdk-java</artifactId>
<version>3.1.284</version>
</dependency>
<dependency>
<groupId>com.github.qcloudsms</groupId>
<artifactId>qcloudsms</artifactId>
<version>1.0.6</version>
</dependency>
在yml中配置信息
tencent:
msm:
id: 填入自己的访问秘钥,位置在右上角点击个人头像->选择访问管理->新建秘钥
secret: 上面查到的第二个信息, 这个是secretkey
appId: 短信控制台页面->左侧应用管理->应用列表的 SDKAppId
signName: 短信控制台页面->左侧国内短信->签名管理 签名内容
templateId: 短信控制台页面->左侧国内短信->正文模板管理 Id
如图
编写自动生成验证码的工具类,可自行修改
public class ValidateCodeUtils {
/**
* 随机生成验证码
* @param length 长度为4位或者6位
* @return
*/
public static Integer generateValidateCode(int length){
Integer code =null;
if(length == 4){
code = new Random().nextInt(9999);//生成随机数,最大为9999
if(code < 1000){
code = code + 1000;//保证随机数为4位数字
}
}else if(length == 6){
code = new Random().nextInt(999999);//生成随机数,最大为999999
if(code < 100000){
code = code + 100000;//保证随机数为6位数字
}
}else{
throw new RuntimeException("只能生成4位或6位数字验证码");
}
return code;
}
/**
* 随机生成指定长度字符串验证码
* @param length 长度
* @return
*/
public static String generateValidateCode4String(int length){
Random rdm = new Random();
String hash1 = Integer.toHexString(rdm.nextInt());
String capstr = hash1.substring(0, length);
return capstr;
}
}
然后编写调用yml中配置的参数的工具类
@Component
public class MsmConstantUtils implements InitializingBean {
@Value("${tencent.msm.id}")
private String secretID ;
@Value("${tencent.msm.secret}")
private String secretKey ;
@Value("${tencent.msm.appId}")
private String appId;
@Value("${tencent.msm.signName}")
private String signName;
@Value("${tencent.msm.templateId}")
private String templateId;
//六个相关的参数
public static String SECRET_ID;
public static String SECRET_KEY;
public static String APP_ID;
public static String SIGN_NAME;
public static String TEMPLATE_ID;
@Override
public void afterPropertiesSet() throws Exception {
SECRET_ID = secretID;
SECRET_KEY = secretKey;
APP_ID = appId;
SIGN_NAME = signName;
TEMPLATE_ID = templateId;
}
}
然后编写短信发送的工具类
public class SMSUtils {
public static boolean send(String phone, String code) {
//判断手机是否为null
if (StringUtils.isEmpty(phone)){
return false;
}
try {
/* 必要步骤:
* 实例化一个认证对象,入参需要传入腾讯云账户密钥对 secretId 和 secretKey
* 本示例采用从环境变量读取的方式,需要预先在环境变量中设置这两个值
* 您也可以直接在代码中写入密钥对,但需谨防泄露,不要将代码复制、上传或者分享给他人
* CAM 密钥查询:https://console.cloud.tencent.com/cam/capi
*/
Credential cred = new Credential(MsmConstantUtils.SECRET_ID, MsmConstantUtils.SECRET_KEY);
// 实例化一个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-guangzhou", clientProfile);
// 实例化一个请求对象,每个接口都会对应一个request对象
SendSmsRequest req = new SendSmsRequest();
String[] phoneNumberSet1 = {"+86"+phone};
req.setPhoneNumberSet(phoneNumberSet1);
req.setSmsSdkAppid(MsmConstantUtils.APP_ID);
req.setSign(MsmConstantUtils.SIGN_NAME);
req.setTemplateID(MsmConstantUtils.TEMPLATE_ID);
String[] templateParamSet1 = {code};
req.setTemplateParamSet(templateParamSet1);
// 返回的resp是一个SendSmsResponse的实例,与请求对象对应
SendSmsResponse resp = client.SendSms(req);
// 输出 JSON 格式的字符串回包
System.out.println(SendSmsResponse.toJsonString(resp));
return true;
} catch (TencentCloudSDKException e) {
e.printStackTrace();
}
return false;
}
}
然后只需要使用SMSUtils.send(phone,code);方法即可发送短信。具体实现如下:
@PostMapping("/sendMsg")
public Result<String> sendMsg(@RequestBody User user){
//获取手机号
String phone = user.getPhone();
if(StringUtils.isNotEmpty(phone)){
//生成随机的四位验证码
String code = ValidateCodeUtils.generateValidateCode(4).toString();
log.info("code={}",code);
//发送短信
boolean flag = SMSUtils.send(phone,code);
if (flag){
//将生成的验证码缓存到redis中,设置有效期五分钟
redisTemplate.opsForValue().set(phone,code,5, TimeUnit.MINUTES);
return Result.success("手机验证码发送成功");
}
}
return Result.error("发送失败");
}
然后就可以运行测试了