Commit f4aba034cfd748fcdee6d4aebeeb4995f0cea8c9

Authored by YunaiV
1 parent bdbc5b26

1. 云片 sms client 增加查询模板的封装

2. 重构云片 sms client 客户端,增加 invoke 基础方法
src/main/java/cn/iocoder/dashboard/framework/sms/core/client/impl/aliyun/AliyunSmsClient.java
... ... @@ -124,7 +124,7 @@ public class AliyunSmsClient extends AbstractSmsClient {
124 124 }
125 125 }
126 126  
127   - private <T extends AcsResponse, R> SmsCommonResult<R> invoke(AcsRequest<T> request, Function<T, R> consumer) {
  127 + private <T extends AcsResponse, R> SmsCommonResult<R> invoke(AcsRequest<T> request, Function<T, R> responseConsumer) {
128 128 try {
129 129 // 执行发送. 由于阿里云 sms 短信没有统一的 Response,但是有统一的 code、message、requestId 属性,所以只好反射
130 130 T sendResult = acsClient.getAcsResponse(request);
... ... @@ -134,7 +134,7 @@ public class AliyunSmsClient extends AbstractSmsClient {
134 134 // 解析结果
135 135 R data = null;
136 136 if (Objects.equals(code, "OK")) { // 请求成功的情况下
137   - data = consumer.apply(sendResult);
  137 + data = responseConsumer.apply(sendResult);
138 138 }
139 139 // 拼接结果
140 140 return SmsCommonResult.build(code, message, requestId, data, codeMapping);
... ...
src/main/java/cn/iocoder/dashboard/framework/sms/core/client/impl/yunpian/YunpianSmsClient.java
... ... @@ -10,6 +10,7 @@ import cn.iocoder.dashboard.framework.sms.core.client.dto.SmsReceiveRespDTO;
10 10 import cn.iocoder.dashboard.framework.sms.core.client.dto.SmsSendRespDTO;
11 11 import cn.iocoder.dashboard.framework.sms.core.client.dto.SmsTemplateRespDTO;
12 12 import cn.iocoder.dashboard.framework.sms.core.client.impl.AbstractSmsClient;
  13 +import cn.iocoder.dashboard.framework.sms.core.enums.SmsTemplateAuditStatusEnum;
13 14 import cn.iocoder.dashboard.framework.sms.core.property.SmsChannelProperties;
14 15 import cn.iocoder.dashboard.util.json.JsonUtils;
15 16 import com.fasterxml.jackson.annotation.JsonFormat;
... ... @@ -17,11 +18,13 @@ import com.fasterxml.jackson.annotation.JsonProperty;
17 18 import com.yunpian.sdk.YunpianClient;
18 19 import com.yunpian.sdk.constant.YunpianConstant;
19 20 import com.yunpian.sdk.model.Result;
20   -import com.yunpian.sdk.model.SmsSingleSend;
  21 +import com.yunpian.sdk.model.Template;
21 22 import lombok.Data;
22 23 import lombok.extern.slf4j.Slf4j;
23 24  
24 25 import java.util.*;
  26 +import java.util.function.Function;
  27 +import java.util.function.Supplier;
25 28 import java.util.stream.Collectors;
26 29  
27 30 import static cn.iocoder.dashboard.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
... ... @@ -62,27 +65,15 @@ public class YunpianSmsClient extends AbstractSmsClient {
62 65 @Override
63 66 protected SmsCommonResult<SmsSendRespDTO> doSendSms(Long sendLogId, String mobile,
64 67 String apiTemplateId, List<KeyValue<String, Object>> templateParams) throws Throwable {
65   - // 构建参数
66   - Map<String, String> request = new HashMap<>();
67   - request.put(YunpianConstant.APIKEY, properties.getApiKey());
68   - request.put(YunpianConstant.MOBILE, mobile);
69   - request.put(YunpianConstant.TPL_ID, apiTemplateId);
70   - request.put(YunpianConstant.TPL_VALUE, formatTplValue(templateParams));
71   - request.put(YunpianConstant.UID, String.valueOf(sendLogId));
72   - request.put(YunpianConstant.CALLBACK_URL, properties.getCallbackUrl());
73   -
74   - // 执行发送
75   - Result<SmsSingleSend> sendResult = client.sms().tpl_single_send(request);
76   - if (sendResult.getThrowable() != null) {
77   - throw sendResult.getThrowable();
78   - }
79   - // 解析结果
80   - SmsSendRespDTO data = null;
81   - if (sendResult.getData() != null) {
82   - data = new SmsSendRespDTO().setSerialNo(String.valueOf(sendResult.getData().getSid()));
83   - }
84   - return SmsCommonResult.build(String.valueOf(sendResult.getCode()), formatResultMsg(sendResult), null,
85   - data, codeMapping);
  68 + return invoke(() -> {
  69 + Map<String, String> request = new HashMap<>();
  70 + request.put(YunpianConstant.MOBILE, mobile);
  71 + request.put(YunpianConstant.TPL_ID, apiTemplateId);
  72 + request.put(YunpianConstant.TPL_VALUE, formatTplValue(templateParams));
  73 + request.put(YunpianConstant.UID, String.valueOf(sendLogId));
  74 + request.put(YunpianConstant.CALLBACK_URL, properties.getCallbackUrl());
  75 + return client.sms().tpl_single_send(request);
  76 + }, response -> new SmsSendRespDTO().setSerialNo(String.valueOf(response.getSid())));
86 77 }
87 78  
88 79 private static String formatTplValue(List<KeyValue<String, Object>> templateParams) {
... ... @@ -95,13 +86,6 @@ public class YunpianSmsClient extends AbstractSmsClient {
95 86 return joiner.toString();
96 87 }
97 88  
98   - private static String formatResultMsg(Result<SmsSingleSend> sendResult) {
99   - if (StrUtil.isEmpty(sendResult.getDetail())) {
100   - return sendResult.getMsg();
101   - }
102   - return sendResult.getMsg() + " => " + sendResult.getDetail();
103   - }
104   -
105 89 @Override
106 90 protected List<SmsReceiveRespDTO> doParseSmsReceiveStatus(String text) throws Throwable {
107 91 List<SmsReceiveStatus> statuses = JsonUtils.parseArray(text, SmsReceiveStatus.class);
... ... @@ -117,7 +101,47 @@ public class YunpianSmsClient extends AbstractSmsClient {
117 101  
118 102 @Override
119 103 protected SmsCommonResult<SmsTemplateRespDTO> doGetSmsTemplate(String apiTemplateId) throws Throwable {
120   - return null;
  104 + return invoke(() -> {
  105 + Map<String, String> request = new HashMap<>();
  106 + request.put(YunpianConstant.APIKEY, properties.getApiKey());
  107 + request.put(YunpianConstant.TPL_ID, apiTemplateId);
  108 + return client.tpl().get(request);
  109 + }, response -> {
  110 + Template template = response.get(0);
  111 + return new SmsTemplateRespDTO().setId(String.valueOf(template.getTpl_id())).setContent(template.getTpl_content())
  112 + .setAuditStatus(convertSmsTemplateAuditStatus(template.getCheck_status())).setAuditReason(template.getReason());
  113 + });
  114 + }
  115 +
  116 + private Integer convertSmsTemplateAuditStatus(String checkStatus) {
  117 + switch (checkStatus) {
  118 + case "CHECKING": return SmsTemplateAuditStatusEnum.CHECKING.getStatus();
  119 + case "SUCCESS": return SmsTemplateAuditStatusEnum.SUCCESS.getStatus();
  120 + case "FAIL": return SmsTemplateAuditStatusEnum.FAIL.getStatus();
  121 + default: throw new IllegalArgumentException(String.format("未知审核状态(%s)", checkStatus));
  122 + }
  123 + }
  124 +
  125 + private <T, R> SmsCommonResult<R> invoke(Supplier<Result<T>> requestConsumer, Function<T, R> responseConsumer) throws Throwable {
  126 + // 执行请求
  127 + Result<T> result = requestConsumer.get();
  128 + if (result.getThrowable() != null) {
  129 + throw result.getThrowable();
  130 + }
  131 + // 解析结果
  132 + R data = null;
  133 + if (result.getData() != null) {
  134 + data = responseConsumer.apply(result.getData());
  135 + }
  136 + // 拼接结果
  137 + return SmsCommonResult.build(String.valueOf(result.getCode()), formatResultMsg(result), null, data, codeMapping);
  138 + }
  139 +
  140 + private static String formatResultMsg(Result<?> sendResult) {
  141 + if (StrUtil.isEmpty(sendResult.getDetail())) {
  142 + return sendResult.getMsg();
  143 + }
  144 + return sendResult.getMsg() + " => " + sendResult.getDetail();
121 145 }
122 146  
123 147 /**
... ...
src/test-integration/java/cn/iocoder/dashboard/framework/sms/core/client/impl/yunpian/YunpianSmsClientIntegrationTest.java
... ... @@ -3,8 +3,10 @@ package cn.iocoder.dashboard.framework.sms.core.client.impl.yunpian;
3 3 import cn.iocoder.dashboard.common.core.KeyValue;
4 4 import cn.iocoder.dashboard.framework.sms.core.client.SmsCommonResult;
5 5 import cn.iocoder.dashboard.framework.sms.core.client.dto.SmsSendRespDTO;
  6 +import cn.iocoder.dashboard.framework.sms.core.client.dto.SmsTemplateRespDTO;
6 7 import cn.iocoder.dashboard.framework.sms.core.enums.SmsChannelEnum;
7 8 import cn.iocoder.dashboard.framework.sms.core.property.SmsChannelProperties;
  9 +import org.junit.jupiter.api.BeforeAll;
8 10 import org.junit.jupiter.api.Test;
9 11  
10 12 import java.util.ArrayList;
... ... @@ -15,8 +17,10 @@ import java.util.List;
15 17 */
16 18 public class YunpianSmsClientIntegrationTest {
17 19  
18   - @Test
19   - public void testSend() {
  20 + private static YunpianSmsClient smsClient;
  21 +
  22 + @BeforeAll
  23 + public static void init() {
20 24 // 创建配置类
21 25 SmsChannelProperties properties = new SmsChannelProperties();
22 26 properties.setId(1L);
... ... @@ -24,9 +28,12 @@ public class YunpianSmsClientIntegrationTest {
24 28 properties.setCode(SmsChannelEnum.YUN_PIAN.getCode());
25 29 properties.setApiKey("1555a14277cb8a608cf45a9e6a80d510");
26 30 // 创建客户端
27   - YunpianSmsClient smsClient = new YunpianSmsClient(properties);
  31 + smsClient = new YunpianSmsClient(properties);
28 32 smsClient.init();
29   - // 发送短信
  33 + }
  34 +
  35 + @Test
  36 + public void testSendSms() {
30 37 List<KeyValue<String, Object>> templateParams = new ArrayList<>();
31 38 templateParams.add(new KeyValue<>("code", "1024"));
32 39 templateParams.add(new KeyValue<>("operation", "嘿嘿"));
... ... @@ -35,4 +42,11 @@ public class YunpianSmsClientIntegrationTest {
35 42 System.out.println(result);
36 43 }
37 44  
  45 + @Test
  46 + public void testGetSmsTemplate() {
  47 + String apiTemplateId = "4383920";
  48 + SmsCommonResult<SmsTemplateRespDTO> result = smsClient.getSmsTemplate(apiTemplateId);
  49 + System.out.println(result);
  50 + }
  51 +
38 52 }
... ...