package zhicha import ( "fmt" ) // ZhichaError 智查金控服务错误 type ZhichaError struct { Code string `json:"code"` Message string `json:"message"` } // Error 实现error接口 func (e *ZhichaError) Error() string { return fmt.Sprintf("智查金控错误 [%s]: %s", e.Code, e.Message) } // IsSuccess 检查是否成功 func (e *ZhichaError) IsSuccess() bool { return e.Code == "200" } // IsNoRecord 检查是否查询无记录 func (e *ZhichaError) IsNoRecord() bool { return e.Code == "201" } // IsBusinessError 检查是否是业务错误(非系统错误) func (e *ZhichaError) IsBusinessError() bool { return e.Code >= "302" && e.Code <= "320" } // IsSystemError 检查是否是系统错误 func (e *ZhichaError) IsSystemError() bool { return e.Code == "500" } // IsAuthError 检查是否是认证相关错误 func (e *ZhichaError) IsAuthError() bool { return e.Code == "304" || e.Code == "318" || e.Code == "319" || e.Code == "320" } // IsParamError 检查是否是参数相关错误 func (e *ZhichaError) IsParamError() bool { return e.Code == "302" || e.Code == "303" || e.Code == "305" || e.Code == "306" || e.Code == "307" || e.Code == "316" || e.Code == "317" } // IsServiceError 检查是否是服务相关错误 func (e *ZhichaError) IsServiceError() bool { return e.Code == "308" || e.Code == "309" || e.Code == "310" || e.Code == "311" } // IsUserError 检查是否是用户相关错误 func (e *ZhichaError) IsUserError() bool { return e.Code == "312" || e.Code == "313" || e.Code == "314" || e.Code == "315" } // 预定义错误常量 var ( // 成功状态 ErrSuccess = &ZhichaError{Code: "200", Message: "请求成功"} ErrNoRecord = &ZhichaError{Code: "201", Message: "查询无记录"} // 业务参数错误 ErrBusinessParamMissing = &ZhichaError{Code: "302", Message: "业务参数缺失"} ErrParamError = &ZhichaError{Code: "303", Message: "参数错误"} ErrHeaderParamMissing = &ZhichaError{Code: "304", Message: "请求头参数缺失"} ErrNameError = &ZhichaError{Code: "305", Message: "姓名错误"} ErrPhoneError = &ZhichaError{Code: "306", Message: "手机号错误"} ErrIDCardError = &ZhichaError{Code: "307", Message: "身份证号错误"} // 服务相关错误 ErrServiceNotExist = &ZhichaError{Code: "308", Message: "服务不存在"} ErrServiceNotEnabled = &ZhichaError{Code: "309", Message: "服务未开通"} ErrInsufficientBalance = &ZhichaError{Code: "310", Message: "余额不足"} ErrRemoteDataError = &ZhichaError{Code: "311", Message: "调用远程数据异常"} // 用户相关错误 ErrUserNotExist = &ZhichaError{Code: "312", Message: "用户不存在"} ErrUserStatusError = &ZhichaError{Code: "313", Message: "用户状态异常"} ErrUserUnauthorized = &ZhichaError{Code: "314", Message: "用户未授权"} ErrWhitelistError = &ZhichaError{Code: "315", Message: "白名单错误"} // 时间戳和认证错误 ErrTimestampInvalid = &ZhichaError{Code: "316", Message: "timestamp不合法"} ErrTimestampExpired = &ZhichaError{Code: "317", Message: "timestamp已过期"} ErrSignVerifyFailed = &ZhichaError{Code: "318", Message: "验签失败"} ErrDecryptFailed = &ZhichaError{Code: "319", Message: "解密失败"} ErrUnauthorized = &ZhichaError{Code: "320", Message: "未授权"} // 系统错误 ErrSystemError = &ZhichaError{Code: "500", Message: "系统异常,请联系管理员"} ) // NewZhichaError 创建新的智查金控错误 func NewZhichaError(code, message string) *ZhichaError { return &ZhichaError{ Code: code, Message: message, } } // NewZhichaErrorFromCode 根据状态码创建错误 func NewZhichaErrorFromCode(code string) *ZhichaError { switch code { case "200": return ErrSuccess case "201": return ErrNoRecord case "302": return ErrBusinessParamMissing case "303": return ErrParamError case "304": return ErrHeaderParamMissing case "305": return ErrNameError case "306": return ErrPhoneError case "307": return ErrIDCardError case "308": return ErrServiceNotExist case "309": return ErrServiceNotEnabled case "310": return ErrInsufficientBalance case "311": return ErrRemoteDataError case "312": return ErrUserNotExist case "313": return ErrUserStatusError case "314": return ErrUserUnauthorized case "315": return ErrWhitelistError case "316": return ErrTimestampInvalid case "317": return ErrTimestampExpired case "318": return ErrSignVerifyFailed case "319": return ErrDecryptFailed case "320": return ErrUnauthorized case "500": return ErrSystemError default: return &ZhichaError{ Code: code, Message: "未知错误", } } } // IsZhichaError 检查是否是智查金控错误 func IsZhichaError(err error) bool { _, ok := err.(*ZhichaError) return ok } // GetZhichaError 获取智查金控错误 func GetZhichaError(err error) *ZhichaError { if zhichaErr, ok := err.(*ZhichaError); ok { return zhichaErr } return nil }