提交 74724637 authored 作者: sin-ning@aliyun.com's avatar sin-ning@aliyun.com

- 各短信平台兼容问题,放弃 sign 和 template 模板审核过程

- 增加短信类型 - 云片ok - 阿里云 未完成
上级 e8e4a478
...@@ -330,7 +330,7 @@ public class OrderServiceImpl implements OrderService { ...@@ -330,7 +330,7 @@ public class OrderServiceImpl implements OrderService {
// if (commonResult.isError()) { // if (commonResult.isError()) {
// //手动开启事务回滚 // //手动开启事务回滚
// TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); // TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
// return ServiceExceptionUtil.error(OrderErrorCodeEnum.ORDER_GET_PAY_FAIL.getCode()); // return ServiceExceptionUtil.error(OrderErrorCodeEnum.ORDER_GET_PAY_FAIL.getValue());
// } // }
// TODO: 2019-03-17 Sin 需要发送 创建成果 MQ 消息,业务扩展和统计 // TODO: 2019-03-17 Sin 需要发送 创建成果 MQ 消息,业务扩展和统计
......
package cn.iocoder.mall.admin.api;
import lombok.Data;
import lombok.experimental.Accessors;
import java.util.List;
/**
* 短信平台
*
* @author Sin
* @time 2019/5/16 6:33 PM
*/
public interface SmsPlatform {
@Data
@Accessors(chain = true)
class Result {
/**
* 编号
*/
private String id;
/**
* 审核状态
*/
private Integer applyStatus;
/**
* 审核内容
*/
private String applyMessage;
}
/**
* 签名 - 创建
*
* @param sign
*/
Result createSign(String sign);
/**
* 签名 - 获取
*
* @param sign
*/
Result getSign(String sign);
/**
* 签名 - 更新
*
* @param oldSign
* @param sign
*/
Result updateSign(String oldSign, String sign);
/**
* 模板 - 创建
*
* @param template 模板内容
* @param tplType 1 为验证码类型,其他为 null
*/
Result createTemplate(String template, Integer tplType);
/**
* 模板 - 获取
*
* @param tplId
*/
Result getTemplate(String tplId);
/**
* 模板 - 更新
*
* @param tplId 选用的哪个签名
* @param template 模板内容
* @param tplType 1 为验证码类型,其他为 null
*/
Result updateTemplate(String tplId, String template, Integer tplType);
/**
* 模板 - 删除
*
* @param tplId
* @return
*/
Result deleteTemplate(String tplId);
@Data
@Accessors(chain = true)
class SendResult {
private Boolean hasSuccess;
private Integer code;
private String message;
private List<String> success;
private List<String> fail;
}
/**
* 短信发送 - 单个
*
* @return
*/
SendResult singleSend(String mobile, String template);
/**
* 短信发送 - 批量
*
* @return
*/
SendResult batchSend(List<String> mobileList, String template);
}
...@@ -39,47 +39,56 @@ public interface SmsService { ...@@ -39,47 +39,56 @@ public interface SmsService {
* *
* @param sign * @param sign
*/ */
void createSign(String sign); void createSign(String sign, Integer platform);
/** /**
* 签名 - 获取 * 签名 - 获取
* *
* @param sign * @param id
*/ */
SmsSignBO getSign(String sign); SmsSignBO getSign(Integer id);
/** /**
* 签名 - 更新 * 签名 - 更新
* *
* @param oldSign * @param id
* @param sign * @param newSign
* @param platform
*/
void updateSign(Integer id, String newSign, Integer platform);
/**
* 签名 - 更新
*
* @param id
*/ */
void updateSign(String oldSign, String sign); void deleteSign(Integer id);
/** /**
* 模板 - 创建 * 模板 - 创建
* *
* @param smsSignId 选用的哪个签名 * @param smsSignId 选用的哪个签名
* @param template 模板内容 * @param template 模板内容
* @param tplType 1 为验证码类型,其他为 null * @param platform 平台
*/ */
void createTemplate(Integer smsSignId, String template, Integer tplType); void createTemplate(Integer smsSignId, String template, Integer platform, Integer smsType);
/** /**
* 模板 - 获取 * 模板 - 获取
* *
* @param id * @param id
*/ */
SmsTemplateBO getTemplate(Integer id); SmsTemplateBO getTemplate(Integer id, Integer platform);
/** /**
* 模板 - 更新 * 模板 - 更新
* *
* @param id 模板id * @param id 模板id
* @param smsSignId 短期签名
* @param template 模板内容 * @param template 模板内容
* @param tplType 1 为验证码类型,其他为 null * @param platform 短信平台
*/ */
void updateTemplate(Integer id, String template, Integer tplType); void updateTemplate(Integer id, Integer smsSignId, String template, Integer platform, Integer smsType);
/** /**
* 模板 - 删除 * 模板 - 删除
......
...@@ -56,6 +56,7 @@ public enum AdminErrorCodeEnum { ...@@ -56,6 +56,7 @@ public enum AdminErrorCodeEnum {
SMS_SIGN_IS_EXISTENT(1002006002, "短信签名已存在"), SMS_SIGN_IS_EXISTENT(1002006002, "短信签名已存在"),
SMS_TEMPLATE_NOT_EXISTENT(1002006020, "短信签名不存在"), SMS_TEMPLATE_NOT_EXISTENT(1002006020, "短信签名不存在"),
SMS_TEMPLATE_IS_EXISTENT(1002006021, "短信签名不存在"), SMS_TEMPLATE_IS_EXISTENT(1002006021, "短信签名不存在"),
SMS_NOT_SEND_CLIENT(1002006030, "短信没有发送的client"),
; ;
private final int code; private final int code;
......
package cn.iocoder.mall.admin.api.constant;
/**
* 字典 key
*
* @author Sin
* @time 2019/5/25 3:36 PM
*/
public class DictKeyConstants {
}
...@@ -13,19 +13,19 @@ public enum SmsApplyStatusEnum { ...@@ -13,19 +13,19 @@ public enum SmsApplyStatusEnum {
FAIL(3, "审核失败"), FAIL(3, "审核失败"),
; ;
private final int code; private final Integer value;
private final String message; private final String name;
SmsApplyStatusEnum(int code, String message) { SmsApplyStatusEnum(int code, String message) {
this.code = code; this.value = code;
this.message = message; this.name = message;
} }
public int getCode() { public int getValue() {
return code; return value;
} }
public String getMessage() { public String getName() {
return message; return name;
} }
} }
package cn.iocoder.mall.admin.api.constant;
/**
* 短信审核状态
*
* @author Sin
* @time 2019/5/16 12:48 PM
*/
public enum SmsPlatformEnum {
YunPian(1, "云片"),
AliYun(2, "阿里云"),
;
private final Integer value;
private final String name;
SmsPlatformEnum(Integer code, String message) {
this.value = code;
this.name = message;
}
public Integer getValue() {
return value;
}
public String getName() {
return name;
}
}
package cn.iocoder.mall.admin.api.constant;
/**
* 短信审核状态
*
* @author Sin
* @time 2019/5/16 12:48 PM
*/
public enum SmsTypeEnum {
VERIFICATION_CODE(1, "验证码"),
NOTICE(1, "通知"),
MARKETING(2, "营销"),
;
private final Integer value;
private final String name;
SmsTypeEnum(Integer code, String message) {
this.value = code;
this.name = message;
}
public Integer getValue() {
return value;
}
public String getName() {
return name;
}
}
...@@ -31,7 +31,6 @@ ...@@ -31,7 +31,6 @@
<groupId>org.springframework</groupId> <groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId> <artifactId>spring-jdbc</artifactId>
</dependency> </dependency>
<dependency> <dependency>
<groupId>com.alibaba</groupId> <groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId> <artifactId>druid-spring-boot-starter</artifactId>
...@@ -72,12 +71,22 @@ ...@@ -72,12 +71,22 @@
<artifactId>yunpian-java-sdk</artifactId> <artifactId>yunpian-java-sdk</artifactId>
<version>1.2.7</version> <version>1.2.7</version>
</dependency> </dependency>
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>aliyun-java-sdk-core</artifactId>
<version>4.1.0</version>
</dependency>
<!-- test --> <!-- test -->
<dependency> <dependency>
<groupId>org.springframework.boot</groupId> <groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId> <artifactId>spring-boot-starter-test</artifactId>
</dependency> </dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-api</artifactId>
<version>5.4.0</version>
</dependency>
</dependencies> </dependencies>
<build> <build>
......
package cn.iocoder.mall.admin.client;
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 org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import java.util.List;
import java.util.Map;
/**
* 短信 AliYun client
*
* @author Sin
* @time 2019/5/25 12:28 PM
*/
@Component
public class SmsAliYunClient implements SmsClient {
@Value("sms.aliYun.accessKeyId")
private String accessKeyId;
@Value("sms.aliYun.accessSecret")
private String accessSecret;
private static final String DOMAIN = "dysmsapi.aliyuncs.com";
@Override
public SendResult singleSend(String mobile, String sign, String template, Map<String, String> params) {
IAcsClient client = getClient();
CommonRequest request = new CommonRequest();
request.setMethod(MethodType.POST);
request.setDomain(DOMAIN);
request.setVersion("2017-05-25");
request.setAction("SendSms");
try {
CommonResponse response = client.getCommonResponse(request);
System.out.println(response.getData());
} catch (ClientException e) {
e.printStackTrace();
}
return null;
}
@Override
public SendResult batchSend(List<String> mobileList, String sign, String template, Map<String, String> params) {
// 获取 client
IAcsClient client = getClient();
// params
CommonRequest request = new CommonRequest();
request.setMethod(MethodType.POST);
request.setDomain(DOMAIN);
request.setVersion("2017-05-25");
request.setAction("SendBatchSms");
try {
CommonResponse response = client.getCommonResponse(request);
System.out.println(response.getData());
} catch (ServerException e) {
e.printStackTrace();
} catch (ClientException e) {
e.printStackTrace();
}
return null;
}
/**
* 获取 client
*
* @return
*/
private IAcsClient getClient() {
return new DefaultAcsClient(DefaultProfile.getProfile("default", accessKeyId, accessSecret));
}
}
package cn.iocoder.mall.admin.client;
import lombok.Data;
import lombok.experimental.Accessors;
import java.util.List;
import java.util.Map;
/**
* 短信平台
*
* @author Sin
* @time 2019/5/16 6:33 PM
*/
public interface SmsClient {
@Data
@Accessors(chain = true)
class SendResult {
private Boolean isSuccess;
private Integer code;
private String message;
}
/**
* 短信发送 - 单个
*
* @return
*/
SendResult singleSend(String mobile, String sign, String template, Map<String, String> params);
/**
* 短信发送 - 批量
*
* @return
*/
SendResult batchSend(List<String> mobileList, String sign, String template, Map<String, String> params);
}
package cn.iocoder.mall.admin.dataobject;
import cn.iocoder.common.framework.dataobject.BaseDO;
import lombok.Data;
import lombok.experimental.Accessors;
/**
* 短信 client log
*
* @author Sin
* @time 2019/5/25 12:36 PM
*/
@Data
@Accessors(chain = true)
public class SmsClientLog extends BaseDO {
/**
* 编号
*/
private Integer id;
/**
* 短信模板
*/
private Integer templateId;
/**
* 短信
*/
private String template;
/**
* 发送信息
*/
private String message;
}
...@@ -22,14 +22,17 @@ public class SmsSignDO extends DeletableDO { ...@@ -22,14 +22,17 @@ public class SmsSignDO extends DeletableDO {
* 编号 * 编号
*/ */
private Integer id; private Integer id;
/**
* 签名id 这个是第三方的
*/
private String platformId;
/** /**
* 签名名称 * 签名名称
*/ */
private String sign; private String sign;
/**
* 平台
*
* 1、云片
* 2、阿里云
*/
private Integer platform;
/** /**
* 审核状态 * 审核状态
* *
......
...@@ -28,11 +28,19 @@ public class SmsTemplateDO extends DeletableDO { ...@@ -28,11 +28,19 @@ public class SmsTemplateDO extends DeletableDO {
/** /**
* 短信签名 id * 短信签名 id
*/ */
private String platformId; private Integer platform;
/** /**
* 短信模板 * 短信模板
*/ */
private String template; private String template;
/**
* 短信类型
*
* - 验证码类
* - 通知类
* - 营销类
*/
private Integer smsType;
/** /**
* 审核状态 * 审核状态
* *
......
...@@ -26,7 +26,13 @@ mybatis-plus: ...@@ -26,7 +26,13 @@ mybatis-plus:
# sms # sms
sms: sms:
apiKey: d4705399e71e822fe3a90f801ed95bd9 yunPian:
apiKey: d4705399e71e822fe3a90f801ed95bd9
aliYun:
accessKeyId: d4705399e71e822fe3a90f801ed95bd9
accessSecret: d4705399e71e822fe3a90f801ed95bd9
# dubbo # dubbo
dubbo: dubbo:
......
package cn.iocoder.mall.admin.client;
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 org.assertj.core.util.Lists;
import org.junit.Before;
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;
import java.util.Map;
/**
* 短信 sms client test
*
* @author Sin
* @time 2019/5/25 12:46 PM
*/
@RunWith(SpringRunner.class)
@SpringBootTest(classes = SystemApplicationTest.class)
public class SmsYunPianClientTest {
@Autowired
private SmsYunPianClient smsYunPianClient;
private String sign = null;
@Before
public void setup() {
sign = "悦跑运动";
}
@Test
public void sendMobileTest() {
String mobile = "13302926050";
String template = "您的验证码是#code#,打死也不告诉别人哦。";
smsYunPianClient.singleSend(mobile, sign, template, ImmutableMap.of("code", "1111"));
}
@Test
public void batchSendTest() {
String mobile = "13302926050";
String template = "您的验证码是#code#,打死也不告诉别人哦。";
smsYunPianClient.batchSend(Lists.newArrayList(mobile), sign, template, ImmutableMap.of("code", "2222"));
}
}
package cn.iocoder.mall.admin.service; package cn.iocoder.mall.admin.service;
import cn.iocoder.common.framework.exception.ServiceException;
import cn.iocoder.mall.admin.SystemApplicationTest; import cn.iocoder.mall.admin.SystemApplicationTest;
import cn.iocoder.mall.admin.api.SmsService;
import cn.iocoder.mall.admin.api.bo.sms.SmsSignBO; 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.SmsPlatformEnum;
import cn.iocoder.mall.admin.api.constant.SmsTypeEnum;
import com.google.common.collect.ImmutableMap;
import org.assertj.core.util.Lists;
import org.junit.Assert; import org.junit.Assert;
import org.junit.Test; import org.junit.Test;
import org.junit.jupiter.api.Assertions;
import org.junit.runner.RunWith; import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest; import org.springframework.boot.test.context.SpringBootTest;
...@@ -21,55 +27,57 @@ import org.springframework.test.context.junit4.SpringRunner; ...@@ -21,55 +27,57 @@ import org.springframework.test.context.junit4.SpringRunner;
public class SmsServiceImplTest { public class SmsServiceImplTest {
@Autowired @Autowired
private SmsServiceImpl smsService; private SmsService smsService;
@Test @Test
public void createSignTest() { public void createSignTest() {
smsService.createSign("测试签名1"); smsService.createSign("悦跑运动", SmsPlatformEnum.YunPian.getValue());
// smsService.createSign("悦跑会");
} }
@Test @Test
public void getSignTest() { public void getSignTest() {
SmsSignBO smsSignBO = smsService.getSign("悦跑会"); SmsSignBO smsSignBO = smsService.getSign(3);
Assert.assertNotNull(smsSignBO); Assert.assertNotNull("不能为空!", smsSignBO);
} }
@Test @Test
public void updateSignTest() { public void updateSignTest() {
smsService.updateSign("测试签名2", "测试签名3"); String oldSign = "悦跑运动2";
SmsSignBO newSmsSignBO = smsService.getSign("测试签名3"); String newSign = "悦跑运动";
Assert.assertNotNull(newSmsSignBO); smsService.updateSign(3, newSign, SmsPlatformEnum.YunPian.getValue());
SmsSignBO smsSignBO = smsService.getSign(3);
Assert.assertTrue("更新不成功!", smsSignBO.getSign().equals(newSign));
} }
///
/// template
@Test
public void createTemplateTest() {
smsService.createTemplate(1, "打死也不要告诉别人哦002 #code# ", 1);
}
@Test @Test
public void getTemplateTest() { public void deletedSignTest() {
SmsTemplateBO smsTemplateBO = smsService.getTemplate(3); smsService.deleteSign(3);
Assert.assertNotNull(smsTemplateBO); Assertions.assertThrows(ServiceException.class, () -> {
smsService.getSign(3);
});
} }
@Test @Test
public void updateTemplateTest() { public void createTemplateTest() {
smsService.updateTemplate(3, "打死也不要告诉别人哦444 #code# ", 1); String template = "您的验证码是#code#,打死也不告诉别人哦。";
smsService.createTemplate(3, template,
SmsPlatformEnum.YunPian.getValue(),
SmsTypeEnum.VERIFICATION_CODE.getValue());
} }
@Test @Test
public void deleteTemplateTest() { public void singleSendTest() {
smsService.deleteTemplate(3); String mobile = "13302926050";
Integer templateId = 5;
smsService.singleSend(mobile, templateId, ImmutableMap.of("code", "8888"));
} }
@Test @Test
public void singleSendTest() { public void batchSendTest() {
String mobile = "13302926050"; String mobile = "13302926050";
smsService.singleSend(mobile, 1); Integer templateId = 5;
smsService.batchSend(Lists.newArrayList(mobile), templateId, ImmutableMap.of("code", "8888"));
} }
} }
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论