package com.fdkankan.common.sms; import com.alibaba.fastjson.JSONObject; 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.exceptions.ServerException; import com.aliyuncs.http.MethodType; import com.aliyuncs.profile.DefaultProfile; import com.aliyuncs.profile.IClientProfile; import com.amazonaws.auth.AWSCredentials; import com.amazonaws.auth.AWSCredentialsProvider; import com.amazonaws.services.sns.AmazonSNS; import com.amazonaws.services.sns.AmazonSNSClientBuilder; import com.amazonaws.services.sns.model.MessageAttributeValue; import com.amazonaws.services.sns.model.PublishRequest; import com.amazonaws.services.sns.model.PublishResult; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component; import org.springframework.util.StringUtils; import java.util.HashMap; import java.util.Map; @Component public class SmsService { private static Logger log = LoggerFactory.getLogger("programLog"); //初始化ascClient需要的几个参数 private static final String product = "Dysmsapi";//短信API产品名称(短信产品名固定,无需修改) private static final String domain = "dysmsapi.aliyuncs.com";//短信API产品域名(接口地址固定,无需修改) private static final String accessKeyId = "LTAIUrvuHqj8pvry";//你的accessKeyId,参考本文档步骤2 private static final String accessKeySecret = "JLOVl0k8Ke0aaM8nLMMiUAZ3EiiqI4";//你的accessKeySecret,参考本文档步骤2 private static final String EN_CODE_MSG = "Your vertification code is ${code}. Thank you for using 4DKanKan, please complete your identity verification by entering this code in 5 minutes. Please ignore this message if you don't operate by yourself."; @Value("${phone.sign:四维看看}") private String sign; public String sendSms(String phoneNum, String templateParam, String templateCode) throws Exception { log.info("cnCode:" + templateCode); log.info("templateParam:" + templateParam); log.info("sign:" + sign); log.info("sign:" + new String(sign.getBytes("ISO-8859-1"),"utf-8")); // 可自助调整超时时间 System.setProperty("sun.net.client.defaultConnectTimeout", "10000"); System.setProperty("sun.net.client.defaultReadTimeout", "10000"); String result = null; try { // 初始化acsClient,暂不支持region化 IClientProfile profile = DefaultProfile.getProfile("cn-hangzhou", accessKeyId, accessKeySecret); DefaultProfile.addEndpoint("cn-hangzhou", "cn-hangzhou", product, domain); IAcsClient acsClient = new DefaultAcsClient(profile); // 组装请求对象-具体描述见控制台-文档部分内容 SendSmsRequest request = new SendSmsRequest(); // 必填:待发送手机号 request.setPhoneNumbers(phoneNum); // 必填:短信签名-可在短信控制台中找到 request.setSignName(new String(sign.getBytes("ISO-8859-1"),"utf-8")); // 必填:短信模板-可在短信控制台中找到 request.setTemplateCode(templateCode); // 可选:模板中的变量替换JSON串,如模板内容为"亲爱的${name},您的验证码为${code}"时,此处的值为 request.setTemplateParam(templateParam); // 选填-上行短信扩展码(无特殊需求用户请忽略此字段) // request.setSmsUpExtendCode("90997"); // 可选:outId为提供给业务方扩展字段,最终在短信回执消息中将此值带回给调用者 // request.setOutId("yourOutId"); // hint 此处可能会抛出异常,注意catch SendSmsResponse sendSmsResponse = acsClient.getAcsResponse(request); if (sendSmsResponse != null && !StringUtils.isEmpty(sendSmsResponse.getCode())){ if("OK".equals(sendSmsResponse.getCode())){ log.debug("阿里云短信发送成功"); }else { log.debug("阿里云短信发送失败:" + sendSmsResponse.getCode()); log.debug("阿里云短信发送失败原因:" + sendSmsResponse.getMessage()); } result = sendSmsResponse.getCode(); } }catch (ClientException e){ log.error("阿里云短信发送失败:" + e); } return result; } public boolean sendBuildFailSms(String name, String scene,String userPhone) 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产品域名(接口地址固定,无需修改) //替换成你的AK final String accessKeyId = "LTAIUrvuHqj8pvry";//你的accessKeyId,参考本文档步骤2 final String accessKeySecret = "JLOVl0k8Ke0aaM8nLMMiUAZ3EiiqI4";//你的accessKeySecret,参考本文档步骤2 //初始化ascClient,暂时不支持多region IClientProfile profile = DefaultProfile.getProfile("cn-hangzhou", accessKeyId, accessKeySecret); try { DefaultProfile.addEndpoint("cn-hangzhou", "cn-hangzhou", product, domain); } catch (ClientException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } IAcsClient acsClient = new DefaultAcsClient(profile); //组装请求对象 SendSmsRequest request = new SendSmsRequest(); //使用post提交 request.setMethod(MethodType.POST); //必填:待发送手机号。支持以逗号分隔的形式进行批量调用,批量上限为1000个手机号码,批量调用相对于单条调用及时性稍有延迟,验证码类型的短信推荐使用单条调用的方式 request.setPhoneNumbers(userPhone); //必填:短信签名-可在短信控制台中找到 request.setSignName(new String(sign.getBytes("ISO-8859-1"),"utf-8")); //必填:短信模板-可在短信控制台中找到 request.setTemplateCode("SMS_199808901"); JSONObject jsonObject = new JSONObject(); jsonObject.put("name", name); jsonObject.put("scene", scene); request.setTemplateParam(jsonObject.toJSONString()); SendSmsResponse sendSmsResponse = null; try { sendSmsResponse = acsClient.getAcsResponse(request); } catch (ServerException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (ClientException e) { // TODO Auto-generated catch block e.printStackTrace(); //System.out.println("向阿里请求发短信失败"); log.error("sendSms:向阿里请求发短信失败"); } if(sendSmsResponse == null) { log.error("sendSms:向阿里请求发短信失败"); } if(sendSmsResponse.getCode() != null && sendSmsResponse.getCode().equals("OK")) { //请求成功 //System.out.println("向阿里请求发短信成功"); log.info("sendSms:向阿里请求发短信成功"); return true; }else { log.debug("阿里云短信发送失败:" + sendSmsResponse.getCode()); log.debug("阿里云短信发送失败原因:" + sendSmsResponse.getMessage()); } return false; } //aws短信 private Map smsAttributes; public Map getDefaultSMSAttributes() { if (smsAttributes == null) { smsAttributes = new HashMap<>(); smsAttributes.put("AWS.SNS.SMS.SenderID", new MessageAttributeValue() .withStringValue("4dkankan") .withDataType("String")); smsAttributes.put("AWS.SNS.SMS.MaxPrice", new MessageAttributeValue() .withStringValue("1.05") .withDataType("Number")); smsAttributes.put("AWS.SNS.SMS.SMSType", new MessageAttributeValue() .withStringValue("Transactional") .withDataType("String")); } return smsAttributes; } public PublishResult sendSMSMessage(String phoneNumber, String message) { return sendSMSMessage(phoneNumber, message, getDefaultSMSAttributes()); } public PublishResult sendSMSMessage(String phoneNumber, String message, Map smsAttributes) { AWSCredentials awsCredentials = new AWSCredentials() { @Override public String getAWSAccessKeyId() { return "AKIAWCV5QFZ3ZQS7LBNL"; // 带有发短信权限的 IAM 的 ACCESS_KEY } @Override public String getAWSSecretKey() { return "NDzNp/5tqypSxxyPkkoixeJntn5W6dq0cLYV2FUH"; // 带有发短信权限的 IAM 的 SECRET_KEY } }; AWSCredentialsProvider provider = new AWSCredentialsProvider() { @Override public AWSCredentials getCredentials() { return awsCredentials; } @Override public void refresh() { } }; AmazonSNS amazonSNS = null; try { amazonSNS = AmazonSNSClientBuilder.standard().withCredentials(provider).withRegion("eu-central-1").build(); } catch (Exception e) { } return amazonSNS.publish( new PublishRequest() .withMessage(EN_CODE_MSG.replace("${code}", message)) .withPhoneNumber(phoneNumber) .withMessageAttributes(smsAttributes) ); } }