123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228 |
- 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<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)
- );
- }
- }
|