diff --git a/hb/errors.go b/hb/errors.go new file mode 100644 index 0000000..52fac86 --- /dev/null +++ b/hb/errors.go @@ -0,0 +1,78 @@ +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 "未知错误码" +} \ No newline at end of file