- 添加 aliyun 短信发送服务

This commit is contained in:
sin-ning@aliyun.com 2019-05-26 11:31:42 +08:00
parent 74724637b7
commit 37da2b0bc9
10 changed files with 113 additions and 86 deletions

View File

@ -68,10 +68,11 @@ public interface SmsService {
* 模板 - 创建 * 模板 - 创建
* *
* @param smsSignId 选用的哪个签名 * @param smsSignId 选用的哪个签名
* @param templateCode 模板code
* @param template 模板内容 * @param template 模板内容
* @param platform 平台 * @param platform 平台
*/ */
void createTemplate(Integer smsSignId, String template, Integer platform, Integer smsType); void createTemplate(Integer smsSignId, String templateCode, String template, Integer platform, Integer smsType);
/** /**
* 模板 - 获取 * 模板 - 获取
@ -97,7 +98,6 @@ public interface SmsService {
*/ */
void deleteTemplate(Integer id); void deleteTemplate(Integer id);
/** /**
* 短信发送 - 单个 * 短信发送 - 单个
* *

View File

@ -1,16 +1,18 @@
package cn.iocoder.mall.admin.client; package cn.iocoder.mall.admin.client;
import com.alibaba.fastjson.JSON;
import com.aliyuncs.CommonRequest; import com.aliyuncs.CommonRequest;
import com.aliyuncs.CommonResponse; import com.aliyuncs.CommonResponse;
import com.aliyuncs.DefaultAcsClient; import com.aliyuncs.DefaultAcsClient;
import com.aliyuncs.IAcsClient; import com.aliyuncs.IAcsClient;
import com.aliyuncs.exceptions.ClientException; import com.aliyuncs.exceptions.ClientException;
import com.aliyuncs.exceptions.ServerException;
import com.aliyuncs.http.MethodType; import com.aliyuncs.http.MethodType;
import com.aliyuncs.profile.DefaultProfile; import com.aliyuncs.profile.DefaultProfile;
import org.springframework.beans.factory.annotation.Value; import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import java.util.Arrays;
import java.util.Collections;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
@ -23,21 +25,26 @@ import java.util.Map;
@Component @Component
public class SmsAliYunClient implements SmsClient { public class SmsAliYunClient implements SmsClient {
@Value("sms.aliYun.accessKeyId") @Value("${sms.aliYun.accessKeyId}")
private String accessKeyId; private String accessKeyId;
@Value("sms.aliYun.accessSecret") @Value("${sms.aliYun.accessSecret}")
private String accessSecret; private String accessSecret;
private static final String DOMAIN = "dysmsapi.aliyuncs.com"; private static final String DOMAIN = "dysmsapi.aliyuncs.com";
@Override @Override
public SendResult singleSend(String mobile, String sign, String template, Map<String, String> params) { public SendResult singleSend(String mobile, String sign, String templateCode,
String template, Map<String, String> templateParams) {
IAcsClient client = getClient(); IAcsClient client = getClient();
CommonRequest request = new CommonRequest(); CommonRequest request = new CommonRequest();
request.setMethod(MethodType.POST); request.setMethod(MethodType.POST);
request.setDomain(DOMAIN); request.setDomain(DOMAIN);
request.setVersion("2017-05-25"); request.setVersion("2017-05-25");
request.setAction("SendSms"); request.setAction("SendSms");
request.putQueryParameter("PhoneNumbers", mobile);
request.putQueryParameter("SignName", sign);
request.putQueryParameter("TemplateCode", templateCode);
request.putQueryParameter("TemplateParam", JSON.toJSONString(templateParams));
try { try {
CommonResponse response = client.getCommonResponse(request); CommonResponse response = client.getCommonResponse(request);
@ -49,8 +56,8 @@ public class SmsAliYunClient implements SmsClient {
} }
@Override @Override
public SendResult batchSend(List<String> mobileList, String sign, String template, Map<String, String> params) { public SendResult batchSend(List<String> mobileList, String sign, String templateCode,
String template, Map<String, String> templateParams) {
// 获取 client // 获取 client
IAcsClient client = getClient(); IAcsClient client = getClient();
@ -60,12 +67,14 @@ public class SmsAliYunClient implements SmsClient {
request.setDomain(DOMAIN); request.setDomain(DOMAIN);
request.setVersion("2017-05-25"); request.setVersion("2017-05-25");
request.setAction("SendBatchSms"); request.setAction("SendBatchSms");
request.putQueryParameter("PhoneNumberJson", JSON.toJSONString(mobileList));
request.putQueryParameter("SignNameJson", JSON.toJSONString(Collections.singletonList(sign)));
request.putQueryParameter("TemplateCode", templateCode);
request.putQueryParameter("TemplateParamJson", JSON.toJSONString(Collections.singletonList(templateParams)));
try { try {
CommonResponse response = client.getCommonResponse(request); CommonResponse response = client.getCommonResponse(request);
System.out.println(response.getData()); System.out.println(response.getData());
} catch (ServerException e) {
e.printStackTrace();
} catch (ClientException e) { } catch (ClientException e) {
e.printStackTrace(); e.printStackTrace();
} }

View File

@ -28,14 +28,26 @@ public interface SmsClient {
/** /**
* 短信发送 - 单个 * 短信发送 - 单个
* *
* @return * @param mobile 手机号
* @param sign 签名
* @param templateCode 短信模板code
* @param template 短信模板
* @param templateParams 短信模板 params
* @return 发送后信息
*/ */
SendResult singleSend(String mobile, String sign, String template, Map<String, String> params); SendResult singleSend(String mobile, String sign, String templateCode,
String template, Map<String, String> templateParams);
/** /**
* 短信发送 - 批量 * 短信发送 - 批量
* *
* @return * @param mobileList 手机号
* @param sign 签名
* @param templateCode 短信模板 code
* @param template 短信模板
* @param templateParams 短信模板params
* @return 发送后信息
*/ */
SendResult batchSend(List<String> mobileList, String sign, String template, Map<String, String> params); SendResult batchSend(List<String> mobileList, String sign, String templateCode,
String template, Map<String, String> templateParams);
} }

