短信提交 2021-04-01,重构返回的结果

This commit is contained in:
YunaiV 2021-04-01 01:31:35 +08:00
parent 9528698a5f
commit 5a1491d7fd
21 changed files with 174 additions and 140 deletions

View File

@ -1,12 +1,13 @@
package cn.iocoder.dashboard.common.exception; package cn.iocoder.dashboard.common.exception;
import cn.iocoder.dashboard.common.exception.enums.GlobalErrorCodeConstants;
import cn.iocoder.dashboard.common.exception.enums.ServiceErrorCodeRange; import cn.iocoder.dashboard.common.exception.enums.ServiceErrorCodeRange;
import lombok.Data; import lombok.Data;
/** /**
* 错误码对象 * 错误码对象
* *
* 全局错误码占用 [0, 999]参见 {@link GlobalException} * 全局错误码占用 [0, 999], 参见 {@link GlobalErrorCodeConstants}
* 业务异常错误码占用 [1 000 000 000, +)参见 {@link ServiceErrorCodeRange} * 业务异常错误码占用 [1 000 000 000, +)参见 {@link ServiceErrorCodeRange}
* *
* TODO 错误码设计成对象的原因为未来的 i18 国际化做准备 * TODO 错误码设计成对象的原因为未来的 i18 国际化做准备
@ -21,11 +22,11 @@ public class ErrorCode {
/** /**
* 错误提示 * 错误提示
*/ */
private final String message; private final String msg;
public ErrorCode(Integer code, String message) { public ErrorCode(Integer code, String message) {
this.code = code; this.code = code;
this.message = message; this.msg = message;
} }
} }

View File

