美文网首页
腾讯云短信接入

腾讯云短信接入

作者: y丶M1ng | 来源:发表于2020-03-31 15:25 被阅读0次

    因公司需要短信提醒功能,公司使用了腾讯云的短信包,对于第三方的短信开发功能。接入腾讯云短信还是很简单的,大致的思路就是在平台上设置好参数,建好模版后,然后直接调用即可。这边调用分为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的方式来引入架包。

     <dependency>
     <groupId>com.tencentcloudapi</groupId>
     <artifactId>tencentcloud-sdk-java</artifactId>
     <!-- go to https://search.maven.org/search?q=tencentcloud-sdk-java and get the latest version. ->
     <!-- 请到https://search.maven.org/search?q=tencentcloud-sdk-java查询最新版本 -->
     <version>3.0.112</version>
    </dependency></pre>
    

    编写业务代码,根据代码注释填写参数,发送后会返回一个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<String, Object> 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<String, Object> 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<String, Object> params = new TreeMap<String, Object>(); // 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));
     }
    }```
    

    相关文章

      网友评论

          本文标题:腾讯云短信接入

          本文链接:https://www.haomeiwen.com/subject/nviwuhtx.html