Przeglądaj źródła

将阿里云、云片的短信错误码,进行翻译

YunaiV 4 lat temu
rodzic
commit
47ac6fd6f5

+ 18 - 4
src/main/java/cn/iocoder/dashboard/framework/sms/core/client/impl/aliyun/AliyunSmsCodeMapping.java

@@ -9,6 +9,8 @@ import static cn.iocoder.dashboard.framework.sms.core.enums.SmsFrameworkErrorCod
 /**
  * 阿里云的 SmsCodeMapping 实现类
  *
+ * 参见 https://help.aliyun.com/document_detail/101346.htm 文档
+ *
  * @author 芋道源码
  */
 public class AliyunSmsCodeMapping implements SmsCodeMapping {
@@ -17,11 +19,23 @@ public class AliyunSmsCodeMapping implements SmsCodeMapping {
     public ErrorCode apply(String apiCode) {
         switch (apiCode) {
             case "OK": return GlobalErrorCodeConstants.SUCCESS;
-            case "MissingAccessKeyId": return SMS_CHANNEL_API_KEY_MISSING;
-            case "isp.RAM_PERMISSION_DENY": return SMS_CHANNEL_PERMISSION_DENY;
+            case "isv.ACCOUNT_NOT_EXISTS":
+            case "isv.ACCOUNT_ABNORMAL":
+            case "MissingAccessKeyId": return SMS_ACCOUNT_INVALID;
+            case "isp.RAM_PERMISSION_DENY": return SMS_PERMISSION_DENY;
+            case "isv.INVALID_JSON_PARAM":
             case "isv.INVALID_PARAMETERS": return SMS_API_PARAM_ERROR;
-            case "isv.BUSINESS_LIMIT_CONTROL": return SMS_SEND_LIMIT_CONTROL;
-            case "isv.SMS_TEMPLATE_ILLEGAL": return SMS_TEMPLATE_NOT_EXISTS;
+            case "isv.BUSINESS_LIMIT_CONTROL": return SMS_SEND_BUSINESS_LIMIT_CONTROL;
+            case "isv.DAY_LIMIT_CONTROL": return SMS_SEND_DAY_LIMIT_CONTROL;
+            case "isv.SMS_CONTENT_ILLEGAL": return SMS_SEND_CONTENT_INVALID;
+            case "isv.SMS_TEMPLATE_ILLEGAL": return SMS_TEMPLATE_INVALID;
+            case "isv.SMS_SIGNATURE_ILLEGAL":
+            case "isv.SIGN_NAME_ILLEGAL":
+            case "isv.SMS_SIGN_ILLEGAL": return SMS_SIGN_INVALID;
+            case "isv.AMOUNT_NOT_ENOUGH":
+            case "isv.OUT_OF_SERVICE": return SMS_ACCOUNT_MONEY_NOT_ENOUGH;
+            case "isv.MOBILE_NUMBER_ILLEGAL": return SMS_MOBILE_INVALID;
+            case "isv.TEMPLATE_MISSING_PARAMETERS": return SMS_TEMPLATE_PARAM_ERROR;
         }
         return SMS_UNKNOWN;
     }

+ 16 - 1
src/main/java/cn/iocoder/dashboard/framework/sms/core/client/impl/yunpian/YunpianSmsCodeMapping.java

@@ -10,6 +10,8 @@ import static com.yunpian.sdk.constant.Code.*;
 /**
  * 云片的 SmsCodeMapping 实现类
  *
+ * 参见 https://www.yunpian.com/official/document/sms/zh_CN/returnvalue_common 文档
+ *
  * @author 芋道源码
  */
 public class YunpianSmsCodeMapping implements SmsCodeMapping {
@@ -21,8 +23,21 @@ public class YunpianSmsCodeMapping implements SmsCodeMapping {
             case OK: return SUCCESS;
             case ARGUMENT_MISSING: return SMS_API_PARAM_ERROR;
             case BAD_ARGUMENT_FORMAT: return SMS_TEMPLATE_PARAM_ERROR;
-            case TPL_NOT_FOUND: return SMS_TEMPLATE_NOT_EXISTS;
+            case TPL_NOT_FOUND:
             case TPL_NOT_VALID: return SMS_TEMPLATE_INVALID;
+            case MONEY_NOT_ENOUGH: return SMS_ACCOUNT_MONEY_NOT_ENOUGH;
+            case BLACK_WORD: return SMS_SEND_CONTENT_INVALID;
+            case DUP_IN_SHORT_TIME:
+            case TOO_MANY_TIME_IN_5:
+            case DAY_LIMIT_PER_MOBILE:
+            case HOUR_LIMIT_PER_MOBILE: return SMS_SEND_BUSINESS_LIMIT_CONTROL;
+            case BLACK_PHONE_FILTER: return SMS_MOBILE_BLACK;
+            case SIGN_NOT_MATCH:
+            case BAD_SIGN_FORMAT:
+            case SIGN_NOT_VALID: return SMS_SIGN_INVALID;
+            case BAD_API_KEY: return SMS_ACCOUNT_INVALID;
+            case API_NOT_ALLOWED: return SMS_PERMISSION_DENY;
+            case IP_NOT_ALLOWED: return SMS_IP_DENY;
         }
         return SMS_UNKNOWN;
     }

+ 28 - 12
src/main/java/cn/iocoder/dashboard/framework/sms/core/enums/SmsFrameworkErrorCodeConstants.java

@@ -11,21 +11,37 @@ import cn.iocoder.dashboard.common.exception.ErrorCode;
  */
 public interface SmsFrameworkErrorCodeConstants {
 
-    // ========== 渠道相关 2001000100 ==========
-    ErrorCode SMS_CHANNEL_API_KEY_MISSING = new ErrorCode(2001000101, "API Key 不存在");
-    ErrorCode SMS_CHANNEL_PERMISSION_DENY = new ErrorCode(2001000102, "没有发送短信的权限");
+    ErrorCode SMS_UNKNOWN = new ErrorCode(2001000000, "未知错误,需要解析");
 
-    // ========== 模板相关(2001000200 开头) ==========
-    ErrorCode SMS_TEMPLATE_NOT_EXISTS = new ErrorCode(2001000200, "短信模板不存在");
-    ErrorCode SMS_TEMPLATE_DISABLE = new ErrorCode(2001000201, "短信模板被禁用"); // 例如说,我们在管理后台禁用了
-    ErrorCode SMS_TEMPLATE_INVALID = new ErrorCode(2001000202, "短信模板不可用"); // 例如说,短信模板正在审核中
-    ErrorCode SMS_TEMPLATE_PARAM_ERROR = new ErrorCode(2001000203, "模板参数不正确");
+    // ========== 权限 / 限流等相关 2001000100 ==========
 
-    // ========== 其它相关(2001000900 开头) ==========
+    ErrorCode SMS_PERMISSION_DENY = new ErrorCode(2001000100, "没有发送短信的权限");
+    // 云片:可以配置 IP 白名单,只有在白名单中才可以发送短信
+    ErrorCode SMS_IP_DENY = new ErrorCode(2001000100, "IP 不允许发送短信");
+
+    // 阿里云:将短信发送频率限制在正常的业务限流范围内。默认短信验证码:使用同一签名,对同一个手机号验证码,支持 1 条 / 分钟,5 条 / 小时,累计 10 条 / 天。
+    ErrorCode SMS_SEND_BUSINESS_LIMIT_CONTROL = new ErrorCode(2001000102, "指定手机的发送限流");
+    // 阿里云:已经达到您在控制台设置的短信日发送量限额值。在国内消息设置 > 安全设置,修改发送总量阈值。
+    ErrorCode SMS_SEND_DAY_LIMIT_CONTROL = new ErrorCode(2001000103, "每天的发送限流");
+
+    ErrorCode SMS_SEND_CONTENT_INVALID = new ErrorCode(2001000104, "短信内容有敏感词");
+
+    // ========== 模板相关 2001000200 ==========
+    ErrorCode SMS_TEMPLATE_INVALID = new ErrorCode(2001000200, "短信模板不合法"); // 包括短信模板不存在
+    ErrorCode SMS_TEMPLATE_PARAM_ERROR = new ErrorCode(2001000201, "模板参数不正确");
+
+    // ========== 签名相关 2001000300 ==========
+    ErrorCode SMS_SIGN_INVALID = new ErrorCode(2001000300, "短信签名不可用");
+
+    // ========== 账户相关 2001000400 ==========
+    ErrorCode SMS_ACCOUNT_MONEY_NOT_ENOUGH = new ErrorCode(2001000400, "账户余额不足");
+    ErrorCode SMS_ACCOUNT_INVALID = new ErrorCode(2001000401, "apiKey 不存在");
+
+    // ========== 其它相关 2001000900 开头 ==========
     ErrorCode SMS_API_PARAM_ERROR = new ErrorCode(2001000900, "请求参数缺失");
+    ErrorCode SMS_MOBILE_INVALID = new ErrorCode(2001000901, "手机格式不正确");
+    ErrorCode SMS_MOBILE_BLACK = new ErrorCode(2001000902, "手机号在黑名单中");
 
-    ErrorCode SMS_SEND_LIMIT_CONTROL = new ErrorCode(2001000997, "业务限流"); // 将短信发送频率限制在正常的业务限流范围内。默认短信验证码:使用同一签名,对同一个手机号验证码,支持 1 条 / 分钟,5 条 / 小时,累计 10 条 / 天。
-    ErrorCode EXCEPTION = new ErrorCode(2001000998, "调用异常");
-    ErrorCode SMS_UNKNOWN = new ErrorCode(2001000999, "未知错误,需要解析");
+    ErrorCode EXCEPTION = new ErrorCode(2001000999, "调用异常");
 
 }

+ 43 - 0
src/test/java/cn/iocoder/dashboard/framework/sms/core/client/impl/aliyun/AliyunSmsCodeMappingTest.java

@@ -0,0 +1,43 @@
+package cn.iocoder.dashboard.framework.sms.core.client.impl.aliyun;
+
+import cn.iocoder.dashboard.BaseMockitoUnitTest;
+import cn.iocoder.dashboard.common.exception.enums.GlobalErrorCodeConstants;
+import cn.iocoder.dashboard.framework.sms.core.enums.SmsFrameworkErrorCodeConstants;
+import org.junit.jupiter.api.Test;
+import org.mockito.InjectMocks;
+
+import static org.junit.jupiter.api.Assertions.*;
+
+/**
+ * {@link AliyunSmsCodeMapping} 的单元测试
+ *
+ * @author 芋道源码
+ */
+public class AliyunSmsCodeMappingTest extends BaseMockitoUnitTest {
+
+    @InjectMocks
+    private AliyunSmsCodeMapping codeMapping;
+
+    @Test
+    public void testApply() {
+        assertEquals(GlobalErrorCodeConstants.SUCCESS, codeMapping.apply("OK"));
+        assertEquals(SmsFrameworkErrorCodeConstants.SMS_ACCOUNT_INVALID, codeMapping.apply("MissingAccessKeyId"));
+        assertEquals(SmsFrameworkErrorCodeConstants.SMS_ACCOUNT_INVALID, codeMapping.apply("isv.ACCOUNT_NOT_EXISTS"));
+        assertEquals(SmsFrameworkErrorCodeConstants.SMS_ACCOUNT_INVALID, codeMapping.apply("isv.ACCOUNT_ABNORMAL"));
+        assertEquals(SmsFrameworkErrorCodeConstants.SMS_SEND_DAY_LIMIT_CONTROL, codeMapping.apply("isv.DAY_LIMIT_CONTROL"));
+        assertEquals(SmsFrameworkErrorCodeConstants.SMS_SEND_CONTENT_INVALID, codeMapping.apply("isv.SMS_CONTENT_ILLEGAL"));
+        assertEquals(SmsFrameworkErrorCodeConstants.SMS_SIGN_INVALID, codeMapping.apply("isv.SMS_SIGN_ILLEGAL"));
+        assertEquals(SmsFrameworkErrorCodeConstants.SMS_SIGN_INVALID, codeMapping.apply("isv.SIGN_NAME_ILLEGAL"));
+        assertEquals(SmsFrameworkErrorCodeConstants.SMS_PERMISSION_DENY, codeMapping.apply("isp.RAM_PERMISSION_DENY"));
+        assertEquals(SmsFrameworkErrorCodeConstants.SMS_ACCOUNT_MONEY_NOT_ENOUGH, codeMapping.apply("isv.OUT_OF_SERVICE"));
+        assertEquals(SmsFrameworkErrorCodeConstants.SMS_ACCOUNT_MONEY_NOT_ENOUGH, codeMapping.apply("isv.AMOUNT_NOT_ENOUGH"));
+        assertEquals(SmsFrameworkErrorCodeConstants.SMS_TEMPLATE_INVALID, codeMapping.apply("isv.SMS_TEMPLATE_ILLEGAL"));
+        assertEquals(SmsFrameworkErrorCodeConstants.SMS_SIGN_INVALID, codeMapping.apply("isv.SMS_SIGNATURE_ILLEGAL"));
+        assertEquals(SmsFrameworkErrorCodeConstants.SMS_API_PARAM_ERROR, codeMapping.apply("isv.INVALID_PARAMETERS"));
+        assertEquals(SmsFrameworkErrorCodeConstants.SMS_API_PARAM_ERROR, codeMapping.apply("isv.INVALID_JSON_PARAM"));
+        assertEquals(SmsFrameworkErrorCodeConstants.SMS_MOBILE_INVALID, codeMapping.apply("isv.MOBILE_NUMBER_ILLEGAL"));
+        assertEquals(SmsFrameworkErrorCodeConstants.SMS_TEMPLATE_PARAM_ERROR, codeMapping.apply("isv.TEMPLATE_MISSING_PARAMETERS"));
+        assertEquals(SmsFrameworkErrorCodeConstants.SMS_SEND_BUSINESS_LIMIT_CONTROL, codeMapping.apply("isv.BUSINESS_LIMIT_CONTROL"));
+    }
+
+}

+ 43 - 0
src/test/java/cn/iocoder/dashboard/framework/sms/core/client/impl/yunpian/YunpianSmsCodeMappingTest.java

@@ -0,0 +1,43 @@
+package cn.iocoder.dashboard.framework.sms.core.client.impl.yunpian;
+
+import cn.iocoder.dashboard.BaseMockitoUnitTest;
+import cn.iocoder.dashboard.common.exception.enums.GlobalErrorCodeConstants;
+import cn.iocoder.dashboard.framework.sms.core.enums.SmsFrameworkErrorCodeConstants;
+import org.junit.jupiter.api.Test;
+import org.mockito.InjectMocks;
+
+import static com.yunpian.sdk.constant.Code.*;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+
+/**
+ * {@link YunpianSmsCodeMapping} 的单元测试
+ *
+ * @author 芋道源码
+ */
+class YunpianSmsCodeMappingTest extends BaseMockitoUnitTest {
+
+    @InjectMocks
+    private YunpianSmsCodeMapping codeMapping;
+
+    @Test
+    public void testApply() {
+        assertEquals(GlobalErrorCodeConstants.SUCCESS, codeMapping.apply(String.valueOf(OK)));
+        assertEquals(SmsFrameworkErrorCodeConstants.SMS_API_PARAM_ERROR, codeMapping.apply(String.valueOf(ARGUMENT_MISSING)));
+        assertEquals(SmsFrameworkErrorCodeConstants.SMS_TEMPLATE_PARAM_ERROR, codeMapping.apply(String.valueOf(BAD_ARGUMENT_FORMAT)));
+        assertEquals(SmsFrameworkErrorCodeConstants.SMS_ACCOUNT_MONEY_NOT_ENOUGH, codeMapping.apply(String.valueOf(MONEY_NOT_ENOUGH)));
+        assertEquals(SmsFrameworkErrorCodeConstants.SMS_TEMPLATE_INVALID, codeMapping.apply(String.valueOf(TPL_NOT_FOUND)));
+        assertEquals(SmsFrameworkErrorCodeConstants.SMS_TEMPLATE_INVALID, codeMapping.apply(String.valueOf(TPL_NOT_VALID)));
+        assertEquals(SmsFrameworkErrorCodeConstants.SMS_SEND_BUSINESS_LIMIT_CONTROL, codeMapping.apply(String.valueOf(DUP_IN_SHORT_TIME)));
+        assertEquals(SmsFrameworkErrorCodeConstants.SMS_SEND_BUSINESS_LIMIT_CONTROL, codeMapping.apply(String.valueOf(TOO_MANY_TIME_IN_5)));
+        assertEquals(SmsFrameworkErrorCodeConstants.SMS_SEND_BUSINESS_LIMIT_CONTROL, codeMapping.apply(String.valueOf(DAY_LIMIT_PER_MOBILE)));
+        assertEquals(SmsFrameworkErrorCodeConstants.SMS_SEND_BUSINESS_LIMIT_CONTROL, codeMapping.apply(String.valueOf(HOUR_LIMIT_PER_MOBILE)));
+        assertEquals(SmsFrameworkErrorCodeConstants.SMS_MOBILE_BLACK, codeMapping.apply(String.valueOf(BLACK_PHONE_FILTER)));
+        assertEquals(SmsFrameworkErrorCodeConstants.SMS_SIGN_INVALID, codeMapping.apply(String.valueOf(SIGN_NOT_MATCH)));
+        assertEquals(SmsFrameworkErrorCodeConstants.SMS_SIGN_INVALID, codeMapping.apply(String.valueOf(SIGN_NOT_VALID)));
+        assertEquals(SmsFrameworkErrorCodeConstants.SMS_SIGN_INVALID, codeMapping.apply(String.valueOf(BAD_SIGN_FORMAT)));
+        assertEquals(SmsFrameworkErrorCodeConstants.SMS_ACCOUNT_INVALID, codeMapping.apply(String.valueOf(BAD_API_KEY)));
+        assertEquals(SmsFrameworkErrorCodeConstants.SMS_PERMISSION_DENY, codeMapping.apply(String.valueOf(API_NOT_ALLOWED)));
+        assertEquals(SmsFrameworkErrorCodeConstants.SMS_IP_DENY, codeMapping.apply(String.valueOf(IP_NOT_ALLOWED)));
+    }
+
+}