Commit f4aba034cfd748fcdee6d4aebeeb4995f0cea8c9
1 parent
bdbc5b26
1. 云片 sms client 增加查询模板的封装
2. 重构云片 sms client 客户端,增加 invoke 基础方法
Showing
3 changed files
with
74 additions
and
36 deletions
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 | } |