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 | 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 | } | ... | ... |