From 860f589b9a544f9caac513c48873f39c4c90c3c2 Mon Sep 17 00:00:00 2001 From: huang Date: Fri, 22 May 2026 15:54:54 +0800 Subject: [PATCH] =?UTF-8?q?=E9=94=99=E8=AF=AF=E6=8F=90=E7=A4=BA=E6=9C=89?= =?UTF-8?q?=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pkg/alipay/client.go | 16 +++++++++------- pkg/alipay/wap.go | 4 ++-- pkg/errors/handler.go | 19 +++++++++++-------- 3 files changed, 22 insertions(+), 17 deletions(-) diff --git a/pkg/alipay/client.go b/pkg/alipay/client.go index 9217e08..1a4e5e4 100644 --- a/pkg/alipay/client.go +++ b/pkg/alipay/client.go @@ -1,35 +1,37 @@ package alipay import ( - "fmt" - "github.com/smartwalle/alipay/v3" "github.com/break/junhong_cmp_fiber/internal/model" + apperrors "github.com/break/junhong_cmp_fiber/pkg/errors" ) // NewClientFromConfig 从 WechatConfig 构建支付宝 SDK client。 // 校验 ali_app_id、ali_private_key、ali_public_key 必须非空。 // ali_production=true 时使用生产环境,否则使用沙箱环境。 func NewClientFromConfig(cfg *model.WechatConfig) (*alipay.Client, error) { + if cfg == nil { + return nil, apperrors.New(apperrors.CodeNoPaymentConfig, "支付宝配置缺失:未找到启用的支付配置") + } if cfg.AliAppID == "" { - return nil, fmt.Errorf("支付宝配置缺失:ali_app_id 不能为空") + return nil, apperrors.New(apperrors.CodeNoPaymentConfig, "支付宝配置缺失:ali_app_id 不能为空") } if cfg.AliPrivateKey == "" { - return nil, fmt.Errorf("支付宝配置缺失:ali_private_key 不能为空") + return nil, apperrors.New(apperrors.CodeNoPaymentConfig, "支付宝配置缺失:ali_private_key 不能为空") } if cfg.AliPublicKey == "" { - return nil, fmt.Errorf("支付宝配置缺失:ali_public_key 不能为空") + return nil, apperrors.New(apperrors.CodeNoPaymentConfig, "支付宝配置缺失:ali_public_key 不能为空") } client, err := alipay.New(cfg.AliAppID, cfg.AliPrivateKey, cfg.AliProduction) if err != nil { - return nil, fmt.Errorf("创建支付宝客户端失败: %w", err) + return nil, apperrors.Wrap(apperrors.CodeNoPaymentConfig, err, "支付宝配置不可用:创建客户端失败") } // 加载支付宝公钥(公钥模式验签) if err := client.LoadAliPayPublicKey(cfg.AliPublicKey); err != nil { - return nil, fmt.Errorf("加载支付宝公钥失败: %w", err) + return nil, apperrors.Wrap(apperrors.CodeNoPaymentConfig, err, "支付宝配置不可用:加载公钥失败") } return client, nil diff --git a/pkg/alipay/wap.go b/pkg/alipay/wap.go index fd7e516..793fb02 100644 --- a/pkg/alipay/wap.go +++ b/pkg/alipay/wap.go @@ -2,12 +2,12 @@ package alipay import ( "context" - "fmt" "time" "github.com/smartwalle/alipay/v3" "github.com/break/junhong_cmp_fiber/internal/model" + apperrors "github.com/break/junhong_cmp_fiber/pkg/errors" ) // BuildWapPayURL 生成支付宝手机网站支付 URL。 @@ -40,7 +40,7 @@ func BuildWapPayURL(ctx context.Context, cfg *model.WechatConfig, payment *model payURL, err := client.TradeWapPay(param) if err != nil { - return "", fmt.Errorf("生成支付宝 WAP 支付链接失败: %w", err) + return "", apperrors.Wrap(apperrors.CodeNoPaymentConfig, err, "支付宝配置不可用:生成支付链接失败") } return payURL.String(), nil diff --git a/pkg/errors/handler.go b/pkg/errors/handler.go index 5b56733..ce7b172 100644 --- a/pkg/errors/handler.go +++ b/pkg/errors/handler.go @@ -1,6 +1,7 @@ package errors import ( + stderrors "errors" "runtime/debug" "time" @@ -51,12 +52,14 @@ func handleError(c *fiber.Ctx, err error, logger *zap.Logger) error { var message string var httpStatus int - switch e := err.(type) { - case *AppError: + var appErr *AppError + var fiberErr *fiber.Error + switch { + case stderrors.As(err, &appErr): // 应用自定义错误 - code = e.Code - message = e.Message - httpStatus = GetHTTPStatus(e.Code) + code = appErr.Code + message = appErr.Message + httpStatus = GetHTTPStatus(appErr.Code) // 记录错误日志(包含完整上下文) logFields := append(errCtx.ToLogFields(), @@ -74,16 +77,16 @@ func handleError(c *fiber.Ctx, err error, logger *zap.Logger) error { safeLogWithLevel(logger, "warn", "客户端错误", logFields...) } - case *fiber.Error: + case stderrors.As(err, &fiberErr): // Fiber 框架错误 - httpStatus = e.Code + httpStatus = fiberErr.Code code = mapHTTPStatusToCode(httpStatus) message = GetMessage(code, "zh") safeLog(logger, "Fiber 框架错误", append(errCtx.ToLogFields(), zap.Int("http_status", httpStatus), - zap.String("fiber_message", e.Message), + zap.String("fiber_message", fiberErr.Message), )..., )