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,6 +4,7 @@ import cn.hutool.core.collection.CollUtil;
4 import cn.hutool.core.collection.CollectionUtil; 4 import cn.hutool.core.collection.CollectionUtil;
5 import cn.hutool.core.date.DateUtil; 5 import cn.hutool.core.date.DateUtil;
6 import cn.hutool.core.util.CharsetUtil; 6 import cn.hutool.core.util.CharsetUtil;
  7 +import cn.hutool.core.util.StrUtil;
7 import cn.hutool.core.util.URLUtil; 8 import cn.hutool.core.util.URLUtil;
8 import cn.iocoder.dashboard.framework.sms.core.SmsConstants; 9 import cn.iocoder.dashboard.framework.sms.core.SmsConstants;
9 import cn.iocoder.dashboard.framework.sms.core.SmsResult; 10 import cn.iocoder.dashboard.framework.sms.core.SmsResult;
@@ -28,6 +29,8 @@ import java.util.List; @@ -28,6 +29,8 @@ import java.util.List;
28 import java.util.Map; 29 import java.util.Map;
29 import java.util.StringJoiner; 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,7 +54,15 @@ public class YunpianSmsClient extends AbstractSmsClient {
51 54
52 @Override 55 @Override
53 public void doInit() { 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 @Override 68 @Override
@@ -71,9 +82,8 @@ public class YunpianSmsClient extends AbstractSmsClient { @@ -71,9 +82,8 @@ public class YunpianSmsClient extends AbstractSmsClient {
71 throw sendResult.getThrowable(); 82 throw sendResult.getThrowable();
72 } 83 }
73 // 解析结果 84 // 解析结果
74 - SmsSingleSend data = sendResult.getData();  
75 return SmsResult.success(parseSendFailureType(sendResult), // 将 API 短信平台,解析成统一的错误码 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 private static String formatTplValue(Map<String, Object> templateParams) { 89 private static String formatTplValue(Map<String, Object> templateParams) {
@@ -86,10 +96,31 @@ public class YunpianSmsClient extends AbstractSmsClient { @@ -86,10 +96,31 @@ public class YunpianSmsClient extends AbstractSmsClient {
86 return joiner.toString(); 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 private static SmsSendFailureTypeEnum parseSendFailureType(Result<SmsSingleSend> sendResult) { 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 return SmsSendFailureTypeEnum.SMS_UNKNOWN; 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,14 +12,19 @@ import lombok.Getter;
12 @AllArgsConstructor 12 @AllArgsConstructor
13 public enum SmsSendFailureTypeEnum { 13 public enum SmsSendFailureTypeEnum {
14 14
15 - // ========== 模板相关(100 开头) ========== 15 + // ========== 渠道相关(100 开头) ==========
16 SMS_CHANNEL_CLIENT_NOT_EXISTS(100, "短信渠道的客户端不存在"), 16 SMS_CHANNEL_CLIENT_NOT_EXISTS(100, "短信渠道的客户端不存在"),
17 17
18 // ========== 模板相关(200 开头) ========== 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 // ========== 其它相关(900 开头) ========== 24 // ========== 其它相关(900 开头) ==========
22 - SMS_SEND_EXCEPTION(900, "发送异常"), 25 + SMS_API_PARAM_ERROR(900, "请求参数缺失"),
  26 +
  27 + SMS_SEND_EXCEPTION(998, "发送异常"),
23 SMS_UNKNOWN(999, "未知错误,需要解析") 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,7 +4,7 @@ import cn.hutool.core.thread.ThreadUtil;
4 import cn.iocoder.dashboard.BaseRedisIntegrationTest; 4 import cn.iocoder.dashboard.BaseRedisIntegrationTest;
5 import cn.iocoder.dashboard.framework.redis.core.util.RedisMessageUtils; 5 import cn.iocoder.dashboard.framework.redis.core.util.RedisMessageUtils;
6 import cn.iocoder.dashboard.modules.system.mq.consumer.mail.SysMailSendConsumer; 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 import cn.iocoder.dashboard.modules.system.mq.message.mail.SysMailSendMessage; 8 import cn.iocoder.dashboard.modules.system.mq.message.mail.SysMailSendMessage;
9 import cn.iocoder.dashboard.modules.system.mq.message.sms.SysSmsSendMessage; 9 import cn.iocoder.dashboard.modules.system.mq.message.sms.SysSmsSendMessage;
10 import org.junit.jupiter.api.Disabled; 10 import org.junit.jupiter.api.Disabled;
@@ -18,7 +18,7 @@ import java.util.concurrent.TimeUnit; @@ -18,7 +18,7 @@ import java.util.concurrent.TimeUnit;
18 18
19 public class RedisStreamTest { 19 public class RedisStreamTest {
20 20
21 - @Import({SysSmsSendConsumer.class, SysMailSendConsumer.class}) 21 + @Import({SmsSendConsumer.class, SysMailSendConsumer.class})
22 @Disabled 22 @Disabled
23 public static class ConsumerTest extends BaseRedisIntegrationTest { 23 public static class ConsumerTest extends BaseRedisIntegrationTest {
24 24
@@ -43,7 +43,7 @@ public class RedisStreamTest { @@ -43,7 +43,7 @@ public class RedisStreamTest {
43 for (int i = 0; i < 100; i++) { 43 for (int i = 0; i < 100; i++) {
44 // 创建消息 44 // 创建消息
45 SysSmsSendMessage message = new SysSmsSendMessage(); 45 SysSmsSendMessage message = new SysSmsSendMessage();
46 - message.setMobile("15601691300").setTemplateCode("test:" + i); 46 + message.setMobile("15601691300").setApiTemplateId("test:" + i);
47 // 发送消息 47 // 发送消息
48 RedisMessageUtils.sendStreamMessage(stringRedisTemplate, message); 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;