SmsService.java 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228
  1. package com.fdkankan.common.sms;
  2. import com.alibaba.fastjson.JSONObject;
  3. import com.aliyuncs.DefaultAcsClient;
  4. import com.aliyuncs.IAcsClient;
  5. import com.aliyuncs.dysmsapi.model.v20170525.SendSmsRequest;
  6. import com.aliyuncs.dysmsapi.model.v20170525.SendSmsResponse;
  7. import com.aliyuncs.exceptions.ClientException;
  8. import com.aliyuncs.exceptions.ServerException;
  9. import com.aliyuncs.http.MethodType;
  10. import com.aliyuncs.profile.DefaultProfile;
  11. import com.aliyuncs.profile.IClientProfile;
  12. import com.amazonaws.auth.AWSCredentials;
  13. import com.amazonaws.auth.AWSCredentialsProvider;
  14. import com.amazonaws.services.sns.AmazonSNS;
  15. import com.amazonaws.services.sns.AmazonSNSClientBuilder;
  16. import com.amazonaws.services.sns.model.MessageAttributeValue;
  17. import com.amazonaws.services.sns.model.PublishRequest;
  18. import com.amazonaws.services.sns.model.PublishResult;
  19. import org.slf4j.Logger;
  20. import org.slf4j.LoggerFactory;
  21. import org.springframework.beans.factory.annotation.Value;
  22. import org.springframework.stereotype.Component;
  23. import org.springframework.util.StringUtils;
  24. import java.util.HashMap;
  25. import java.util.Map;
  26. @Component
  27. public class SmsService {
  28. private static Logger log = LoggerFactory.getLogger("programLog");
  29. //初始化ascClient需要的几个参数
  30. private static final String product = "Dysmsapi";//短信API产品名称(短信产品名固定,无需修改)
  31. private static final String domain = "dysmsapi.aliyuncs.com";//短信API产品域名(接口地址固定,无需修改)
  32. private static final String accessKeyId = "LTAIUrvuHqj8pvry";//你的accessKeyId,参考本文档步骤2
  33. private static final String accessKeySecret = "JLOVl0k8Ke0aaM8nLMMiUAZ3EiiqI4";//你的accessKeySecret,参考本文档步骤2
  34. 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.";
  35. @Value("${phone.sign:四维看看}")
  36. private String sign;
  37. public String sendSms(String phoneNum, String templateParam, String templateCode) throws Exception {
  38. log.info("cnCode:" + templateCode);
  39. log.info("templateParam:" + templateParam);
  40. log.info("sign:" + sign);
  41. log.info("sign:" + new String(sign.getBytes("ISO-8859-1"),"utf-8"));
  42. // 可自助调整超时时间
  43. System.setProperty("sun.net.client.defaultConnectTimeout", "10000");
  44. System.setProperty("sun.net.client.defaultReadTimeout", "10000");
  45. String result = null;
  46. try {
  47. // 初始化acsClient,暂不支持region化
  48. IClientProfile profile = DefaultProfile.getProfile("cn-hangzhou", accessKeyId, accessKeySecret);
  49. DefaultProfile.addEndpoint("cn-hangzhou", "cn-hangzhou", product, domain);
  50. IAcsClient acsClient = new DefaultAcsClient(profile);
  51. // 组装请求对象-具体描述见控制台-文档部分内容
  52. SendSmsRequest request = new SendSmsRequest();
  53. // 必填:待发送手机号
  54. request.setPhoneNumbers(phoneNum);
  55. // 必填:短信签名-可在短信控制台中找到
  56. request.setSignName(new String(sign.getBytes("ISO-8859-1"),"utf-8"));
  57. // 必填:短信模板-可在短信控制台中找到
  58. request.setTemplateCode(templateCode);
  59. // 可选:模板中的变量替换JSON串,如模板内容为"亲爱的${name},您的验证码为${code}"时,此处的值为
  60. request.setTemplateParam(templateParam);
  61. // 选填-上行短信扩展码(无特殊需求用户请忽略此字段)
  62. // request.setSmsUpExtendCode("90997");
  63. // 可选:outId为提供给业务方扩展字段,最终在短信回执消息中将此值带回给调用者
  64. // request.setOutId("yourOutId");
  65. // hint 此处可能会抛出异常,注意catch
  66. SendSmsResponse sendSmsResponse = acsClient.getAcsResponse(request);
  67. if (sendSmsResponse != null
  68. && !StringUtils.isEmpty(sendSmsResponse.getCode())){
  69. if("OK".equals(sendSmsResponse.getCode())){
  70. log.debug("阿里云短信发送成功");
  71. }else {
  72. log.debug("阿里云短信发送失败:" + sendSmsResponse.getCode());
  73. log.debug("阿里云短信发送失败原因:" + sendSmsResponse.getMessage());
  74. }
  75. result = sendSmsResponse.getCode();
  76. }
  77. }catch (ClientException e){
  78. log.error("阿里云短信发送失败:" + e);
  79. }
  80. return result;
  81. }
  82. public boolean sendBuildFailSms(String name, String scene,String userPhone) throws Exception{
  83. //设置超时时间-可自行调整
  84. System.setProperty("sun.net.client.defaultConnectTimeout", "10000");
  85. System.setProperty("sun.net.client.defaultReadTimeout", "10000");
  86. //初始化ascClient需要的几个参数
  87. final String product = "Dysmsapi";//短信API产品名称(短信产品名固定,无需修改)
  88. final String domain = "dysmsapi.aliyuncs.com";//短信API产品域名(接口地址固定,无需修改)
  89. //替换成你的AK
  90. final String accessKeyId = "LTAIUrvuHqj8pvry";//你的accessKeyId,参考本文档步骤2
  91. final String accessKeySecret = "JLOVl0k8Ke0aaM8nLMMiUAZ3EiiqI4";//你的accessKeySecret,参考本文档步骤2
  92. //初始化ascClient,暂时不支持多region
  93. IClientProfile profile = DefaultProfile.getProfile("cn-hangzhou", accessKeyId,
  94. accessKeySecret);
  95. try {
  96. DefaultProfile.addEndpoint("cn-hangzhou", "cn-hangzhou", product, domain);
  97. } catch (ClientException e1) {
  98. // TODO Auto-generated catch block
  99. e1.printStackTrace();
  100. }
  101. IAcsClient acsClient = new DefaultAcsClient(profile);
  102. //组装请求对象
  103. SendSmsRequest request = new SendSmsRequest();
  104. //使用post提交
  105. request.setMethod(MethodType.POST);
  106. //必填:待发送手机号。支持以逗号分隔的形式进行批量调用,批量上限为1000个手机号码,批量调用相对于单条调用及时性稍有延迟,验证码类型的短信推荐使用单条调用的方式
  107. request.setPhoneNumbers(userPhone);
  108. //必填:短信签名-可在短信控制台中找到
  109. request.setSignName(new String(sign.getBytes("ISO-8859-1"),"utf-8"));
  110. //必填:短信模板-可在短信控制台中找到
  111. request.setTemplateCode("SMS_199808901");
  112. JSONObject jsonObject = new JSONObject();
  113. jsonObject.put("name", name);
  114. jsonObject.put("scene", scene);
  115. request.setTemplateParam(jsonObject.toJSONString());
  116. SendSmsResponse sendSmsResponse = null;
  117. try {
  118. sendSmsResponse = acsClient.getAcsResponse(request);
  119. } catch (ServerException e) {
  120. // TODO Auto-generated catch block
  121. e.printStackTrace();
  122. } catch (ClientException e) {
  123. // TODO Auto-generated catch block
  124. e.printStackTrace();
  125. //System.out.println("向阿里请求发短信失败");
  126. log.error("sendSms:向阿里请求发短信失败");
  127. }
  128. if(sendSmsResponse == null)
  129. {
  130. log.error("sendSms:向阿里请求发短信失败");
  131. }
  132. if(sendSmsResponse.getCode() != null && sendSmsResponse.getCode().equals("OK")) {
  133. //请求成功
  134. //System.out.println("向阿里请求发短信成功");
  135. log.info("sendSms:向阿里请求发短信成功");
  136. return true;
  137. }else {
  138. log.debug("阿里云短信发送失败:" + sendSmsResponse.getCode());
  139. log.debug("阿里云短信发送失败原因:" + sendSmsResponse.getMessage());
  140. }
  141. return false;
  142. }
  143. //aws短信
  144. private Map<String, MessageAttributeValue> smsAttributes;
  145. public Map<String, MessageAttributeValue> getDefaultSMSAttributes() {
  146. if (smsAttributes == null) {
  147. smsAttributes = new HashMap<>();
  148. smsAttributes.put("AWS.SNS.SMS.SenderID", new MessageAttributeValue()
  149. .withStringValue("4dkankan")
  150. .withDataType("String"));
  151. smsAttributes.put("AWS.SNS.SMS.MaxPrice", new MessageAttributeValue()
  152. .withStringValue("1.05")
  153. .withDataType("Number"));
  154. smsAttributes.put("AWS.SNS.SMS.SMSType", new MessageAttributeValue()
  155. .withStringValue("Transactional")
  156. .withDataType("String"));
  157. }
  158. return smsAttributes;
  159. }
  160. public PublishResult sendSMSMessage(String phoneNumber, String message) {
  161. return sendSMSMessage(phoneNumber, message, getDefaultSMSAttributes());
  162. }
  163. public PublishResult sendSMSMessage(String phoneNumber, String message, Map<String, MessageAttributeValue> smsAttributes) {
  164. AWSCredentials awsCredentials = new AWSCredentials() {
  165. @Override
  166. public String getAWSAccessKeyId() {
  167. return "AKIAWCV5QFZ3ZQS7LBNL"; // 带有发短信权限的 IAM 的 ACCESS_KEY
  168. }
  169. @Override
  170. public String getAWSSecretKey() {
  171. return "NDzNp/5tqypSxxyPkkoixeJntn5W6dq0cLYV2FUH"; // 带有发短信权限的 IAM 的 SECRET_KEY
  172. }
  173. };
  174. AWSCredentialsProvider provider = new AWSCredentialsProvider() {
  175. @Override
  176. public AWSCredentials getCredentials() {
  177. return awsCredentials;
  178. }
  179. @Override
  180. public void refresh() {
  181. }
  182. };
  183. AmazonSNS amazonSNS = null;
  184. try {
  185. amazonSNS = AmazonSNSClientBuilder.standard().withCredentials(provider).withRegion("eu-central-1").build();
  186. } catch (Exception e) {
  187. }
  188. return amazonSNS.publish(
  189. new PublishRequest()
  190. .withMessage(EN_CODE_MSG.replace("${code}", message))
  191. .withPhoneNumber(phoneNumber)
  192. .withMessageAttributes(smsAttributes)
  193. );
  194. }
  195. }