1、购买腾讯短信,大约5分钱一条
2、登录:https://console.cloud.tencent.com/smsv2,
创建资质
3、创建签名,创建完成后腾讯审核。审核通过后,会发送到短信运营商进行报备,报备通过后才能正常发送短信
4、创建短信模板,模板也需要腾讯审核。
5、创建应用,从而获取sdkAppId
6、登录https://console.cloud.tencent.com/cam/capi,配置秘钥,
7、详细文档地址可参考:https://cloud.tencent.com/document/product/382/43194
下面直接给出java代码(sdk方式)
1、maven引入
xml
<dependency>
<groupId>com.tencentcloudapi</groupId>
<artifactId>tencentcloud-sdk-java</artifactId>
<version>3.1.571</version>
</dependency>
2、java代码
java
import java.util.concurrent.ThreadLocalRandom;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
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.v20210111.SmsClient;
import com.tencentcloudapi.sms.v20210111.models.SendSmsRequest;
import com.tencentcloudapi.sms.v20210111.models.SendSmsResponse;
import lombok.extern.slf4j.Slf4j;
/**
* 高并发版 短信验证码生成工具类 基于ThreadLocalRandom,适合分布式、高请求量场景
*/
@Component
@Slf4j
public class SmsCodeService {
@Value("${tencent.sms:secretId}")
private String secretId;
@Value("${tencent.sms:secretKey}")
private String secretKey;
@Value("${tencent.sms:endPoint}")
private String endPoint;
/**
* 生成指定位数的数字验证码
*
* @param length
* 验证码位数(4/6)
* @return 纯数字验证码字符串
*/
public String generateCode(int length) {
if (length < 1) {
throw new IllegalArgumentException("验证码位数不能小于1,建议使用4位或6位");
}
int max = (int) Math.pow(10, length) - 1;
// 线程安全的随机数生成
int randomNum = ThreadLocalRandom.current().nextInt(max + 1);
// 格式化补零
return String.format("%0" + length + "d", randomNum);
}
// 4位验证码快捷方法
public String generate4BitCode() {
return generateCode(4);
}
// 6位验证码快捷方法
public String generate6BitCode() {
return generateCode(6);
}
public boolean sendSMSCode(String sdkAppId,String templateId,String signName,String phoneNumber, String[] templateParamSet) {
try {
// 实例化一个认证对象,入参需要传入腾讯云账户 SecretId,SecretKey。
// 为了保护密钥安全,建议将密钥设置在环境变量中或者配置文件中,请参考凭证管理
// https://github.com/TencentCloud/tencentcloud-sdk-java?tab=readme-ov-file#%E5%87%AD%E8%AF%81%E7%AE%A1%E7%90%86。
// 硬编码密钥到代码中有可能随代码泄露而暴露,有安全隐患,并不推荐。
// SecretId、SecretKey 查询: https://console.cloud.tencent.com/cam/capi
Credential cred = new Credential(secretId, secretKey);
// Credential cred = new Credential(System.getenv("TENCENTCLOUD_SECRET_ID"),
// System.getenv("TENCENTCLOUD_SECRET_KEY"));
// 实例化一个http选项,可选的,没有特殊需求可以跳过
HttpProfile httpProfile = new HttpProfile();
// 从3.0.96版本开始, 单独设置 HTTP 代理(无需要直接忽略)
// httpProfile.setProxyHost("真实代理ip");
// httpProfile.setProxyPort(真实代理端口);
httpProfile.setReqMethod("GET"); // get请求(默认为post请求)
httpProfile.setConnTimeout(30); // 请求连接超时时间,单位为秒(默认60秒)
httpProfile.setWriteTimeout(30); // 设置写入超时时间,单位为秒(默认0秒)
httpProfile.setReadTimeout(30); // 设置读取超时时间,单位为秒(默认0秒)
/*
* 指定接入地域域名,默认就近地域接入域名为 sms.tencentcloudapi.com ,也支持指定地域域名访问,例如广州地域的域名为
* sms.ap-guangzhou.tencentcloudapi.com
*/
httpProfile.setEndpoint(endPoint);
/*
* 非必要步骤: 实例化一个客户端配置对象,可以指定超时时间等配置
*/
ClientProfile clientProfile = new ClientProfile();
/*
* SDK默认用TC3-HMAC-SHA256进行签名 非必要请不要修改这个字段
*/
clientProfile.setSignMethod("HmacSHA256");
clientProfile.setHttpProfile(httpProfile);
/*
* 实例化要请求产品(以sms为例)的client对象 第二个参数是地域信息,可以直接填写字符串ap-guangzhou,支持的地域列表参考
* https://cloud.tencent.com/document/api/382/52071#.E5.9C.B0.E5.9F.9F.E5.88.97.
* E8.A1.A8
*/
SmsClient client = new SmsClient(cred, "ap-shanghai", clientProfile);
/*
* 实例化一个请求对象,根据调用的接口和实际情况,可以进一步设置请求参数 您可以直接查询SDK源码确定接口有哪些属性可以设置
* 属性可能是基本类型,也可能引用了另一个数据结构 推荐使用IDE进行开发,可以方便的跳转查阅各个接口和数据结构的文档说明
*/
SendSmsRequest req = new SendSmsRequest();
/*
* 填充请求参数,这里request对象的成员变量即对应接口的入参 您可以通过官网接口文档或跳转到request对象的定义处查看请求参数的定义
* 基本类型的设置: 帮助链接: 短信控制台: https://console.cloud.tencent.com/smsv2 腾讯云短信小助手:
* https://cloud.tencent.com/document/product/382/3773#.E6.8A.80.E6.9C.AF.E4.BA.
* A4.E6.B5.81
*/
/* 短信应用ID: 短信SdkAppId在 [短信控制台] 添加应用后生成的实际SdkAppId,示例如1400006666 */
// //TODO
// String sdkAppId = "1400009099";
req.setSmsSdkAppId(sdkAppId);
//TODO 签名
// String signName = "***公众号";
req.setSignName(signName);
//TODO
// String templateId = "449739";
req.setTemplateId(templateId);
/* 模板参数: 模板参数的个数需要与 TemplateId 对应模板的变量个数保持一致,若无模板参数,则设置为空 */
req.setTemplateParamSet(templateParamSet);
String[] phoneNumberSet = { "+86"+phoneNumber };
req.setPhoneNumberSet(phoneNumberSet);
SendSmsResponse res = client.SendSms(req);
// 输出json格式的字符串回包
System.out.println(SendSmsResponse.toJsonString(res));
return true;
} catch (TencentCloudSDKException e) {
log.error(e.getMessage(),e);
return false;
}
}
}