阿里云批量发送短信


前言

  • 前提是已经在阿里云官网上申请了签名及模板并获取了accessKeyId以及accessKeySecret。
    我这边的accessKeyId及accessKeySecret是已经写在配置文件中了。
    提示:仅供参考

一、加入依赖

<dependency>
      <groupId>com.aliyun</groupId>
      <artifactId>aliyun-java-sdk-core</artifactId>
      <version>4.0.6</version> <!-- 注:如提示报错,先升级基础包版,无法解决可联系技术支持 -->
</dependency>
 <dependency>
      <groupId>com.aliyun</groupId>
      <artifactId>aliyun-java-sdk-dysmsapi</artifactId>
      <version>1.1.0</version>
</dependency>

二、写工具类

代码如下(示例):

 public static boolean DomesticSendBatch(String accessKeyId, String accessKeySecret, List<Sms> smsList) throws Exception {
        //设置超时时间-可自行调整
        System.setProperty("sun.net.client.defaultConnectTimeout", "10000");
        System.setProperty("sun.net.client.defaultReadTimeout", "10000");
        //初始化ascClient需要的几个参数
        final String product = "Dysmsapi";//短信API产品名称(短信产品名固定,无需修改)
        final String domain = "dysmsapi.aliyuncs.com";//短信API产品域名(接口地址固定,无需修改)

        //初始化ascClient,暂时不支持多region(请勿修改)
        IClientProfile profile = DefaultProfile.getProfile("cn-hangzhou", accessKeyId,
                accessKeySecret);
        DefaultProfile.addEndpoint("cn-hangzhou", "cn-hangzhou", product, domain);
        IAcsClient acsClient = new DefaultAcsClient(profile);
        //组装请求对象
        SendBatchSmsRequest request = new SendBatchSmsRequest();
        //使用post提交
        request.setMethod(MethodType.POST);
		// 这个应该也是可以不写的,这个是我后期报错添加上的
        request.setVersion("2017-05-25");

		// JSONArray,是一个有序的值序列,可以自动转换成json数组,例如:["tom","kate","jerry"]或者[1,2,3]
		// 电话
        JSONArray telJsonArray = new JSONArray();
        // 这个是短信模板里要传的参数
        JSONArray paramsJsonArray = new JSONArray();
        // 签名
        JSONArray signJsonArray = new JSONArray();

        for (Sms sms : smsList) {
        	// sign、tempate都有多个,所以要遍历获取
            String signs = sms.getSign();
            signJsonArray.add(signs);
            // 因为是批量发送,所以电话也要遍历获取
            telJsonArray.add(sms.getTel());
            AliTemplate template = (AliTemplate) sms.getTemplate();
            // 这个是短信模板里面要传的参数,因为是批量发送,每发一条的短信,要传的参数也不一样
            paramsJsonArray.add(template.getParamsAsJson());
        }

        request.setPhoneNumberJson(telJsonArray.toString());
        request.setSignNameJson(signJsonArray.toString());
        AliTemplate template = (AliTemplate) smsList.get(0).getTemplate();
        request.setTemplateCode(template.getCode());
        request.setTemplateParamJson(paramsJsonArray.toString());

        SendBatchSmsResponse sendSmsResponse = acsClient.getAcsResponse(request);
        if(sendSmsResponse.getCode() != null && sendSmsResponse.getCode().equals("OK")) {
        	// 请求成功
            for (Sms sms : smsList) {
                sms.setResponse(sendSmsResponse);
            }
			// smsList.get(0).setResponse(sendSmsResponse);
            return true;
        }
        return false;

    }
	/**
     * 批量发送短信测试
     */
    @Test
    void Test() throws Exception {

        List<Sms> list = new ArrayList<>();

        Company c = companyService.getTopByUcc("..");

        GroupDO grp = groupRepository.findGroupDOById(..);
      
        Optional<GroupInviteLetterDO> gil = groupInviteLetterRepository.findById(..);
    	// 这里是ArticlePostNoticeTemplateSMS_243196596类继承了AliTemplate接口 ,ArticlePostNoticeTemplateSMS_243196596这里面主要是写了短信模板里要传的字段,然后再写一个有参构造器,AliTemplate接口写了获取短信模板id, 获取短信模板,获取短信模板里的参数的方法。
        AliTemplate template = new ArticlePostNoticeTemplateSMS_243196596("小明", "2019", "小花", "12", 1);
       
        Company c1 = companyService.getTopByUcc("..");
        // 这里用的是jpa, 不是mybatis
        GroupDO grp1 = groupRepository.findGroupDOById(..);
        Optional<GroupInviteLetterDO> gil1 = groupInviteLetterRepository.findById(..);
        AliTemplate template1 = new ArticlePostNoticeTemplateSMS_243196596("小白", "2020", "小花", "13", 1);

		// 添加两条数据测试批量发送
        list.add(new MessageDO(SIGN1,gil.get(),c,template));
         list.add(new MessageDO(SIGN2,gil1.get(),c1,template1));
        System.out.println(list);
		// 调用工具类里的方法	
        SmsAli.DomesticSendBatch(keyId, keySecret, list);
    }

总结

这也是我第一次写批量短信发送,也写了挺久,也是实习期间,公司给了我这么一个机会让我接触到阿里云批量短信发送,毕竟如果光靠自己是申请不到签名和模板的,哭唧唧,所以浅浅记录一下吧。
这里面我还学到了一个封装类就是 JSONArray,他可以自动转换成json数组,而且还是自带中括号的,就比如[“tom”,“kate”,“jerry”],就不用我手动拼接成这样了,就很棒!


版权声明:本文为weixin_57393819原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。