Commit 47ac6fd6f501e23f24f528111857436715668dba
1 parent
a432b303
将阿里云、云片的短信错误码,进行翻译
Showing
5 changed files
with
148 additions
and
17 deletions
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 |
| 9 | 9 | /** |
| 10 | 10 | * 阿里云的 SmsCodeMapping 实现类 |
| 11 | 11 | * |
| 12 | + * 参见 https://help.aliyun.com/document_detail/101346.htm 文档 | |
| 13 | + * | |
| 12 | 14 | * @author 芋道源码 |
| 13 | 15 | */ |
| 14 | 16 | public class AliyunSmsCodeMapping implements SmsCodeMapping { |
| ... | ... | @@ -17,11 +19,23 @@ public class AliyunSmsCodeMapping implements SmsCodeMapping { |
| 17 | 19 | public ErrorCode apply(String apiCode) { |
| 18 | 20 | switch (apiCode) { |
| 19 | 21 | case "OK": return GlobalErrorCodeConstants.SUCCESS; |
| 20 | - case "MissingAccessKeyId": return SMS_CHANNEL_API_KEY_MISSING; | |
| 21 | - case "isp.RAM_PERMISSION_DENY": return SMS_CHANNEL_PERMISSION_DENY; | |
| 22 | + case "isv.ACCOUNT_NOT_EXISTS": | |
| 23 | + case "isv.ACCOUNT_ABNORMAL": | |
| 24 | + case "MissingAccessKeyId": return SMS_ACCOUNT_INVALID; | |
| 25 | + case "isp.RAM_PERMISSION_DENY": return SMS_PERMISSION_DENY; | |
| 26 | + case "isv.INVALID_JSON_PARAM": | |
| 22 | 27 | case "isv.INVALID_PARAMETERS": return SMS_API_PARAM_ERROR; |
| 23 | - case "isv.BUSINESS_LIMIT_CONTROL": return SMS_SEND_LIMIT_CONTROL; | |
| 24 | - case "isv.SMS_TEMPLATE_ILLEGAL": return SMS_TEMPLATE_NOT_EXISTS; | |
| 28 | + case "isv.BUSINESS_LIMIT_CONTROL": return SMS_SEND_BUSINESS_LIMIT_CONTROL; | |
| 29 | + case "isv.DAY_LIMIT_CONTROL": return SMS_SEND_DAY_LIMIT_CONTROL; | |
| 30 | + case "isv.SMS_CONTENT_ILLEGAL": return SMS_SEND_CONTENT_INVALID; | |
| 31 | + case "isv.SMS_TEMPLATE_ILLEGAL": return SMS_TEMPLATE_INVALID; | |
| 32 | + case "isv.SMS_SIGNATURE_ILLEGAL": | |
| 33 | + case "isv.SIGN_NAME_ILLEGAL": | |
| 34 | + case "isv.SMS_SIGN_ILLEGAL": return SMS_SIGN_INVALID; | |
| 35 | + case "isv.AMOUNT_NOT_ENOUGH": | |
| 36 | + case "isv.OUT_OF_SERVICE": return SMS_ACCOUNT_MONEY_NOT_ENOUGH; | |
| 37 | + case "isv.MOBILE_NUMBER_ILLEGAL": return SMS_MOBILE_INVALID; | |
| 38 | + case "isv.TEMPLATE_MISSING_PARAMETERS": return SMS_TEMPLATE_PARAM_ERROR; | |
| 25 | 39 | } |
| 26 | 40 | return SMS_UNKNOWN; |
| 27 | 41 | } | ... | ... |
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.*; |
| 10 | 10 | /** |
| 11 | 11 | * 云片的 SmsCodeMapping 实现类 |
| 12 | 12 | * |
| 13 | + * 参见 https://www.yunpian.com/official/document/sms/zh_CN/returnvalue_common 文档 | |
| 14 | + * | |
| 13 | 15 | * @author 芋道源码 |
| 14 | 16 | */ |
| 15 | 17 | public class YunpianSmsCodeMapping implements SmsCodeMapping { |
| ... | ... | @@ -21,8 +23,21 @@ public class YunpianSmsCodeMapping implements SmsCodeMapping { |
| 21 | 23 | case OK: return SUCCESS; |
| 22 | 24 | case ARGUMENT_MISSING: return SMS_API_PARAM_ERROR; |
| 23 | 25 | case BAD_ARGUMENT_FORMAT: return SMS_TEMPLATE_PARAM_ERROR; |
| 24 | - case TPL_NOT_FOUND: return SMS_TEMPLATE_NOT_EXISTS; | |
| 26 | + case TPL_NOT_FOUND: | |
| 25 | 27 | case TPL_NOT_VALID: return SMS_TEMPLATE_INVALID; |
| 28 | + case MONEY_NOT_ENOUGH: return SMS_ACCOUNT_MONEY_NOT_ENOUGH; | |
| 29 | + case BLACK_WORD: return SMS_SEND_CONTENT_INVALID; | |
| 30 | + case DUP_IN_SHORT_TIME: | |
| 31 | + case TOO_MANY_TIME_IN_5: | |
| 32 | + case DAY_LIMIT_PER_MOBILE: | |
| 33 | + case HOUR_LIMIT_PER_MOBILE: return SMS_SEND_BUSINESS_LIMIT_CONTROL; | |
| 34 | + case BLACK_PHONE_FILTER: return SMS_MOBILE_BLACK; | |
| 35 | + case SIGN_NOT_MATCH: | |
| 36 | + case BAD_SIGN_FORMAT: | |
| 37 | + case SIGN_NOT_VALID: return SMS_SIGN_INVALID; | |
| 38 | + case BAD_API_KEY: return SMS_ACCOUNT_INVALID; | |
| 39 | + case API_NOT_ALLOWED: return SMS_PERMISSION_DENY; | |
| 40 | + case IP_NOT_ALLOWED: return SMS_IP_DENY; | |
| 26 | 41 | } |
| 27 | 42 | return SMS_UNKNOWN; |
| 28 | 43 | } | ... | ... |
src/main/java/cn/iocoder/dashboard/framework/sms/core/enums/SmsFrameworkErrorCodeConstants.java
| ... | ... | @@ -11,21 +11,37 @@ import cn.iocoder.dashboard.common.exception.ErrorCode; |
| 11 | 11 | */ |
| 12 | 12 | public interface SmsFrameworkErrorCodeConstants { |
| 13 | 13 | |
| 14 | - // ========== 渠道相关 2001000100 ========== | |
| 15 | - ErrorCode SMS_CHANNEL_API_KEY_MISSING = new ErrorCode(2001000101, "API Key 不存在"); | |
| 16 | - ErrorCode SMS_CHANNEL_PERMISSION_DENY = new ErrorCode(2001000102, "没有发送短信的权限"); | |
| 14 | + ErrorCode SMS_UNKNOWN = new ErrorCode(2001000000, "未知错误,需要解析"); | |
| 17 | 15 | |
| 18 | - // ========== 模板相关(2001000200 开头) ========== | |
| 19 | - ErrorCode SMS_TEMPLATE_NOT_EXISTS = new ErrorCode(2001000200, "短信模板不存在"); | |
| 20 | - ErrorCode SMS_TEMPLATE_DISABLE = new ErrorCode(2001000201, "短信模板被禁用"); // 例如说,我们在管理后台禁用了 | |
| 21 | - ErrorCode SMS_TEMPLATE_INVALID = new ErrorCode(2001000202, "短信模板不可用"); // 例如说,短信模板正在审核中 | |
| 22 | - ErrorCode SMS_TEMPLATE_PARAM_ERROR = new ErrorCode(2001000203, "模板参数不正确"); | |
| 16 | + // ========== 权限 / 限流等相关 2001000100 ========== | |
| 23 | 17 | |
| 24 | - // ========== 其它相关(2001000900 开头) ========== | |
| 18 | + ErrorCode SMS_PERMISSION_DENY = new ErrorCode(2001000100, "没有发送短信的权限"); | |
| 19 | + // 云片:可以配置 IP 白名单,只有在白名单中才可以发送短信 | |
| 20 | + ErrorCode SMS_IP_DENY = new ErrorCode(2001000100, "IP 不允许发送短信"); | |
| 21 | + | |
| 22 | + // 阿里云:将短信发送频率限制在正常的业务限流范围内。默认短信验证码:使用同一签名,对同一个手机号验证码,支持 1 条 / 分钟,5 条 / 小时,累计 10 条 / 天。 | |
| 23 | + ErrorCode SMS_SEND_BUSINESS_LIMIT_CONTROL = new ErrorCode(2001000102, "指定手机的发送限流"); | |
| 24 | + // 阿里云:已经达到您在控制台设置的短信日发送量限额值。在国内消息设置 > 安全设置,修改发送总量阈值。 | |
| 25 | + ErrorCode SMS_SEND_DAY_LIMIT_CONTROL = new ErrorCode(2001000103, "每天的发送限流"); | |
| 26 | + | |
| 27 | + ErrorCode SMS_SEND_CONTENT_INVALID = new ErrorCode(2001000104, "短信内容有敏感词"); | |
| 28 | + | |
| 29 | + // ========== 模板相关 2001000200 ========== | |
| 30 | + ErrorCode SMS_TEMPLATE_INVALID = new ErrorCode(2001000200, "短信模板不合法"); // 包括短信模板不存在 | |
| 31 | + ErrorCode SMS_TEMPLATE_PARAM_ERROR = new ErrorCode(2001000201, "模板参数不正确"); | |
| 32 | + | |
| 33 | + // ========== 签名相关 2001000300 ========== | |
| 34 | + ErrorCode SMS_SIGN_INVALID = new ErrorCode(2001000300, "短信签名不可用"); | |
| 35 | + | |
| 36 | + // ========== 账户相关 2001000400 ========== | |
| 37 | + ErrorCode SMS_ACCOUNT_MONEY_NOT_ENOUGH = new ErrorCode(2001000400, "账户余额不足"); | |
| 38 | + ErrorCode SMS_ACCOUNT_INVALID = new ErrorCode(2001000401, "apiKey 不存在"); | |
| 39 | + | |
| 40 | + // ========== 其它相关 2001000900 开头 ========== | |
| 25 | 41 | ErrorCode SMS_API_PARAM_ERROR = new ErrorCode(2001000900, "请求参数缺失"); |
| 42 | + ErrorCode SMS_MOBILE_INVALID = new ErrorCode(2001000901, "手机格式不正确"); | |
| 43 | + ErrorCode SMS_MOBILE_BLACK = new ErrorCode(2001000902, "手机号在黑名单中"); | |
| 26 | 44 | |
| 27 | - ErrorCode SMS_SEND_LIMIT_CONTROL = new ErrorCode(2001000997, "业务限流"); // 将短信发送频率限制在正常的业务限流范围内。默认短信验证码:使用同一签名,对同一个手机号验证码,支持 1 条 / 分钟,5 条 / 小时,累计 10 条 / 天。 | |
| 28 | - ErrorCode EXCEPTION = new ErrorCode(2001000998, "调用异常"); | |
| 29 | - ErrorCode SMS_UNKNOWN = new ErrorCode(2001000999, "未知错误,需要解析"); | |
| 45 | + ErrorCode EXCEPTION = new ErrorCode(2001000999, "调用异常"); | |
| 30 | 46 | |
| 31 | 47 | } | ... | ... |
src/test/java/cn/iocoder/dashboard/framework/sms/core/client/impl/aliyun/AliyunSmsCodeMappingTest.java
0 → 100644
| 1 | +package cn.iocoder.dashboard.framework.sms.core.client.impl.aliyun; | |
| 2 | + | |
| 3 | +import cn.iocoder.dashboard.BaseMockitoUnitTest; | |
| 4 | +import cn.iocoder.dashboard.common.exception.enums.GlobalErrorCodeConstants; | |
| 5 | +import cn.iocoder.dashboard.framework.sms.core.enums.SmsFrameworkErrorCodeConstants; | |
| 6 | +import org.junit.jupiter.api.Test; | |
| 7 | +import org.mockito.InjectMocks; | |
| 8 | + | |
| 9 | +import static org.junit.jupiter.api.Assertions.*; | |
| 10 | + | |
| 11 | +/** | |
| 12 | + * {@link AliyunSmsCodeMapping} 的单元测试 | |
| 13 | + * | |
| 14 | + * @author 芋道源码 | |
| 15 | + */ | |
| 16 | +public class AliyunSmsCodeMappingTest extends BaseMockitoUnitTest { | |
| 17 | + | |
| 18 | + @InjectMocks | |
| 19 | + private AliyunSmsCodeMapping codeMapping; | |
| 20 | + | |
| 21 | + @Test | |
| 22 | + public void testApply() { | |
| 23 | + assertEquals(GlobalErrorCodeConstants.SUCCESS, codeMapping.apply("OK")); | |
| 24 | + assertEquals(SmsFrameworkErrorCodeConstants.SMS_ACCOUNT_INVALID, codeMapping.apply("MissingAccessKeyId")); | |
| 25 | + assertEquals(SmsFrameworkErrorCodeConstants.SMS_ACCOUNT_INVALID, codeMapping.apply("isv.ACCOUNT_NOT_EXISTS")); | |
| 26 | + assertEquals(SmsFrameworkErrorCodeConstants.SMS_ACCOUNT_INVALID, codeMapping.apply("isv.ACCOUNT_ABNORMAL")); | |
| 27 | + assertEquals(SmsFrameworkErrorCodeConstants.SMS_SEND_DAY_LIMIT_CONTROL, codeMapping.apply("isv.DAY_LIMIT_CONTROL")); | |
| 28 | + assertEquals(SmsFrameworkErrorCodeConstants.SMS_SEND_CONTENT_INVALID, codeMapping.apply("isv.SMS_CONTENT_ILLEGAL")); | |
| 29 | + assertEquals(SmsFrameworkErrorCodeConstants.SMS_SIGN_INVALID, codeMapping.apply("isv.SMS_SIGN_ILLEGAL")); | |
| 30 | + assertEquals(SmsFrameworkErrorCodeConstants.SMS_SIGN_INVALID, codeMapping.apply("isv.SIGN_NAME_ILLEGAL")); | |
| 31 | + assertEquals(SmsFrameworkErrorCodeConstants.SMS_PERMISSION_DENY, codeMapping.apply("isp.RAM_PERMISSION_DENY")); | |
| 32 | + assertEquals(SmsFrameworkErrorCodeConstants.SMS_ACCOUNT_MONEY_NOT_ENOUGH, codeMapping.apply("isv.OUT_OF_SERVICE")); | |
| 33 | + assertEquals(SmsFrameworkErrorCodeConstants.SMS_ACCOUNT_MONEY_NOT_ENOUGH, codeMapping.apply("isv.AMOUNT_NOT_ENOUGH")); | |
| 34 | + assertEquals(SmsFrameworkErrorCodeConstants.SMS_TEMPLATE_INVALID, codeMapping.apply("isv.SMS_TEMPLATE_ILLEGAL")); | |
| 35 | + assertEquals(SmsFrameworkErrorCodeConstants.SMS_SIGN_INVALID, codeMapping.apply("isv.SMS_SIGNATURE_ILLEGAL")); | |
| 36 | + assertEquals(SmsFrameworkErrorCodeConstants.SMS_API_PARAM_ERROR, codeMapping.apply("isv.INVALID_PARAMETERS")); | |
| 37 | + assertEquals(SmsFrameworkErrorCodeConstants.SMS_API_PARAM_ERROR, codeMapping.apply("isv.INVALID_JSON_PARAM")); | |
| 38 | + assertEquals(SmsFrameworkErrorCodeConstants.SMS_MOBILE_INVALID, codeMapping.apply("isv.MOBILE_NUMBER_ILLEGAL")); | |
| 39 | + assertEquals(SmsFrameworkErrorCodeConstants.SMS_TEMPLATE_PARAM_ERROR, codeMapping.apply("isv.TEMPLATE_MISSING_PARAMETERS")); | |
| 40 | + assertEquals(SmsFrameworkErrorCodeConstants.SMS_SEND_BUSINESS_LIMIT_CONTROL, codeMapping.apply("isv.BUSINESS_LIMIT_CONTROL")); | |
| 41 | + } | |
| 42 | + | |
| 43 | +} | ... | ... |
src/test/java/cn/iocoder/dashboard/framework/sms/core/client/impl/yunpian/YunpianSmsCodeMappingTest.java
0 → 100644
| 1 | +package cn.iocoder.dashboard.framework.sms.core.client.impl.yunpian; | |
| 2 | + | |
| 3 | +import cn.iocoder.dashboard.BaseMockitoUnitTest; | |
| 4 | +import cn.iocoder.dashboard.common.exception.enums.GlobalErrorCodeConstants; | |
| 5 | +import cn.iocoder.dashboard.framework.sms.core.enums.SmsFrameworkErrorCodeConstants; | |
| 6 | +import org.junit.jupiter.api.Test; | |
| 7 | +import org.mockito.InjectMocks; | |
| 8 | + | |
| 9 | +import static com.yunpian.sdk.constant.Code.*; | |
| 10 | +import static org.junit.jupiter.api.Assertions.assertEquals; | |
| 11 | + | |
| 12 | +/** | |
| 13 | + * {@link YunpianSmsCodeMapping} 的单元测试 | |
| 14 | + * | |
| 15 | + * @author 芋道源码 | |
| 16 | + */ | |
| 17 | +class YunpianSmsCodeMappingTest extends BaseMockitoUnitTest { | |
| 18 | + | |
| 19 | + @InjectMocks | |
| 20 | + private YunpianSmsCodeMapping codeMapping; | |
| 21 | + | |
| 22 | + @Test | |
| 23 | + public void testApply() { | |
| 24 | + assertEquals(GlobalErrorCodeConstants.SUCCESS, codeMapping.apply(String.valueOf(OK))); | |
| 25 | + assertEquals(SmsFrameworkErrorCodeConstants.SMS_API_PARAM_ERROR, codeMapping.apply(String.valueOf(ARGUMENT_MISSING))); | |
| 26 | + assertEquals(SmsFrameworkErrorCodeConstants.SMS_TEMPLATE_PARAM_ERROR, codeMapping.apply(String.valueOf(BAD_ARGUMENT_FORMAT))); | |
| 27 | + assertEquals(SmsFrameworkErrorCodeConstants.SMS_ACCOUNT_MONEY_NOT_ENOUGH, codeMapping.apply(String.valueOf(MONEY_NOT_ENOUGH))); | |
| 28 | + assertEquals(SmsFrameworkErrorCodeConstants.SMS_TEMPLATE_INVALID, codeMapping.apply(String.valueOf(TPL_NOT_FOUND))); | |
| 29 | + assertEquals(SmsFrameworkErrorCodeConstants.SMS_TEMPLATE_INVALID, codeMapping.apply(String.valueOf(TPL_NOT_VALID))); | |
| 30 | + assertEquals(SmsFrameworkErrorCodeConstants.SMS_SEND_BUSINESS_LIMIT_CONTROL, codeMapping.apply(String.valueOf(DUP_IN_SHORT_TIME))); | |
| 31 | + assertEquals(SmsFrameworkErrorCodeConstants.SMS_SEND_BUSINESS_LIMIT_CONTROL, codeMapping.apply(String.valueOf(TOO_MANY_TIME_IN_5))); | |
| 32 | + assertEquals(SmsFrameworkErrorCodeConstants.SMS_SEND_BUSINESS_LIMIT_CONTROL, codeMapping.apply(String.valueOf(DAY_LIMIT_PER_MOBILE))); | |
| 33 | + assertEquals(SmsFrameworkErrorCodeConstants.SMS_SEND_BUSINESS_LIMIT_CONTROL, codeMapping.apply(String.valueOf(HOUR_LIMIT_PER_MOBILE))); | |
| 34 | + assertEquals(SmsFrameworkErrorCodeConstants.SMS_MOBILE_BLACK, codeMapping.apply(String.valueOf(BLACK_PHONE_FILTER))); | |
| 35 | + assertEquals(SmsFrameworkErrorCodeConstants.SMS_SIGN_INVALID, codeMapping.apply(String.valueOf(SIGN_NOT_MATCH))); | |
| 36 | + assertEquals(SmsFrameworkErrorCodeConstants.SMS_SIGN_INVALID, codeMapping.apply(String.valueOf(SIGN_NOT_VALID))); | |
| 37 | + assertEquals(SmsFrameworkErrorCodeConstants.SMS_SIGN_INVALID, codeMapping.apply(String.valueOf(BAD_SIGN_FORMAT))); | |
| 38 | + assertEquals(SmsFrameworkErrorCodeConstants.SMS_ACCOUNT_INVALID, codeMapping.apply(String.valueOf(BAD_API_KEY))); | |
| 39 | + assertEquals(SmsFrameworkErrorCodeConstants.SMS_PERMISSION_DENY, codeMapping.apply(String.valueOf(API_NOT_ALLOWED))); | |
| 40 | + assertEquals(SmsFrameworkErrorCodeConstants.SMS_IP_DENY, codeMapping.apply(String.valueOf(IP_NOT_ALLOWED))); | |
| 41 | + } | |
| 42 | + | |
| 43 | +} | ... | ... |