package hb import "fmt" // Error 自定义错误类型 type Error struct { Code string `json:"code"` Message string `json:"message"` Err error `json:"-"` } func (e *Error) Error() string { if e.Err != nil { return fmt.Sprintf("[%s] %s: %v", e.Code, e.Message, e.Err) } return fmt.Sprintf("[%s] %s", e.Code, e.Message) } func (e *Error) Unwrap() error { return e.Err } // NewError 创建新的错误 func NewError(code, message string, err error) *Error { return &Error{ Code: code, Message: message, Err: err, } } // 预定义错误 var ( ErrSignTypeInvalid = NewError("SIGN_TYPE_INVALID", "不支持的签名方式,仅支持 MD5 或 RSA", nil) ErrSignVerifyFailed = NewError("SIGN_VERIFY_FAILED", "签名验证失败", nil) ErrPrivateKeyInvalid = NewError("PRIVATE_KEY_INVALID", "私钥格式无效", nil) ErrPublicKeyInvalid = NewError("PUBLIC_KEY_INVALID", "公钥格式无效", nil) ErrNetwork = NewError("NETWORK_ERROR", "网络请求失败", nil) ErrResponseParse = NewError("RESPONSE_PARSE_ERROR", "响应解析失败", nil) ErrMerchantIdEmpty = NewError("MERCHANT_ID_EMPTY", "商户编号不能为空", nil) ErrSignKeyEmpty = NewError("SIGN_KEY_EMPTY", "商户密钥不能为空", nil) ErrRequestIdEmpty = NewError("REQUEST_ID_EMPTY", "商户请求号不能为空", nil) ErrOrderIdEmpty = NewError("ORDER_ID_EMPTY", "商户订单号不能为空", nil) ErrAmountEmpty = NewError("AMOUNT_EMPTY", "退款金额不能为空", nil) ) // 错误码映射 var ErrorCodeMap = map[string]string{ "C01088": "退货金额域非法", "C01081": "产品名称域越界", "C01033": "产品名称域为空", "C01030": "有效期单位域不合法", "C01028": "有效期数量域为0", "C01027": "有效期数量域为空", "C01025": "订单日期域不合法", "C01024": "订单日期域为空", "C01019": "币种域取值不合法", "C01018": "币种域为空", "C01014": "订单金额域为空", "D99981": "订单已过期", "D23190": "退款日期超过最大有效期", "D22407": "退款金额大于可退款金额", "D22401": "退货金额大于可退货金额", "D22208": "订单状态异常", "D22201": "订单不存在", "D22224": "账户支付方式不正确", "D77040": "商户没有开通此类交易的权限", "IPS0008": "签名不符,一般都是由于中文编码引起", "IPS0001": "一般都是因为商户编号或者密钥不对引起", } // GetErrorDescription 根据错误码获取错误描述 func GetErrorDescription(code string) string { if desc, ok := ErrorCodeMap[code]; ok { return desc } return "未知错误码" }