Commit 52b51254fc1247531f319cdcf1d81dccb3d80d9e

Authored by YunaiV
1 parent 515fca5c

云片短信的调试

src/main/java/cn/iocoder/dashboard/framework/sms/core/client/impl/yunpian/YunpianSmsClient.java
... ... @@ -4,6 +4,7 @@ import cn.hutool.core.collection.CollUtil;
4 4 import cn.hutool.core.collection.CollectionUtil;
5 5 import cn.hutool.core.date.DateUtil;
6 6 import cn.hutool.core.util.CharsetUtil;
  7 +import cn.hutool.core.util.StrUtil;
7 8 import cn.hutool.core.util.URLUtil;
8 9 import cn.iocoder.dashboard.framework.sms.core.SmsConstants;
9 10 import cn.iocoder.dashboard.framework.sms.core.SmsResult;
... ... @@ -28,6 +29,8 @@ import java.util.List;
28 29 import java.util.Map;
29 30 import java.util.StringJoiner;
30 31  
  32 +import static com.yunpian.sdk.constant.Code.*;
  33 +
31 34 /**
32 35 * 云片短信客户端的实现类
33 36 *
... ... @@ -51,7 +54,15 @@ public class YunpianSmsClient extends AbstractSmsClient {
51 54  
52 55 @Override
53 56 public void doInit() {
54   - client = new YunpianClient(properties.getApiKey());
  57 + YunpianClient oldClient = client;
  58 + // 初始化新的客户端
  59 + YunpianClient newClient = new YunpianClient(properties.getApiKey());
  60 + newClient.init();
  61 + this.client = newClient;
  62 + // 销毁老的客户端
  63 + if (oldClient != null) {
  64 + oldClient.close();
  65 + }
55 66 }
56 67  
57 68 @Override
... ... @@ -71,9 +82,8 @@ public class YunpianSmsClient extends AbstractSmsClient {
71 82 throw sendResult.getThrowable();
72 83 }
73 84 // 解析结果
74   - SmsSingleSend data = sendResult.getData();
75 85 return SmsResult.success(parseSendFailureType(sendResult), // 将 API 短信平台,解析成统一的错误码
76   - String.valueOf(data.getCode()), data.getMsg(), null, String.valueOf(data.getSid()));
  86 + String.valueOf(sendResult.getCode()), formatResultMsg(sendResult), null, getApiSerialNo(sendResult));
77 87 }
78 88  
79 89 private static String formatTplValue(Map<String, Object> templateParams) {
... ... @@ -86,10 +96,31 @@ public class YunpianSmsClient extends AbstractSmsClient {
86 96 return joiner.toString();
87 97 }
88 98  
  99 + private static String formatResultMsg(Result<SmsSingleSend> sendResult) {
  100 + if (StrUtil.isEmpty(sendResult.getDetail())) {
  101 + return sendResult.getMsg();
  102 + }
  103 + return sendResult.getMsg() + " => " + sendResult.getDetail();
  104 + }
  105 +
89 106 private static SmsSendFailureTypeEnum parseSendFailureType(Result<SmsSingleSend> sendResult) {
  107 + Integer code = sendResult.getCode();
  108 + switch (code) {
  109 + case ARGUMENT_MISSING: return SmsSendFailureTypeEnum.SMS_API_PARAM_ERROR;
  110 + case BAD_ARGUMENT_FORMAT: return SmsSendFailureTypeEnum.SMS_TEMPLATE_PARAM_ERROR;
  111 + case TPL_NOT_FOUND: return SmsSendFailureTypeEnum.SMS_TEMPLATE_NOT_EXISTS;
  112 + case TPL_NOT_VALID: return SmsSendFailureTypeEnum.SMS_TMPLATE_INVALID;
  113 + }
90 114 return SmsSendFailureTypeEnum.SMS_UNKNOWN;
91 115 }
92 116  
  117 + private static String getApiSerialNo(Result<SmsSingleSend> sendResult) {
  118 + if (sendResult.getData() == null) {
  119 + return null;
  120 + }
  121 + return String.valueOf(sendResult.getData().getSid());
  122 + }
  123 +
93 124 /**
94 125 * 云片的比较复杂,又是加密又是套娃的
95 126 */
... ...
src/main/java/cn/iocoder/dashboard/framework/sms/core/enums/SmsSendFailureTypeEnum.java
... ... @@ -12,14 +12,19 @@ import lombok.Getter;
12 12 @AllArgsConstructor
13 13 public enum SmsSendFailureTypeEnum {
14 14  
15   - // ========== 模板相关(100 开头) ==========
  15 + // ========== 渠道相关(100 开头) ==========
16 16 SMS_CHANNEL_CLIENT_NOT_EXISTS(100, "短信渠道的客户端不存在"),
17 17  
18 18 // ========== 模板相关(200 开头) ==========
19   - SMS_TEMPLATE_DISABLE(200, "短信模板被禁用"),
  19 + SMS_TEMPLATE_NOT_EXISTS(200, "短信模板不存在"),
  20 + SMS_TEMPLATE_DISABLE(201, "短信模板被禁用"), // 例如说,我们在管理后台禁用了
  21 + SMS_TMPLATE_INVALID(202, "短信模板不可用"), // 例如说,短信模板正在审核中
  22 + SMS_TEMPLATE_PARAM_ERROR(203, "模板参数不正确"),
20 23  
21 24 // ========== 其它相关(900 开头) ==========
22   - SMS_SEND_EXCEPTION(900, "发送异常"),
  25 + SMS_API_PARAM_ERROR(900, "请求参数缺失"),
  26 +
  27 + SMS_SEND_EXCEPTION(998, "发送异常"),
23 28 SMS_UNKNOWN(999, "未知错误,需要解析")
24 29 ;
25 30  
... ...
src/test-integration/java/cn/iocoder/dashboard/framework/redis/core/stream/RedisStreamTest.java
... ... @@ -4,7 +4,7 @@ import cn.hutool.core.thread.ThreadUtil;
4 4 import cn.iocoder.dashboard.BaseRedisIntegrationTest;
5 5 import cn.iocoder.dashboard.framework.redis.core.util.RedisMessageUtils;
6 6 import cn.iocoder.dashboard.modules.system.mq.consumer.mail.SysMailSendConsumer;
7   -import cn.iocoder.dashboard.modules.system.mq.consumer.sms.SysSmsSendConsumer;
  7 +import cn.iocoder.dashboard.modules.system.mq.consumer.sms.SmsSendConsumer;
8 8 import cn.iocoder.dashboard.modules.system.mq.message.mail.SysMailSendMessage;
9 9 import cn.iocoder.dashboard.modules.system.mq.message.sms.SysSmsSendMessage;
10 10 import org.junit.jupiter.api.Disabled;
... ... @@ -18,7 +18,7 @@ import java.util.concurrent.TimeUnit;
18 18  
19 19 public class RedisStreamTest {
20 20  
21   - @Import({SysSmsSendConsumer.class, SysMailSendConsumer.class})
  21 + @Import({SmsSendConsumer.class, SysMailSendConsumer.class})
22 22 @Disabled
23 23 public static class ConsumerTest extends BaseRedisIntegrationTest {
24 24  
... ... @@ -43,7 +43,7 @@ public class RedisStreamTest {
43 43 for (int i = 0; i < 100; i++) {
44 44 // 创建消息
45 45 SysSmsSendMessage message = new SysSmsSendMessage();
46   - message.setMobile("15601691300").setTemplateCode("test:" + i);
  46 + message.setMobile("15601691300").setApiTemplateId("test:" + i);
47 47 // 发送消息
48 48 RedisMessageUtils.sendStreamMessage(stringRedisTemplate, message);
49 49 }
... ...
src/test-integration/java/cn/iocoder/dashboard/framework/sms/core/client/impl/yunpian/YunpianSmsClientIntegrationTest.java 0 → 100644
  1 +package cn.iocoder.dashboard.framework.sms.core.client.impl.yunpian;
  2 +
  3 +import cn.iocoder.dashboard.framework.sms.core.SmsResult;
  4 +import cn.iocoder.dashboard.framework.sms.core.enums.SmsChannelEnum;
  5 +import cn.iocoder.dashboard.framework.sms.core.property.SmsChannelProperties;
  6 +import org.junit.jupiter.api.Test;
  7 +
  8 +import java.util.HashMap;
  9 +import java.util.Map;
  10 +
  11 +/**
  12 + * {@link YunpianSmsClient} 的集成测试
  13 + */
  14 +public class YunpianSmsClientIntegrationTest {
  15 +
  16 + @Test
  17 + public void testSend() {
  18 + // 创建配置类
  19 + SmsChannelProperties properties = new SmsChannelProperties();
  20 + properties.setId(1L);
  21 + properties.setSignature("芋道");
  22 + properties.setCode(SmsChannelEnum.YUN_PIAN.getCode());
  23 + properties.setApiKey("1555a14277cb8a608cf45a9e6a80d510");
  24 + // 创建客户端
  25 + YunpianSmsClient smsClient = new YunpianSmsClient(properties);
  26 + smsClient.init();
  27 + // 发送短信
  28 + Map<String, Object> templateParams = new HashMap<>();
  29 + templateParams.put("code", "1024");
  30 + templateParams.put("operation", "嘿嘿");
  31 +// SmsResult result = smsClient.send(1L, "15601691399", "4372216", templateParams);
  32 + SmsResult result = smsClient.send(1L, "15601691399", "4383920", templateParams);
  33 + System.out.println(result);
  34 + }
  35 +
  36 +}
... ...
src/test-integration/java/cn/iocoder/dashboard/framework/sms/core/client/package-info.java 0 → 100644
  1 +package cn.iocoder.dashboard.framework.sms.core.client;
... ...