短信群发

    xiaoxiao2022-07-13  145

    1,先去阿里购买短信的API接口,买了后配置几个参数即可

    package com.metro.utils; import com.alibaba.fastjson.JSON; import com.aliyuncs.DefaultAcsClient; import com.aliyuncs.IAcsClient; import com.aliyuncs.dysmsapi.model.v20170525.SendSmsRequest; import com.aliyuncs.dysmsapi.model.v20170525.SendSmsResponse; import com.aliyuncs.exceptions.ClientException; import com.aliyuncs.http.MethodType; import com.aliyuncs.profile.DefaultProfile; import com.aliyuncs.profile.IClientProfile; import com.metro.configure.sms.SMS_Config; import com.metro.project.entity.SmsSignature; import com.metro.project.service.ISmsSignatureService; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.util.ResourceUtils; import java.io.IOException; import java.util.HashMap; import java.util.Map; @Slf4j public class SendSMS { private SendSMS(){} //private static String appId = "LTAI7HUgeOIAySKi"; //private static String appSecret = "RakUHTCbbdPTjlpNTreAimLjLLfZn1"; //private static String templateId = "SMS_159626978"; //private static String smsSign = "卓厉"; public static Object send(String phones, Map<String,String> params,String smsSign,String templateCode){ try { String param = JSON.toJSONString(params); //TODO 设置超时时间-可自行调整 System.setProperty("sun.net.client.defaultConnectTimeout", "10000"); System.setProperty("sun.net.client.defaultReadTimeout", "10000"); //TODO 初始化ascClient需要的几个参数 //TODO 短信API产品名称(短信产品名固定,无需修改) final String product = "Dysmsapi"; //TODO 短信API产品域名(接口地址固定,无需修改) final String domain = "dysmsapi.aliyuncs.com"; //TODO 替换成你的AK //TODO 你的accessKeyId,参考本文档步骤2 final String accessKeyId = SMS_Config.AccessKeyId; //TODO 你的accessKeySecret,参考本文档步骤2 final String accessKeySecret = SMS_Config.AccessKeySecret; //TODO 初始化ascClient,暂时不支持多region(请勿修改) IClientProfile profile = DefaultProfile.getProfile("cn-hangzhou", accessKeyId, accessKeySecret); DefaultProfile.addEndpoint("cn-hangzhou", "cn-hangzhou", product, domain); IAcsClient acsClient = new DefaultAcsClient(profile); //TODO 组装请求对象 SendSmsRequest request = new SendSmsRequest(); //TODO 使用post提交 request.setMethod(MethodType.POST); //TODO 必填:待发送手机号。支持以逗号分隔的形式进行批量调用,批量上限为1000个手机号码,批量调用相对于单条调用及时性稍有延迟,验证码类型的短信推荐使用单条调用的方式;发送国际/港澳台消息时,接收号码格式为00+国际区号+号码,如“0085200000000” request.setPhoneNumbers(phones); //TODO 必填:短信签名-可在短信控制台中找到 request.setSignName(smsSign); //TODO 必填:短信模板-可在短信控制台中找到,发送国际/港澳台消息时,请使用国际/港澳台短信模版 request.setTemplateCode(templateCode); //TODO 可选:模板中的变量替换JSON串,如模板内容为"亲爱的${name},您的验证码为${code}"时,此处的值为 //TODO 友情提示:如果JSON中需要带换行符,请参照标准的JSON协议对换行符的要求,比如短信内容中包含\r\n的情况在JSON中需要表示成\\r\\n,否则会导致JSON在服务端解析失败 request.setTemplateParam(param); //TODO 可选-上行短信扩展码(扩展码字段控制在7位或以下,无特殊需求用户请忽略此字段) //TODO request.setSmsUpExtendCode("90997"); //TODO 可选:outId为提供给业务方扩展字段,最终在短信回执消息中将此值带回给调用者 //TODO request.setOutId("yourOutId"); //TODO 请求失败这里会抛ClientException异常 SendSmsResponse sendSmsResponse = acsClient.getAcsResponse(request); log.info("调用结果:{}",sendSmsResponse); SmsErrorCode sec = new SmsErrorCode(); return sec.smsErrorCode(sendSmsResponse); }catch (ClientException e){ log.error(e.getErrMsg()); return null; } } public static void main(String[] args)throws IOException { log.info(ResourceUtils.getURL("classpath:").getPath()); /*Map<String,String> params = new HashMap<>(); params.put("code","784564"); SendSmsResponse response = (SendSmsResponse)send("17621075850", params,"卓厉","SMS_117517191"); if("OK".equals(response.getCode())){ log.info("发送成功"); }else { log.info("发送失败"); }*/ } }

    下面一个controller一次最多发送900条:

    @PostMapping(value = "/sendSMS") public Object sendSMS(SmsGroupSends smsGroupSends){ try { Map<String,String> params = new HashMap<>(); if(smsGroupSends.getParamList()!=null) { JSONObject json = JSONObject.parseObject(smsGroupSends.getParamList().toString()); params = JSON.toJavaObject(json, Map.class); } SmsTemplates st = iSmsTemplatesService.findById(smsGroupSends.getSmsTemplates()); SmsSendLog ssl = new SmsSendLog(); ssl.setScreenContent(smsGroupSends.getContent()); if(smsGroupSends.getPhoneList()!=null && smsGroupSends.getPhoneList().size()>0) { String phones = ""; int total = smsGroupSends.getPhoneList().size(); Integer currentNumber = 0; Integer totalNumber = 0; for (String phone:smsGroupSends.getPhoneList()) { totalNumber++; currentNumber++; phones +=","+phone; if(currentNumber.equals(900)||totalNumber.equals(total)){ //TODO 这里就直接写发送请求了,返回一个SmsResponseResult SmsResponseResult srr = (SmsResponseResult)SendSMS.send(phones.substring(1), params,smsGroupSends.getSmsSignatureName(),st.getCode()); log.info("短信签名:{}",smsGroupSends.getSmsSignatureName()); log.info("{}",srr.getMessage()); if(srr.getCode().equals("OK")){ ssl.setStatus(1); }else{ ssl.setStatus(0); } ssl.setPhoneCount(currentNumber); ssl.setTemplatesCode(st.getContent()); ssl.setScreenContent(smsGroupSends.getContent()); ssl.setCampusId(smsGroupSends.getCampusId()); ssl.setTenantId(smsGroupSends.getTenantId()); ssl.setCreaterName(smsGroupSends.getUserName()); ssl.setCreater(smsGroupSends.getUserId()); ssl.setCreationTime(new Date()); //TODO 暂时省略相关添加条件代码 ssl.setPhoneCount(currentNumber); iSmsSendLogService.insert(ssl); srr.setCreater(smsGroupSends.getUserId()); srr.setCreaterName(smsGroupSends.getUserName()); srr.setCreationTime(new Date()); iSmsResponseResultService.insert(srr); phones = ""; currentNumber = 0; } } } return true; }catch(Exception e){ log.error("发生异常:{}",e.getMessage()); return false; }
    最新回复(0)