因公司需要短信提醒功能,公司使用了腾讯云的短信包,对于第三方的短信开发功能。接入腾讯云短信还是很简单的,大致的思路就是在平台上设置好参数,建好模版后,然后直接调用即可。这边调用分为web api调用或者是直接引入腾讯云的SDK进行调用。不管哪种方式都需要使用秘钥。
这边我们先在腾讯云开通短信业务,个人认证后可以免费获取100条短信使用,足够我们自己这边做测试和练习使用了。开通之后,在控制台进入短信模块,我们需要创建签名和模板。
签名
签名需要认证,分为企业和个人,企业一般都是需要营业执照,具体可以去腾讯云官网查看要求。这边贴一下个人能够创建签名的几个,这边建议使用APP发布上市场上或者是使用小程序与公众号的后台截图界面(注:我在创建的时候使用了公众号,审核没有通过,原因是说我的公众号名称过于中性,自己注意吧,腾讯云还是挺严格的)
正文模版
模板比较好通过,注意点({1}为您的登录验证码,请于{2}分钟内填写。如非本人操作,请忽略本短信。(其中{1}、{2}为可自定义的内容,须从1开始连续编号,如{1}、{2}等),按照要求填写好后,一般十五分钟就可以通过。
创建应用
在应用管理下的应用列表中创建应用,得到SdkAppid,然后移步云API秘钥获取秘钥。
编写代码
这边我们需要的东西都已经弄好,接着就要在自己的代码中接入腾讯云短信。
SDK方式
这边sdk引入你可以根据官方文档,我这边以java以例
引入sdk
引入sdk的方式很多,我这边使用的是maven的方式来引入架包。
com.tencentcloudapi
tencentcloud-sdk-java
3.0.112
编写业务代码,根据代码注释填写参数,发送后会返回一个SendSmsResponse对象,里面存放着输出信息,根据输出信息来进行判断短信是否发送成功。
public class SendSms1 {
public static void main(String [] args) {
try{
Credential cred = new Credential("secretId", "secretKey");
HttpProfile httpProfile = new HttpProfile();
httpProfile.setEndpoint("sms.tencentcloudapi.com");
ClientProfile clientProfile = new ClientProfile();
clientProfile.setHttpProfile(httpProfile);
SmsClient client = new SmsClient(cred, "", clientProfile);
//组装请求对象-具体描述见控制台-文档部分内容
SendSmsRequest request = new SendSmsRequest();
//必填:待发送手机号
/*request.setPhoneNumbers("13877906666,13877907777,13877908888");*/
String[] phone ={"+8613877908888"};
request.setPhoneNumberSet(phone);
//必填:短信签名-可在短信控制台中找到
request.setSign("短信签名");
//短信SdkAppid在 短信控制台 添加应用后生成的实际SdkAppid,示例如1400006666。
request.setSmsSdkAppid("1400006666");
//必填:短信模板-可在短信控制台中找到
request.setTemplateID("短信模版Id");
//可选:模板中的变量替换JSON串,如模板内容为"亲爱的${name},您的验证码为${code}"时,此处的值为String param = "{\"name\":\"张三\",\"code\":\"1234\"}";
String[] param ={"1234"};
request.setTemplateParamSet(param);
SendSmsResponse resp = client.SendSms(request);
System.out.println(SendSmsRequest.toJsonString(resp));
} catch (TencentCloudSDKException e) {
System.out.println(e.toString());
}
}
}
这边仅仅是写了一个测试类,完全可以将SendSmsRequest、SmsClient、ClientProfile、HttpProfile、Credential等类用Spring注入的方式,实现控制反转,将参数在配置文件中完成配置,可能这样在实际项目中更适合。
云API请求
除了引入SDK的方式之外,直接使用接口进行短信请求,也能完成发送短信需求。对于一些无法使用sdk方式的话,通过http请求来进行发送短信也是可以,但是相较而言,会更加麻烦,因为云API中的鉴权比较复杂。提供官网的接口鉴权文档来帮助完成签名信息。这边贴出代码,运行下面代码获取URL然后发起http请求,完成短信的发送.
public class TencentCloudAPIDemo {
private final static String CHARSET = "UTF-8";
public static String sign(String s, String key, String method) throws Exception {
Mac mac = Mac.getInstance(method);
SecretKeySpec secretKeySpec = new SecretKeySpec(key.getBytes(CHARSET), mac.getAlgorithm());
mac.init(secretKeySpec);
byte[] hash = mac.doFinal(s.getBytes(CHARSET));
return DatatypeConverter.printBase64Binary(hash);
}
public static String getStringToSign(TreeMap params) {
StringBuilder s2s = new StringBuilder("GETsms.tencentcloudapi.com/?");
// 签名时要求对参数进行字典排序,此处用TreeMap保证顺序
for (String k : params.keySet()) {
s2s.append(k).append("=").append(params.get(k).toString()).append("&");
}
return s2s.toString().substring(0, s2s.length() - 1);
}
public static String getUrl(TreeMap params) throws UnsupportedEncodingException {
StringBuilder url = new StringBuilder("https://sms.tencentcloudapi.com/?");
// 实际请求的url中对参数顺序没有要求
for (String k : params.keySet()) {
// 需要对请求串进行urlencode,由于key都是英文字母,故此处仅对其value进行urlencode
url.append(k).append("=").append(URLEncoder.encode(params.get(k).toString(), CHARSET)).append("&");
}
return url.toString().substring(0, url.length() - 1);
}
public static void main(String[] args) throws Exception {
TreeMap params = new TreeMap(); // TreeMap可以自动排序
// 实际调用时应当使用随机数,例如:
params.put("Nonce", new Random().nextInt(java.lang.Integer.MAX_VALUE));
// params.put("Nonce", 11886); // 公共参数
// 实际调用时应当使用系统当前时间,例如:
params.put("Timestamp", System.currentTimeMillis() / 1000);
// params.put("Timestamp", 1465185768); // 公共参数
params.put("SecretId", "SecretId"); // 公共参数
params.put("Action", "SendSms"); // 公共参数
params.put("Version", "2019-07-11"); // 公共参数
params.put("PhoneNumberSet.0", "+8618511122233"); // 业务参数
params.put("TemplateID", "模板Id"); // 业务参数
params.put("TemplateParamSet.0", "参数"); // 业务参数
params.put("SmsSdkAppid", "SmsSdkAppid"); // 业务参数
params.put("Sign", "Sign"); // 业务参数
params.put("Signature", sign(getStringToSign(params), "SecretKey", "HmacSHA1")); // 公共参数
System.out.println(getUrl(params));
}
}```