View File

@ -2,7 +2,6 @@ package cn.iocoder.mall.admin.client;
import cn.iocoder.common.framework.exception.ServiceException; import cn.iocoder.common.framework.exception.ServiceException;
import cn.iocoder.mall.admin.api.constant.AdminErrorCodeEnum; import cn.iocoder.mall.admin.api.constant.AdminErrorCodeEnum;
import cn.iocoder.mall.admin.api.constant.SmsApplyStatusEnum;
import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.JSONObject;
import org.apache.http.HttpEntity; import org.apache.http.HttpEntity;
@ -96,8 +95,7 @@ public class SmsYunPianClient implements SmsClient {
private String apiKey; private String apiKey;
@Override @Override
public SendResult singleSend(String mobile, String sign, String template, Map<String, String> templateParams) { public SendResult singleSend(String mobile, String sign, String templateCode, String template, Map<String, String> templateParams) {
// build 模板 // build 模板
template = buildTemplate(sign, template, templateParams); template = buildTemplate(sign, template, templateParams);
@ -123,8 +121,7 @@ public class SmsYunPianClient implements SmsClient {
} }
@Override @Override
public SendResult batchSend(List<String> mobileList, String sign, String template, Map<String, String> templateParams) { public SendResult batchSend(List<String> mobileList, String sign, String templateCode, String template, Map<String, String> templateParams) {
// build 模板 // build 模板
template = buildTemplate(sign, template, templateParams); template = buildTemplate(sign, template, templateParams);
@ -174,17 +171,19 @@ public class SmsYunPianClient implements SmsClient {
* *
* @param sign * @param sign
* @param template * @param template
* @param params * @param templateParams
* @return * @return
*/ */
private static String buildTemplate(String sign, String template, Map<String, String> params) { private static String buildTemplate(String sign, String template,
if (CollectionUtils.isEmpty(params)) { Map<String, String> templateParams) {
if (CollectionUtils.isEmpty(templateParams)) {
return template; return template;
} }
LOGGER.debug("模板构建 before -> {}", template); LOGGER.debug("模板构建 before -> {}", template);
for (Map.Entry<String, String> entry : params.entrySet()) { for (Map.Entry<String, String> entry : templateParams.entrySet()) {
String paramsKey = entry.getKey(); String paramsKey = entry.getKey();
String value = entry.getValue(); String value = entry.getValue();
String paramPlace = String.format(PARAM_TEMPLATE, paramsKey); String paramPlace = String.format(PARAM_TEMPLATE, paramsKey);
@ -196,28 +195,6 @@ public class SmsYunPianClient implements SmsClient {
return template; return template;
} }
/**
* 短信 status 云片状态 映射关系
*
* @param checkStatus
* @return
*/
private static Integer smsStatusMapping(String checkStatus) {
Integer applyStatus;
switch (checkStatus) {
case "SUCCESS":
applyStatus = SmsApplyStatusEnum.SUCCESS.getValue();
break;
case "FAIL":
applyStatus = SmsApplyStatusEnum.FAIL.getValue();
break;
default:
applyStatus = SmsApplyStatusEnum.CHECKING.getValue();
break;
}
return applyStatus;
}
/** /**
* 基于HttpClient 4.3的通用POST方法 * 基于HttpClient 4.3的通用POST方法
* *

View File

@ -20,11 +20,14 @@ public class SmsTemplateDO extends DeletableDO {
* 编号 * 编号
*/ */
private Integer id; private Integer id;
// TODO FROM 芋艿 TO 小范短信类型分成验证码类通知类营销类
/** /**
* 模板编号 (第三方的) * 模板编号 (第三方的)
*/ */
private Integer smsSignId; private Integer smsSignId;
/**
* 模板 code第三方平台 code
*/
private String templateCode;
/** /**
* 短信签名 id * 短信签名 id
*/ */

View File

@ -2,18 +2,17 @@ package cn.iocoder.mall.admin.service;
import cn.iocoder.common.framework.constant.DeletedStatusEnum; import cn.iocoder.common.framework.constant.DeletedStatusEnum;
import cn.iocoder.common.framework.exception.ServiceException; import cn.iocoder.common.framework.exception.ServiceException;
import cn.iocoder.mall.admin.api.DataDictService; import cn.iocoder.mall.admin.api.SmsService;
import cn.iocoder.mall.admin.api.bo.sms.PageSmsSignBO;
import cn.iocoder.mall.admin.api.bo.sms.PageSmsTemplateBO;
import cn.iocoder.mall.admin.api.bo.sms.SmsSignBO;
import cn.iocoder.mall.admin.api.bo.sms.SmsTemplateBO;
import cn.iocoder.mall.admin.api.constant.AdminErrorCodeEnum;
import cn.iocoder.mall.admin.api.constant.SmsApplyStatusEnum; import cn.iocoder.mall.admin.api.constant.SmsApplyStatusEnum;
import cn.iocoder.mall.admin.api.constant.SmsPlatformEnum; import cn.iocoder.mall.admin.api.constant.SmsPlatformEnum;
import cn.iocoder.mall.admin.client.SmsClient;
import cn.iocoder.mall.admin.api.SmsService;
import cn.iocoder.mall.admin.api.bo.sms.SmsSignBO;
import cn.iocoder.mall.admin.api.bo.sms.PageSmsSignBO;
import cn.iocoder.mall.admin.api.bo.sms.SmsTemplateBO;
import cn.iocoder.mall.admin.api.bo.sms.PageSmsTemplateBO;
import cn.iocoder.mall.admin.api.constant.AdminErrorCodeEnum;
import cn.iocoder.mall.admin.api.dto.sms.PageQuerySmsSignDTO; import cn.iocoder.mall.admin.api.dto.sms.PageQuerySmsSignDTO;
import cn.iocoder.mall.admin.api.dto.sms.PageQuerySmsTemplateDTO; import cn.iocoder.mall.admin.api.dto.sms.PageQuerySmsTemplateDTO;
import cn.iocoder.mall.admin.client.SmsClient;
import cn.iocoder.mall.admin.convert.SmsSignConvert; import cn.iocoder.mall.admin.convert.SmsSignConvert;
import cn.iocoder.mall.admin.convert.SmsTemplateConvert; import cn.iocoder.mall.admin.convert.SmsTemplateConvert;
import cn.iocoder.mall.admin.dao.SmsSignMapper; import cn.iocoder.mall.admin.dao.SmsSignMapper;
@ -44,8 +43,6 @@ import java.util.Map;
@org.apache.dubbo.config.annotation.Service(validation = "true", version = "${dubbo.provider.SmsService.version}") @org.apache.dubbo.config.annotation.Service(validation = "true", version = "${dubbo.provider.SmsService.version}")
public class SmsServiceImpl implements SmsService { public class SmsServiceImpl implements SmsService {
private static final String SMS_TEMPLATE = "【%s】%s";
@Autowired @Autowired
private SmsSignMapper smsSignMapper; private SmsSignMapper smsSignMapper;
@Autowired @Autowired
@ -57,8 +54,6 @@ public class SmsServiceImpl implements SmsService {
@Autowired @Autowired
@Qualifier("smsAliYunClient") @Qualifier("smsAliYunClient")
private SmsClient smsAliYunClient; private SmsClient smsAliYunClient;
@Autowired
private DataDictService dataDictService;
@Override @Override
public PageSmsSignBO pageSmsSign(PageQuerySmsSignDTO queryDTO) { public PageSmsSignBO pageSmsSign(PageQuerySmsSignDTO queryDTO) {
@ -201,7 +196,8 @@ public class SmsServiceImpl implements SmsService {
@Override @Override
@Transactional @Transactional
public void createTemplate(Integer smsSignId, String template, Integer platform, Integer smsType) { public void createTemplate(Integer smsSignId, String templateCode,
String template, Integer platform, Integer smsType) {
SmsSignDO smsSignDO = smsSignMapper.selectOne( SmsSignDO smsSignDO = smsSignMapper.selectOne(
new QueryWrapper<SmsSignDO>().eq("id", smsSignId)); new QueryWrapper<SmsSignDO>().eq("id", smsSignId));
@ -216,6 +212,7 @@ public class SmsServiceImpl implements SmsService {
(SmsTemplateDO) new SmsTemplateDO() (SmsTemplateDO) new SmsTemplateDO()
.setId(null) .setId(null)
.setSmsSignId(smsSignId) .setSmsSignId(smsSignId)
.setTemplateCode(templateCode)
.setTemplate(template) .setTemplate(template)
.setPlatform(platform) .setPlatform(platform)
.setSmsType(smsType) .setSmsType(smsType)
@ -314,7 +311,8 @@ public class SmsServiceImpl implements SmsService {
// 获取 client // 获取 client
SmsClient smsClient = getSmsClient(smsTemplateDO.getPlatform()); SmsClient smsClient = getSmsClient(smsTemplateDO.getPlatform());
// 发送短信 // 发送短信
smsClient.singleSend(mobile, smsSignDO.getSign(), smsTemplateDO.getTemplate(), params); smsClient.singleSend(mobile, smsSignDO.getSign(),
smsTemplateDO.getTemplateCode(), smsTemplateDO.getTemplate(), params);
} }
@Override @Override
@ -339,7 +337,8 @@ public class SmsServiceImpl implements SmsService {
// 获取 client // 获取 client
SmsClient smsClient = getSmsClient(smsTemplateDO.getPlatform()); SmsClient smsClient = getSmsClient(smsTemplateDO.getPlatform());
// 发送短信 // 发送短信
smsClient.batchSend(mobileList, smsSignDO.getSign(), smsTemplateDO.getTemplate(), params); smsClient.batchSend(mobileList, smsSignDO.getSign(),
smsTemplateDO.getTemplateCode(), smsTemplateDO.getTemplate(), params);
} }
/** /**

View File

@ -27,12 +27,10 @@ mybatis-plus:
# sms # sms
sms: sms:
yunPian: yunPian:
apiKey: d4705399e71e822fe3a90f801ed95bd9 apiKey: ${YUN_PIAN}
aliYun: aliYun:
accessKeyId: d4705399e71e822fe3a90f801ed95bd9 accessKeyId: ${ALI_YUN_KEY_ID}
accessSecret: d4705399e71e822fe3a90f801ed95bd9 accessSecret: ${ALI_YUN_SECRET}
# dubbo # dubbo
dubbo: dubbo:

View File

@ -0,0 +1,33 @@
package cn.iocoder.mall.admin.client;
import cn.iocoder.mall.admin.SystemApplicationTest;
import com.google.common.collect.ImmutableMap;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
/**
* 阿里云 短信 test
*
* @author Sin
* @time 2019/5/26 10:08 AM
*/
@RunWith(SpringRunner.class)
@SpringBootTest(classes = SystemApplicationTest.class)
public class SmsAliYunClientTest {
@Autowired
private SmsAliYunClient smsAliYunClient;
@Test
public void singleSendTest() {
String sign = "阿里云短信测试专用";
String mobile = "13302926050";
String templateCode = "SMS_137110043";
String template = "验证码#code#,您正在进行身份验证,打死不要告诉别人哦!";
smsAliYunClient.singleSend(mobile, sign, templateCode,
template, ImmutableMap.of("code", "8888"));
}
}

View File

@ -1,14 +1,6 @@
package cn.iocoder.mall.admin.client; package cn.iocoder.mall.admin.client;
import cn.iocoder.mall.admin.SystemApplicationTest; import cn.iocoder.mall.admin.SystemApplicationTest;
import com.aliyuncs.CommonRequest;
import com.aliyuncs.CommonResponse;
import com.aliyuncs.DefaultAcsClient;
import com.aliyuncs.IAcsClient;
import com.aliyuncs.exceptions.ClientException;
import com.aliyuncs.exceptions.ServerException;
import com.aliyuncs.http.MethodType;
import com.aliyuncs.profile.DefaultProfile;
import com.google.common.collect.ImmutableMap; import com.google.common.collect.ImmutableMap;
import org.assertj.core.util.Lists; import org.assertj.core.util.Lists;
import org.junit.Before; import org.junit.Before;
@ -18,8 +10,6 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest; import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner; import org.springframework.test.context.junit4.SpringRunner;
import java.util.Map;
/** /**
* 短信 sms client test * 短信 sms client test
* *
@ -44,13 +34,15 @@ public class SmsYunPianClientTest {
public void sendMobileTest() { public void sendMobileTest() {
String mobile = "13302926050"; String mobile = "13302926050";
String template = "您的验证码是#code#,打死也不告诉别人哦。"; String template = "您的验证码是#code#,打死也不告诉别人哦。";
smsYunPianClient.singleSend(mobile, sign, template, ImmutableMap.of("code", "1111")); smsYunPianClient.singleSend(mobile, sign, null,
template, ImmutableMap.of("code", "1111"));
} }
@Test @Test
public void batchSendTest() { public void batchSendTest() {
String mobile = "13302926050"; String mobile = "13302926050";
String template = "您的验证码是#code#,打死也不告诉别人哦。"; String template = "您的验证码是#code#,打死也不告诉别人哦。";
smsYunPianClient.batchSend(Lists.newArrayList(mobile), sign, template, ImmutableMap.of("code", "2222")); smsYunPianClient.batchSend(Lists.newArrayList(mobile), sign, null,
template, ImmutableMap.of("code", "2222"));
} }
} }

View File

@ -31,8 +31,8 @@ public class SmsServiceImplTest {
@Test @Test
public void createSignTest() { public void createSignTest() {
smsService.createSign("悦跑运动", SmsPlatformEnum.YunPian.getValue()); // smsService.createSign("悦跑运动", SmsPlatformEnum.YunPian.getValue());
smsService.createSign("登录确认验证码", SmsPlatformEnum.AliYun.getValue());
} }
@Test @Test
@ -50,7 +50,6 @@ public class SmsServiceImplTest {
Assert.assertTrue("更新不成功!", smsSignBO.getSign().equals(newSign)); Assert.assertTrue("更新不成功!", smsSignBO.getSign().equals(newSign));
} }
@Test @Test
public void deletedSignTest() { public void deletedSignTest() {
smsService.deleteSign(3); smsService.deleteSign(3);
@ -61,23 +60,28 @@ public class SmsServiceImplTest {
@Test @Test
public void createTemplateTest() { public void createTemplateTest() {
String template = "您的验证码是#code#,打死也不告诉别人哦。"; Integer sign = 4;
smsService.createTemplate(3, template, String templateCode = "SMS_137110043";
SmsPlatformEnum.YunPian.getValue(), String template = "验证码#code#,您正在登录,若非本人操作,请勿泄露。";
smsService.createTemplate(
sign,
templateCode,
template,
SmsPlatformEnum.AliYun.getValue(),
SmsTypeEnum.VERIFICATION_CODE.getValue()); SmsTypeEnum.VERIFICATION_CODE.getValue());
} }
@Test @Test
public void singleSendTest() { public void singleSendTest() {
String mobile = "13302926050"; String mobile = "13302926050";
Integer templateId = 5; Integer templateId = 7;
smsService.singleSend(mobile, templateId, ImmutableMap.of("code", "8888")); smsService.singleSend(mobile, templateId, ImmutableMap.of("code", "8888"));
} }
@Test @Test
public void batchSendTest() { public void batchSendTest() {
String mobile = "13302926050"; String mobile = "13302926050";
Integer templateId = 5; Integer templateId = 7;
smsService.batchSend(Lists.newArrayList(mobile), templateId, ImmutableMap.of("code", "8888")); smsService.batchSend(Lists.newArrayList(mobile), templateId, ImmutableMap.of("code", "8888"));
} }
} }