腾讯云短信接入

因公司需要短信提醒功能,公司使用了腾讯云的短信包,对于第三方的短信开发功能。接入腾讯云短信还是很简单的,大致的思路就是在平台上设置好参数,建好模版后,然后直接调用即可。这边调用分为web api调用或者是直接引入腾讯云的SDK进行调用。不管哪种方式都需要使用秘钥。

示例

这边我们先在腾讯云开通短信业务,个人认证后可以免费获取100条短信使用,足够我们自己这边做测试和练习使用了。开通之后,在控制台进入短信模块,我们需要创建签名和模板。

签名

image-20200331133418518.png

签名需要认证,分为企业和个人,企业一般都是需要营业执照,具体可以去腾讯云官网查看要求。这边贴一下个人能够创建签名的几个,这边建议使用APP发布上市场上或者是使用小程序与公众号的后台截图界面(注:我在创建的时候使用了公众号,审核没有通过,原因是说我的公众号名称过于中性,自己注意吧,腾讯云还是挺严格的)


image-20200331133045264.png

正文模版

image-20200331133734333.png

模板比较好通过,注意点({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));
 }
}```

你可能感兴趣的:(腾讯云短信接入)