@ -30,7 +30,7 @@ public final class ServiceException extends RuntimeException {
public ServiceException(ErrorCode errorCode) { public ServiceException(ErrorCode errorCode) {
this.code = errorCode.getCode(); this.code = errorCode.getCode();
this.message = errorCode.getMessage(); this.message = errorCode.getMsg();
} }
public ServiceException(Integer code, String message) { public ServiceException(Integer code, String message) {

View File

@ -47,12 +47,12 @@ public class ServiceExceptionUtil {
// ========== ServiceException 的集成 ========== // ========== ServiceException 的集成 ==========
public static ServiceException exception(ErrorCode errorCode) { public static ServiceException exception(ErrorCode errorCode) {
String messagePattern = MESSAGES.getOrDefault(errorCode.getCode(), errorCode.getMessage()); String messagePattern = MESSAGES.getOrDefault(errorCode.getCode(), errorCode.getMsg());
return exception0(errorCode.getCode(), messagePattern); return exception0(errorCode.getCode(), messagePattern);
} }
public static ServiceException exception(ErrorCode errorCode, Object... params) { public static ServiceException exception(ErrorCode errorCode, Object... params) {
String messagePattern = MESSAGES.getOrDefault(errorCode.getCode(), errorCode.getMessage()); String messagePattern = MESSAGES.getOrDefault(errorCode.getCode(), errorCode.getMsg());
return exception0(errorCode.getCode(), messagePattern, params); return exception0(errorCode.getCode(), messagePattern, params);
} }

View File

@ -30,7 +30,7 @@ public class CommonResult<T> implements Serializable {
/** /**
* 错误提示用户可阅读 * 错误提示用户可阅读
* *
* @see ErrorCode#getMessage() () * @see ErrorCode#getMsg() ()
*/ */
private String msg; private String msg;
@ -56,7 +56,7 @@ public class CommonResult<T> implements Serializable {
} }
public static <T> CommonResult<T> error(ErrorCode errorCode) { public static <T> CommonResult<T> error(ErrorCode errorCode) {
return error(errorCode.getCode(), errorCode.getMessage()); return error(errorCode.getCode(), errorCode.getMsg());
} }
public static <T> CommonResult<T> success(T data) { public static <T> CommonResult<T> success(T data) {

View File

@ -1,6 +1,6 @@
package cn.iocoder.dashboard.framework.sms.core.client; package cn.iocoder.dashboard.framework.sms.core.client;
import cn.iocoder.dashboard.framework.sms.core.SmsResultDetail; import cn.iocoder.dashboard.framework.sms.core.client.dto.SmsResultDetail;
import cn.iocoder.dashboard.framework.sms.core.client.dto.SmsSendRespDTO; import cn.iocoder.dashboard.framework.sms.core.client.dto.SmsSendRespDTO;
import javax.servlet.ServletRequest; import javax.servlet.ServletRequest;

View File

@ -0,0 +1,17 @@
package cn.iocoder.dashboard.framework.sms.core.client;
import cn.iocoder.dashboard.common.exception.ErrorCode;
import cn.iocoder.dashboard.framework.sms.core.enums.SmsFrameworkErrorCodeConstants;
import java.util.function.Function;
/**
* API 的错误码转换为通用的错误码
*
* @see SmsCommonResult
* @see SmsFrameworkErrorCodeConstants
*
* @author 芋道源码
*/
public interface SmsCodeMapping extends Function<String, ErrorCode> {
}

View File

@ -1,8 +1,10 @@
package cn.iocoder.dashboard.framework.sms.core.client; package cn.iocoder.dashboard.framework.sms.core.client;
import cn.hutool.core.exceptions.ExceptionUtil; import cn.hutool.core.exceptions.ExceptionUtil;
import cn.hutool.core.lang.Assert;
import cn.iocoder.dashboard.common.exception.ErrorCode;
import cn.iocoder.dashboard.common.pojo.CommonResult; import cn.iocoder.dashboard.common.pojo.CommonResult;
import cn.iocoder.dashboard.framework.sms.core.enums.SmsSendFailureTypeEnum; import cn.iocoder.dashboard.framework.sms.core.enums.SmsFrameworkErrorCodeConstants;
import lombok.Data; import lombok.Data;
import lombok.EqualsAndHashCode; import lombok.EqualsAndHashCode;
import lombok.ToString; import lombok.ToString;
@ -40,20 +42,27 @@ public class SmsCommonResult<T> extends CommonResult<T> {
private SmsCommonResult() { private SmsCommonResult() {
} }
public static SmsCommonResult success(SmsSendFailureTypeEnum sendFailureType, public static <T> SmsCommonResult<T> build(String apiCode, String apiMsg, String apiRequestId,
String apiSendCode, String apiSendMsg, String apiRequestId, String apiSerialNo) { T data, SmsCodeMapping codeMapping) {
SmsCommonResult result = new SmsCommonResult().setSuccess(true).setApiSendCode(apiSendCode).setApiSendMsg(apiSendMsg) Assert.notNull(codeMapping, "参数 codeMapping 不能为空");
.setApiRequestId(apiRequestId).setApiSerialNo(apiSerialNo); SmsCommonResult<T> result = new SmsCommonResult<T>().setApiCode(apiCode).setApiMsg(apiMsg).setApiRequestId(apiRequestId);
if (sendFailureType != null) { result.setData(data);
result.setSendFailureType(sendFailureType.getType()).setSendFailureMsg(sendFailureType.getMsg()); // 翻译错误码
if (codeMapping != null) {
ErrorCode errorCode = codeMapping.apply(apiCode);
if (errorCode == null) {
errorCode = SmsFrameworkErrorCodeConstants.SMS_UNKNOWN;
}
result.setCode(errorCode.getCode()).setMsg(errorCode.getMsg());
} }
return result; return result;
} }
public static SmsCommonResult error(Throwable ex) { public static <T> SmsCommonResult<T> error(Throwable ex) {
return new SmsCommonResult().setSuccess(false) SmsCommonResult<T> result = new SmsCommonResult<>();
.setSendFailureType(SmsSendFailureTypeEnum.SMS_SEND_EXCEPTION.getType()) result.setCode(SmsFrameworkErrorCodeConstants.EXCEPTION.getCode());
.setSendFailureMsg(ExceptionUtil.getRootCauseMessage(ex)); result.setMsg(ExceptionUtil.getRootCauseMessage(ex));
return result;
} }
} }

View File

@ -1,4 +1,4 @@
package cn.iocoder.dashboard.framework.sms.core; package cn.iocoder.dashboard.framework.sms.core.client.dto;
import cn.iocoder.dashboard.modules.system.enums.sms.SysSmsSendStatusEnum; import cn.iocoder.dashboard.modules.system.enums.sms.SysSmsSendStatusEnum;
import lombok.Data; import lombok.Data;

View File

@ -1,10 +1,13 @@
package cn.iocoder.dashboard.framework.sms.core.client.dto; package cn.iocoder.dashboard.framework.sms.core.client.dto;
import lombok.Data;
/** /**
* 短信发送响应 DTO * 短信发送响应 DTO
* *
* @author 芋道源码 * @author 芋道源码
*/ */
@Data
public class SmsSendRespDTO { public class SmsSendRespDTO {
/** /**

View File

@ -1,5 +1,6 @@
package cn.iocoder.dashboard.framework.sms.core.client.impl; package cn.iocoder.dashboard.framework.sms.core.client.impl;
import cn.iocoder.dashboard.framework.sms.core.client.SmsCodeMapping;
import cn.iocoder.dashboard.framework.sms.core.client.SmsCommonResult; import cn.iocoder.dashboard.framework.sms.core.client.SmsCommonResult;
import cn.iocoder.dashboard.framework.sms.core.client.SmsClient; import cn.iocoder.dashboard.framework.sms.core.client.SmsClient;
import cn.iocoder.dashboard.framework.sms.core.client.dto.SmsSendRespDTO; import cn.iocoder.dashboard.framework.sms.core.client.dto.SmsSendRespDTO;
@ -21,14 +22,19 @@ public abstract class AbstractSmsClient implements SmsClient {
* 短信渠道配置 * 短信渠道配置
*/ */
protected volatile SmsChannelProperties properties; protected volatile SmsChannelProperties properties;
/**
* 错误码枚举类
*/
protected final SmsCodeMapping codeMapping;
/** /**
* 短信客户端有参构造函数 * 短信客户端有参构造函数
* *
* @param properties 短信配置 * @param properties 短信配置
*/ */
public AbstractSmsClient(SmsChannelProperties properties) { public AbstractSmsClient(SmsChannelProperties properties, SmsCodeMapping codeMapping) {
this.properties = properties; this.properties = properties;
this.codeMapping = codeMapping;
} }
/** /**

View File

@ -4,9 +4,9 @@ import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.date.DateUtil; import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.StrUtil; import cn.hutool.core.util.StrUtil;
import cn.iocoder.dashboard.framework.sms.core.client.SmsCommonResult; import cn.iocoder.dashboard.framework.sms.core.client.SmsCommonResult;
import cn.iocoder.dashboard.framework.sms.core.SmsResultDetail; import cn.iocoder.dashboard.framework.sms.core.client.dto.SmsResultDetail;
import cn.iocoder.dashboard.framework.sms.core.client.dto.SmsSendRespDTO;
import cn.iocoder.dashboard.framework.sms.core.client.impl.AbstractSmsClient; import cn.iocoder.dashboard.framework.sms.core.client.impl.AbstractSmsClient;
import cn.iocoder.dashboard.framework.sms.core.enums.SmsSendFailureTypeEnum;
import cn.iocoder.dashboard.framework.sms.core.property.SmsChannelProperties; import cn.iocoder.dashboard.framework.sms.core.property.SmsChannelProperties;
import cn.iocoder.dashboard.modules.system.enums.sms.SysSmsSendStatusEnum; import cn.iocoder.dashboard.modules.system.enums.sms.SysSmsSendStatusEnum;
import cn.iocoder.dashboard.util.json.JsonUtils; import cn.iocoder.dashboard.util.json.JsonUtils;
@ -48,7 +48,7 @@ public class AliyunSmsClient extends AbstractSmsClient {
private volatile IAcsClient acsClient; private volatile IAcsClient acsClient;
public AliyunSmsClient(SmsChannelProperties properties) { public AliyunSmsClient(SmsChannelProperties properties) {
super(properties); super(properties, new AliyunSmsCodeMapping());
} }
@Override @Override
@ -59,7 +59,8 @@ public class AliyunSmsClient extends AbstractSmsClient {
} }
@Override @Override
protected SmsCommonResult doSend(Long sendLogId, String mobile, String apiTemplateId, Map<String, Object> templateParams) throws Exception { protected SmsCommonResult<SmsSendRespDTO> doSend(Long sendLogId, String mobile,
String apiTemplateId, Map<String, Object> templateParams) throws Throwable {
// 构建参数 // 构建参数
SendSmsRequest request = new SendSmsRequest(); SendSmsRequest request = new SendSmsRequest();
request.setSysMethod(MethodType.POST); request.setSysMethod(MethodType.POST);
@ -73,25 +74,16 @@ public class AliyunSmsClient extends AbstractSmsClient {
// 执行发送 // 执行发送
SendSmsResponse sendResult = acsClient.getAcsResponse(request); SendSmsResponse sendResult = acsClient.getAcsResponse(request);
// 解析结果 // 解析结果
return SmsCommonResult.success(parseSendFailureType(sendResult.getCode()), // API 短信平台解析成统一的错误码 SmsSendRespDTO data = null;
sendResult.getCode(), sendResult.getMessage(), sendResult.getRequestId(), sendResult.getBizId()); if (sendResult.getBizId() != null) {
data = new SmsSendRespDTO().setSerialNo(sendResult.getBizId());
}
return SmsCommonResult.build(sendResult.getCode(), sendResult.getMessage(), sendResult.getRequestId(), data, codeMapping);
} catch (ClientException ex) { } catch (ClientException ex) {
return SmsCommonResult.success(parseSendFailureType(ex.getErrCode()), // API 短信平台解析成统一的错误码 return SmsCommonResult.build(ex.getErrCode(), formatResultMsg(ex), ex.getRequestId(), null, codeMapping);
ex.getErrCode(), formatResultMsg(ex), ex.getRequestId(), null);
} }
} }
private static SmsSendFailureTypeEnum parseSendFailureType(String code) {
switch (code) {
case "OK": return null;
case "MissingAccessKeyId": return SmsSendFailureTypeEnum.SMS_CHANNEL_API_KEY_MISSING;
case "isp.RAM_PERMISSION_DENY": return SmsSendFailureTypeEnum.SMS_CHANNEL_PERMISSION_DENY;
case "isv.INVALID_PARAMETERS": return SmsSendFailureTypeEnum.SMS_API_PARAM_ERROR;
case "isv.BUSINESS_LIMIT_CONTROL": return SmsSendFailureTypeEnum.SMS_SEND_LIMIT_CONTROL;
}
return SmsSendFailureTypeEnum.SMS_UNKNOWN;
}
private static String formatResultMsg(ClientException ex) { private static String formatResultMsg(ClientException ex) {
if (StrUtil.isEmpty(ex.getErrorDescription())) { if (StrUtil.isEmpty(ex.getErrorDescription())) {
return ex.getMessage(); return ex.getMessage();

View File

@ -0,0 +1,27 @@
package cn.iocoder.dashboard.framework.sms.core.client.impl.aliyun;
import cn.iocoder.dashboard.common.exception.ErrorCode;
import cn.iocoder.dashboard.framework.sms.core.client.SmsCodeMapping;
import static cn.iocoder.dashboard.framework.sms.core.enums.SmsFrameworkErrorCodeConstants.*;
/**
* 阿里云的 SmsCodeMapping 实现类
*
* @author 芋道源码
*/
public class AliyunSmsCodeMapping implements SmsCodeMapping {
@Override
public ErrorCode apply(String apiCode) {
switch (apiCode) {
case "OK": return null;
case "MissingAccessKeyId": return SMS_CHANNEL_API_KEY_MISSING;
case "isp.RAM_PERMISSION_DENY": return SMS_CHANNEL_PERMISSION_DENY;
case "isv.INVALID_PARAMETERS": return SMS_API_PARAM_ERROR;
case "isv.BUSINESS_LIMIT_CONTROL": return SMS_SEND_LIMIT_CONTROL;
}
return SMS_UNKNOWN;
}
}

View File

@ -6,11 +6,11 @@ import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.CharsetUtil; import cn.hutool.core.util.CharsetUtil;
import cn.hutool.core.util.StrUtil; import cn.hutool.core.util.StrUtil;
import cn.hutool.core.util.URLUtil; import cn.hutool.core.util.URLUtil;
import cn.iocoder.dashboard.framework.sms.core.SmsConstants;
import cn.iocoder.dashboard.framework.sms.core.client.SmsCommonResult; import cn.iocoder.dashboard.framework.sms.core.client.SmsCommonResult;
import cn.iocoder.dashboard.framework.sms.core.SmsResultDetail; import cn.iocoder.dashboard.framework.sms.core.client.dto.SmsResultDetail;
import cn.iocoder.dashboard.framework.sms.core.client.dto.SmsSendRespDTO;
import cn.iocoder.dashboard.framework.sms.core.client.impl.AbstractSmsClient; import cn.iocoder.dashboard.framework.sms.core.client.impl.AbstractSmsClient;
import cn.iocoder.dashboard.framework.sms.core.enums.SmsSendFailureTypeEnum; import cn.iocoder.dashboard.framework.sms.core.enums.SmsConstants;
import cn.iocoder.dashboard.framework.sms.core.property.SmsChannelProperties; import cn.iocoder.dashboard.framework.sms.core.property.SmsChannelProperties;
import cn.iocoder.dashboard.modules.system.enums.sms.SysSmsSendStatusEnum; import cn.iocoder.dashboard.modules.system.enums.sms.SysSmsSendStatusEnum;
import cn.iocoder.dashboard.util.json.JsonUtils; import cn.iocoder.dashboard.util.json.JsonUtils;
@ -29,8 +29,6 @@ import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.StringJoiner; import java.util.StringJoiner;
import static com.yunpian.sdk.constant.Code.*;
/** /**
* 云片短信客户端的实现类 * 云片短信客户端的实现类
* *
@ -49,7 +47,7 @@ public class YunpianSmsClient extends AbstractSmsClient {
}; };
public YunpianSmsClient(SmsChannelProperties properties) { public YunpianSmsClient(SmsChannelProperties properties) {
super(properties); super(properties, new YunpianSmsCodeMapping());
} }
@Override @Override
@ -66,7 +64,8 @@ public class YunpianSmsClient extends AbstractSmsClient {
} }
@Override @Override
protected SmsCommonResult doSend(Long sendLogId, String mobile, String apiTemplateId, Map<String, Object> templateParams) throws Throwable { protected SmsCommonResult<SmsSendRespDTO> doSend(Long sendLogId, String mobile,
String apiTemplateId, Map<String, Object> templateParams) throws Throwable {
// 构建参数 // 构建参数
Map<String, String> request = new HashMap<>(); Map<String, String> request = new HashMap<>();
request.put(YunpianConstant.APIKEY, properties.getApiKey()); request.put(YunpianConstant.APIKEY, properties.getApiKey());
@ -82,8 +81,12 @@ public class YunpianSmsClient extends AbstractSmsClient {
throw sendResult.getThrowable(); throw sendResult.getThrowable();
} }
// 解析结果 // 解析结果
return SmsCommonResult.success(parseSendFailureType(sendResult), // API 短信平台解析成统一的错误码 SmsSendRespDTO data = null;
String.valueOf(sendResult.getCode()), formatResultMsg(sendResult), null, getApiSerialNo(sendResult)); if (sendResult.getData() != null) {
data = new SmsSendRespDTO().setSerialNo(String.valueOf(sendResult.getData().getSid()));
}
return SmsCommonResult.build(String.valueOf(sendResult.getCode()), formatResultMsg(sendResult), null,
data, codeMapping);
} }
private static String formatTplValue(Map<String, Object> templateParams) { private static String formatTplValue(Map<String, Object> templateParams) {
@ -103,25 +106,6 @@ public class YunpianSmsClient extends AbstractSmsClient {
return sendResult.getMsg() + " => " + sendResult.getDetail(); return sendResult.getMsg() + " => " + sendResult.getDetail();
} }
private static SmsSendFailureTypeEnum parseSendFailureType(Result<SmsSingleSend> sendResult) {
Integer code = sendResult.getCode();
switch (code) {
case OK: return null;
case ARGUMENT_MISSING: return SmsSendFailureTypeEnum.SMS_API_PARAM_ERROR;
case BAD_ARGUMENT_FORMAT: return SmsSendFailureTypeEnum.SMS_TEMPLATE_PARAM_ERROR;
case TPL_NOT_FOUND: return SmsSendFailureTypeEnum.SMS_TEMPLATE_NOT_EXISTS;
case TPL_NOT_VALID: return SmsSendFailureTypeEnum.SMS_TEMPLATE_INVALID;
}
return SmsSendFailureTypeEnum.SMS_UNKNOWN;
}
private static String getApiSerialNo(Result<SmsSingleSend> sendResult) {
if (sendResult.getData() == null) {
return null;
}
return String.valueOf(sendResult.getData().getSid());
}
/** /**
* 云片的比较复杂又是加密又是套娃的 * 云片的比较复杂又是加密又是套娃的
*/ */

View File

@ -0,0 +1,30 @@
package cn.iocoder.dashboard.framework.sms.core.client.impl.yunpian;
import cn.iocoder.dashboard.common.exception.ErrorCode;
import cn.iocoder.dashboard.framework.sms.core.client.SmsCodeMapping;
import static cn.iocoder.dashboard.common.exception.enums.GlobalErrorCodeConstants.SUCCESS;
import static cn.iocoder.dashboard.framework.sms.core.enums.SmsFrameworkErrorCodeConstants.*;
import static com.yunpian.sdk.constant.Code.*;
/**
* 云片的 SmsCodeMapping 实现类
*
* @author 芋道源码
*/
public class YunpianSmsCodeMapping implements SmsCodeMapping {
@Override
public ErrorCode apply(String apiCode) {
int code = Integer.parseInt(apiCode);
switch (code) {
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_VALID: return SMS_TEMPLATE_INVALID;
}
return SMS_UNKNOWN;
}
}

View File

@ -1,4 +1,4 @@
package cn.iocoder.dashboard.framework.sms.core; package cn.iocoder.dashboard.framework.sms.core.enums;
/** /**
* 短信相关常量类 * 短信相关常量类

View File

@ -0,0 +1,32 @@
package cn.iocoder.dashboard.framework.sms.core.enums;
import cn.iocoder.dashboard.common.exception.ErrorCode;
/**
* 短信框架的错误码枚举
*
* 短信框架使用 2-001-000-000
*
* @author 芋道源码
*/
public interface SmsFrameworkErrorCodeConstants {
// ========== 渠道相关 2001000100 ==========
ErrorCode SMS_CHANNEL_CLIENT_NOT_EXISTS = new ErrorCode(2001000100, "短信渠道的客户端不存在");
ErrorCode SMS_CHANNEL_API_KEY_MISSING = new ErrorCode(2001000101, "API Key 不存在");
ErrorCode SMS_CHANNEL_PERMISSION_DENY = new ErrorCode(2001000102, "没有发送短信的权限");
// ========== 模板相关(200 开头) ==========
ErrorCode SMS_TEMPLATE_NOT_EXISTS = new ErrorCode(200, "短信模板不存在");
ErrorCode SMS_TEMPLATE_DISABLE = new ErrorCode(201, "短信模板被禁用"); // 例如说我们在管理后台禁用了
ErrorCode SMS_TEMPLATE_INVALID = new ErrorCode(202, "短信模板不可用"); // 例如说短信模板正在审核中
ErrorCode SMS_TEMPLATE_PARAM_ERROR = new ErrorCode(203, "模板参数不正确");
// ========== 其它相关(900 开头) ==========
ErrorCode SMS_API_PARAM_ERROR = new ErrorCode(900, "请求参数缺失");
ErrorCode SMS_SEND_LIMIT_CONTROL = new ErrorCode(997, "业务限流"); // 将短信发送频率限制在正常的业务限流范围内默认短信验证码使用同一签名对同一个手机号验证码支持 1 / 分钟5 / 小时累计 10 /
ErrorCode EXCEPTION = new ErrorCode(998, "调用异常");
ErrorCode SMS_UNKNOWN = new ErrorCode(999, "未知错误,需要解析");
}

View File

@ -1,43 +0,0 @@
package cn.iocoder.dashboard.framework.sms.core.enums;
import lombok.AllArgsConstructor;
import lombok.Getter;
/**
* 短信的发送失败类型的枚举
*
* @author 芋道源码
*/
@Getter
@AllArgsConstructor
public enum SmsSendFailureTypeEnum {
// ========== 渠道相关(100 开头) ==========
SMS_CHANNEL_CLIENT_NOT_EXISTS(100, "短信渠道的客户端不存在"),
SMS_CHANNEL_API_KEY_MISSING(101, "API Key 不存在"),
SMS_CHANNEL_PERMISSION_DENY(102, "没有发送短信的权限"),
// ========== 模板相关(200 开头) ==========
SMS_TEMPLATE_NOT_EXISTS(200, "短信模板不存在"),
SMS_TEMPLATE_DISABLE(201, "短信模板被禁用"), // 例如说我们在管理后台禁用了
SMS_TEMPLATE_INVALID(202, "短信模板不可用"), // 例如说短信模板正在审核中
SMS_TEMPLATE_PARAM_ERROR(203, "模板参数不正确"),
// ========== 其它相关(900 开头) ==========
SMS_API_PARAM_ERROR(900, "请求参数缺失"),
SMS_SEND_LIMIT_CONTROL(997, "业务限流"), // 将短信发送频率限制在正常的业务限流范围内默认短信验证码使用同一签名对同一个手机号验证码支持 1 / 分钟5 / 小时累计 10 /
SMS_SEND_EXCEPTION(998, "发送异常"),
SMS_UNKNOWN(999, "未知错误,需要解析")
;
/**
* 失败类型
*/
private final int type;
/**
* 失败提示
*/
private final String msg;
}

View File

@ -3,7 +3,6 @@ package cn.iocoder.dashboard.framework.web.core.handler;
import cn.hutool.core.exceptions.ExceptionUtil; import cn.hutool.core.exceptions.ExceptionUtil;
import cn.hutool.core.map.MapUtil; import cn.hutool.core.map.MapUtil;
import cn.hutool.extra.servlet.ServletUtil; import cn.hutool.extra.servlet.ServletUtil;
import cn.iocoder.dashboard.common.exception.GlobalException;
import cn.iocoder.dashboard.common.exception.ServiceException; import cn.iocoder.dashboard.common.exception.ServiceException;
import cn.iocoder.dashboard.common.pojo.CommonResult; import cn.iocoder.dashboard.common.pojo.CommonResult;
import cn.iocoder.dashboard.framework.logger.apilog.core.service.ApiErrorLogFrameworkService; import cn.iocoder.dashboard.framework.logger.apilog.core.service.ApiErrorLogFrameworkService;
@ -96,9 +95,6 @@ public class GlobalExceptionHandler {
if (ex instanceof AccessDeniedException) { if (ex instanceof AccessDeniedException) {
return accessDeniedExceptionHandler(request, (AccessDeniedException) ex); return accessDeniedExceptionHandler(request, (AccessDeniedException) ex);
} }
if (ex instanceof GlobalException) {
return globalExceptionHandler(request, (GlobalException) ex);
}
return defaultExceptionHandler(request, ex); return defaultExceptionHandler(request, ex);
} }
@ -222,25 +218,6 @@ public class GlobalExceptionHandler {
return CommonResult.error(ex.getCode(), ex.getMessage()); return CommonResult.error(ex.getCode(), ex.getMessage());
} }
/**
* 处理全局异常 ServiceException
*
* 例如说Dubbo 请求超时调用的 Dubbo 服务系统异常
*/
@ExceptionHandler(value = GlobalException.class)
public CommonResult<?> globalExceptionHandler(HttpServletRequest req, GlobalException ex) {
// 系统异常时才打印异常日志
if (INTERNAL_SERVER_ERROR.getCode().equals(ex.getCode())) {
// 插入异常日志
this.createExceptionLog(req, ex);
// 普通全局异常打印 info 日志即可
} else {
log.info("[globalExceptionHandler]", ex);
}
// 返回 ERROR CommonResult
return CommonResult.error(ex);
}
/** /**
* 处理系统异常兜底处理所有的一切 * 处理系统异常兜底处理所有的一切
*/ */
@ -250,7 +227,7 @@ public class GlobalExceptionHandler {
// 插入异常日志 // 插入异常日志
this.createExceptionLog(req, ex); this.createExceptionLog(req, ex);
// 返回 ERROR CommonResult // 返回 ERROR CommonResult
return CommonResult.error(INTERNAL_SERVER_ERROR.getCode(), INTERNAL_SERVER_ERROR.getMessage()); return CommonResult.error(INTERNAL_SERVER_ERROR.getCode(), INTERNAL_SERVER_ERROR.getMsg());
} }
private void createExceptionLog(HttpServletRequest req, Throwable e) { private void createExceptionLog(HttpServletRequest req, Throwable e) {

View File

@ -1,6 +1,5 @@
package cn.iocoder.dashboard.modules.system.service.sms; package cn.iocoder.dashboard.modules.system.service.sms;
import cn.iocoder.dashboard.framework.sms.core.enums.SmsSendFailureTypeEnum;
import cn.iocoder.dashboard.modules.system.dal.dataobject.sms.SysSmsTemplateDO; import cn.iocoder.dashboard.modules.system.dal.dataobject.sms.SysSmsTemplateDO;
import java.util.Map; import java.util.Map;

View File

@ -358,7 +358,7 @@ public class SysUserServiceImpl implements SysUserService {
} }
// 如果存在判断是否允许更新 // 如果存在判断是否允许更新
if (!isUpdateSupport) { if (!isUpdateSupport) {
respVO.getFailureUsernames().put(importUser.getUsername(), USER_USERNAME_EXISTS.getMessage()); respVO.getFailureUsernames().put(importUser.getUsername(), USER_USERNAME_EXISTS.getMsg());
return; return;
} }
SysUserDO updateUser = SysUserConvert.INSTANCE.convert(importUser); SysUserDO updateUser = SysUserConvert.INSTANCE.convert(importUser);

View File

@ -62,7 +62,7 @@ public class AssertUtils {
ServiceException serviceException = assertThrows(ServiceException.class, executable); ServiceException serviceException = assertThrows(ServiceException.class, executable);
// 校验错误码 // 校验错误码
Assertions.assertEquals(errorCode.getCode(), serviceException.getCode(), "错误码不匹配"); Assertions.assertEquals(errorCode.getCode(), serviceException.getCode(), "错误码不匹配");
String message = ServiceExceptionUtil.doFormat(errorCode.getCode(), errorCode.getMessage(), messageParams); String message = ServiceExceptionUtil.doFormat(errorCode.getCode(), errorCode.getMsg(), messageParams);
Assertions.assertEquals(message, serviceException.getMessage(), "错误提示不匹配"); Assertions.assertEquals(message, serviceException.getMessage(), "错误提示不匹配");
} }