|
@@ -0,0 +1,228 @@
|
|
|
|
+package com.fdkankan.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<String, MessageAttributeValue> smsAttributes;
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+ public Map<String, MessageAttributeValue> 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<String, MessageAttributeValue> 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)
|
|
|
|
+ );
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+}
|