首先引用sdk:
<!-- 腾讯短信sdk -->
<dependency>
<groupId>com.tencentcloudapi</groupId>
<artifactId>tencentcloud-sdk-java</artifactId>
<version>3.1.270</version>
</dependency>
短信发送工具类:
@Slf4j
public class SendSmsUtil {
public static Boolean sendSms(SendSmsRequest request) {
Credential cred = new Credential(request.getSecretId(), request.getSecretKey());
SmsClient client = new SmsClient(cred, request.getRegion());
final com.tencentcloudapi.sms.v20210111.models.SendSmsRequest 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;
/**
* 云api密钥中的 region
*/
private String region;
}
}
Controller调用:
@AnonymousAccess
@ApiOperation("获取短信验证码")
@GetMapping(value = "/smscode/{phone}")
public ResponseEntity<Object> getCode(@PathVariable String phone){
// 获取随机验证码
String code = StringUtils.getRandomCode(6);
// 保存验证码
Boolean result = redisUtils.set(smsIdentity+phone, code, 10, TimeUnit.MINUTES);
//发送短信
SendSmsUtil.SendSmsRequest request = new SendSmsUtil.SendSmsRequest();
request.setPhone(phone);
request.setSmsSdkAppId(redisUtils.getY(SiteConstants.SMS_SDK_APPID));
request.setSecretId(redisUtils.getY(SiteConstants.SMS_SECRETID));
request.setSecretKey(redisUtils.getY(SiteConstants.SMS_SECRET_KEY));
request.setRegion(redisUtils.getY(SiteConstants.SMS_REGION));
request.setSignName(redisUtils.getY(SiteConstants.SMS_SIGN));
request.setTemplateId(redisUtils.getY(SiteConstants.SMS_TEMPLATEID));
// 这个值,要看你的模板中是否预留了占位符,如果没有则不需要设置
request.setTemplateParamSet(new String[]{code});
result = result && SendSmsUtil.sendSms(request);
return ResponseEntity.ok(result);
}
验证码生成方法
/**
* 获取一个随机数字码
*/
public static String getRandomCode(int length) {
// 定义一个包含数字 0 到 9 的字符串
String str = "0123456789";
if(length<4){
length = 4;
}
// 创建一个空的 StringBuilder 对象,用于存储生成的随机数
StringBuilder st = new StringBuilder(length);
// 使用 for 循环4次
for (int i = 0; i < length; i++) {
// 在 str 字符串中随机选择一个字符,并添加到 stringBuilder 对象中
char ch = str.charAt(new Random().nextInt(str.length()));
st.append(ch);
}
// 将 stringBuilder 对象转化为字符串,并转化为小写字母
String findkey = st.toString().toLowerCase();
// 返回生成的随机数
return findkey;
}
腾讯云参数配置:
前端的调用:
<el-form-item label="验证码" prop="validateCode">
<el-input v-model="value.validateCode" style="width: 70%" placeholder="请输入验证码"/>
<div class="registe-code">
<el-button :disabled="value.phone==='' || value.phone===null || countdown > 0" @click="getCode" :loading="codeLoading">
{{ countdown > 0 ? `${countdown}秒后重新获取` : '获取验证码' }}
</el-button>
</div>
注:验证码10分钟内有效,建议您填写完其他信息后再点击获取验证码
</el-form-item>
getCode(){
this.codeLoading = true
if (!isvalidPhone(this.value.phone)) {
this.$message.error('请输入正确的11位手机号码');
return;
}
getCode(this.value.phone)
.then((response) => {
this.codeLoading = false;
if(response && response==true){
this.$message.success("短信已发送,10分钟内有效");
}else{
this.$message.info("短信发送失败,请联系管理人员");
}
// 设置倒计时的秒数,这里设置为60秒
this.countdown = 60;
// 设置一个计时器来更新倒计时
this.timer = setInterval(() => {
if (this.countdown > 0) {
this.countdown -= 1;
} else {
clearInterval(this.timer);
}
}, 1000);
})
.catch((error) => {
this.codeLoading = false;
this.$message.error(
error.response ? error.response.message : error.message
);
});
},