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,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 try { 128 try {
129 // 执行发送. 由于阿里云 sms 短信没有统一的 Response,但是有统一的 code、message、requestId 属性,所以只好反射 129 // 执行发送. 由于阿里云 sms 短信没有统一的 Response,但是有统一的 code、message、requestId 属性,所以只好反射
130 T sendResult = acsClient.getAcsResponse(request); 130 T sendResult = acsClient.getAcsResponse(request);
@@ -134,7 +134,7 @@ public class AliyunSmsClient extends AbstractSmsClient { @@ -134,7 +134,7 @@ public class AliyunSmsClient extends AbstractSmsClient {
134 // 解析结果 134 // 解析结果
135 R data = null; 135 R data = null;
136 if (Objects.equals(code, "OK")) { // 请求成功的情况下 136 if (Objects.equals(code, "OK")) { // 请求成功的情况下
137 - data = consumer.apply(sendResult); 137 + data = responseConsumer.apply(sendResult);
138 } 138 }
139 // 拼接结果 139 // 拼接结果
140 return SmsCommonResult.build(code, message, requestId, data, codeMapping); 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,6 +10,7 @@ import cn.iocoder.dashboard.framework.sms.core.client.dto.SmsReceiveRespDTO;
10 import cn.iocoder.dashboard.framework.sms.core.client.dto.SmsSendRespDTO; 10 import cn.iocoder.dashboard.framework.sms.core.client.dto.SmsSendRespDTO;
11 import cn.iocoder.dashboard.framework.sms.core.client.dto.SmsTemplateRespDTO; 11 import cn.iocoder.dashboard.framework.sms.core.client.dto.SmsTemplateRespDTO;
12 import cn.iocoder.dashboard.framework.sms.core.client.impl.AbstractSmsClient; 12 import cn.iocoder.dashboard.framework.sms.core.client.impl.AbstractSmsClient;
  13 +import cn.iocoder.dashboard.framework.sms.core.enums.SmsTemplateAuditStatusEnum;
13 import cn.iocoder.dashboard.framework.sms.core.property.SmsChannelProperties; 14 import cn.iocoder.dashboard.framework.sms.core.property.SmsChannelProperties;
14 import cn.iocoder.dashboard.util.json.JsonUtils; 15 import cn.iocoder.dashboard.util.json.JsonUtils;
15 import com.fasterxml.jackson.annotation.JsonFormat; 16 import com.fasterxml.jackson.annotation.JsonFormat;
@@ -17,11 +18,13 @@ import com.fasterxml.jackson.annotation.JsonProperty; @@ -17,11 +18,13 @@ import com.fasterxml.jackson.annotation.JsonProperty;
17 import com.yunpian.sdk.YunpianClient; 18 import com.yunpian.sdk.YunpianClient;
18 import com.yunpian.sdk.constant.YunpianConstant; 19 import com.yunpian.sdk.constant.YunpianConstant;
19 import com.yunpian.sdk.model.Result; 20 import com.yunpian.sdk.model.Result;
20 -import com.yunpian.sdk.model.SmsSingleSend; 21 +import com.yunpian.sdk.model.Template;
21 import lombok.Data; 22 import lombok.Data;
22 import lombok.extern.slf4j.Slf4j; 23 import lombok.extern.slf4j.Slf4j;
23 24
24 import java.util.*; 25 import java.util.*;
  26 +import java.util.function.Function;
  27 +import java.util.function.Supplier;
25 import java.util.stream.Collectors; 28 import java.util.stream.Collectors;
26 29
27 import static cn.iocoder.dashboard.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; 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,27 +65,15 @@ public class YunpianSmsClient extends AbstractSmsClient {
62 @Override 65 @Override
63 protected SmsCommonResult<SmsSendRespDTO> doSendSms(Long sendLogId, String mobile, 66 protected SmsCommonResult<SmsSendRespDTO> doSendSms(Long sendLogId, String mobile,
64 String apiTemplateId, List<KeyValue<String, Object>> templateParams) throws Throwable { 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 private static String formatTplValue(List<KeyValue<String, Object>> templateParams) { 79 private static String formatTplValue(List<KeyValue<String, Object>> templateParams) {
@@ -95,13 +86,6 @@ public class YunpianSmsClient extends AbstractSmsClient { @@ -95,13 +86,6 @@ public class YunpianSmsClient extends AbstractSmsClient {
95 return joiner.toString(); 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 @Override 89 @Override
106 protected List<SmsReceiveRespDTO> doParseSmsReceiveStatus(String text) throws Throwable { 90 protected List<SmsReceiveRespDTO> doParseSmsReceiveStatus(String text) throws Throwable {
107 List<SmsReceiveStatus> statuses = JsonUtils.parseArray(text, SmsReceiveStatus.class); 91 List<SmsReceiveStatus> statuses = JsonUtils.parseArray(text, SmsReceiveStatus.class);
@@ -117,7 +101,47 @@ public class YunpianSmsClient extends AbstractSmsClient { @@ -117,7 +101,47 @@ public class YunpianSmsClient extends AbstractSmsClient {
117 101
118 @Override 102 @Override
119 protected SmsCommonResult<SmsTemplateRespDTO> doGetSmsTemplate(String apiTemplateId) throws Throwable { 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,8 +3,10 @@ package cn.iocoder.dashboard.framework.sms.core.client.impl.yunpian;
3 import cn.iocoder.dashboard.common.core.KeyValue; 3 import cn.iocoder.dashboard.common.core.KeyValue;
4 import cn.iocoder.dashboard.framework.sms.core.client.SmsCommonResult; 4 import cn.iocoder.dashboard.framework.sms.core.client.SmsCommonResult;
5 import cn.iocoder.dashboard.framework.sms.core.client.dto.SmsSendRespDTO; 5 import cn.iocoder.dashboard.framework.sms.core.client.dto.SmsSendRespDTO;
  6 +import cn.iocoder.dashboard.framework.sms.core.client.dto.SmsTemplateRespDTO;
6 import cn.iocoder.dashboard.framework.sms.core.enums.SmsChannelEnum; 7 import cn.iocoder.dashboard.framework.sms.core.enums.SmsChannelEnum;
7 import cn.iocoder.dashboard.framework.sms.core.property.SmsChannelProperties; 8 import cn.iocoder.dashboard.framework.sms.core.property.SmsChannelProperties;
  9 +import org.junit.jupiter.api.BeforeAll;
8 import org.junit.jupiter.api.Test; 10 import org.junit.jupiter.api.Test;
9 11
10 import java.util.ArrayList; 12 import java.util.ArrayList;
@@ -15,8 +17,10 @@ import java.util.List; @@ -15,8 +17,10 @@ import java.util.List;
15 */ 17 */
16 public class YunpianSmsClientIntegrationTest { 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 SmsChannelProperties properties = new SmsChannelProperties(); 25 SmsChannelProperties properties = new SmsChannelProperties();
22 properties.setId(1L); 26 properties.setId(1L);
@@ -24,9 +28,12 @@ public class YunpianSmsClientIntegrationTest { @@ -24,9 +28,12 @@ public class YunpianSmsClientIntegrationTest {
24 properties.setCode(SmsChannelEnum.YUN_PIAN.getCode()); 28 properties.setCode(SmsChannelEnum.YUN_PIAN.getCode());
25 properties.setApiKey("1555a14277cb8a608cf45a9e6a80d510"); 29 properties.setApiKey("1555a14277cb8a608cf45a9e6a80d510");
26 // 创建客户端 30 // 创建客户端
27 - YunpianSmsClient smsClient = new YunpianSmsClient(properties); 31 + smsClient = new YunpianSmsClient(properties);
28 smsClient.init(); 32 smsClient.init();
29 - // 发送短信 33 + }
  34 +
  35 + @Test
  36 + public void testSendSms() {
30 List<KeyValue<String, Object>> templateParams = new ArrayList<>(); 37 List<KeyValue<String, Object>> templateParams = new ArrayList<>();
31 templateParams.add(new KeyValue<>("code", "1024")); 38 templateParams.add(new KeyValue<>("code", "1024"));
32 templateParams.add(new KeyValue<>("operation", "嘿嘿")); 39 templateParams.add(new KeyValue<>("operation", "嘿嘿"));
@@ -35,4 +42,11 @@ public class YunpianSmsClientIntegrationTest { @@ -35,4 +42,11 @@ public class YunpianSmsClientIntegrationTest {
35 System.out.println(result); 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 }