package haiyuapi import ( "errors" "fmt" ) // 海宇API平台返回码 const ( CodeSuccess = 0 // 业务成功 CodeQueryEmpty = 1000 // 查询为空 CodeSystem = 1001 // 接口异常 CodeDecryptFail = 1002 // 参数解密失败 CodeRequestParam = 1003 // 基础参数校验不正确 CodeInvalidIP = 1004 // 未经授权的IP CodeMissingAccessID = 1005 // 缺少Access-Id CodeInvalidAccessID = 1006 // 未经授权的AccessId CodeInsufficientBalance = 1007 // 账户余额不足,无法请求 CodeProductNotSubscribed = 1008 // 未开通此产品 CodeBusiness = 2001 // 业务失败 ) var ( ErrDatasource = errors.New("数据源异常") ErrSystem = errors.New("系统异常") ErrNotFound = errors.New("查询为空") ) // haiyuapiAPIError 海宇API平台错误 type haiyuapiAPIError struct { Code int Message string } func (e *haiyuapiAPIError) Error() string { return fmt.Sprintf("海宇API返回错误,code: %d,message: %s", e.Code, e.Message) } // NewHaiyuapiAPIError 创建平台错误 func NewHaiyuapiAPIError(code int, message string) *haiyuapiAPIError { if message == "" { if desc := GetPlatformCodeDesc(code); desc != "" { message = desc } else { message = "海宇API返回未知错误" } } return &haiyuapiAPIError{Code: code, Message: message} } // platformCodeDesc 平台 code -> 官方 message var platformCodeDesc = map[int]string{ CodeSuccess: "业务成功", CodeQueryEmpty: "查询为空", CodeSystem: "接口异常", CodeDecryptFail: "参数解密失败", CodeRequestParam: "基础参数校验不正确", CodeInvalidIP: "未经授权的IP", CodeMissingAccessID: "缺少Access-Id", CodeInvalidAccessID: "未经授权的AccessId", CodeInsufficientBalance: "账户余额不足,无法请求", CodeProductNotSubscribed: "未开通此产品", CodeBusiness: "业务失败", } // GetPlatformCodeDesc 根据平台 code 获取描述 func GetPlatformCodeDesc(code int) string { if desc, ok := platformCodeDesc[code]; ok { return desc } return "" } // GetErrByCode 将海宇API code 映射为内部哨兵错误,供处理器 errors.Is 判断 // // 1000 -> ErrNotFound(查询为空,可按产品约定当成功处理) // 1001, 1002, 1003 -> ErrSystem(接口/解密/参数校验异常) // 1004~1008, 2001 -> ErrDatasource(鉴权、余额、产品、业务类上游错误) func GetErrByCode(code int) error { switch code { case CodeSuccess: return nil case CodeQueryEmpty: return ErrNotFound case CodeSystem, CodeDecryptFail, CodeRequestParam: return ErrSystem case CodeInvalidIP, CodeMissingAccessID, CodeInvalidAccessID, CodeInsufficientBalance, CodeProductNotSubscribed, CodeBusiness: return ErrDatasource default: return ErrDatasource } }