diff --git a/internal/service/order/service.go b/internal/service/order/service.go index c529775..893b630 100644 --- a/internal/service/order/service.go +++ b/internal/service/order/service.go @@ -25,6 +25,12 @@ import ( "gorm.io/gorm" ) +// WechatConfigServiceInterface 支付配置服务接口 +// 用于查询当前生效的支付配置 +type WechatConfigServiceInterface interface { + GetActiveConfig(ctx context.Context) (*model.WechatConfig, error) +} + type Service struct { db *gorm.DB redis *redis.Client @@ -40,6 +46,7 @@ type Service struct { packageSeriesStore *postgres.PackageSeriesStore packageUsageStore *postgres.PackageUsageStore packageStore *postgres.PackageStore + wechatConfigService WechatConfigServiceInterface wechatPayment wechat.PaymentServiceInterface queueClient *queue.Client logger *zap.Logger @@ -60,6 +67,7 @@ func New( packageSeriesStore *postgres.PackageSeriesStore, packageUsageStore *postgres.PackageUsageStore, packageStore *postgres.PackageStore, + wechatConfigService WechatConfigServiceInterface, wechatPayment wechat.PaymentServiceInterface, queueClient *queue.Client, logger *zap.Logger, @@ -79,6 +87,7 @@ func New( packageSeriesStore: packageSeriesStore, packageUsageStore: packageUsageStore, packageStore: packageStore, + wechatConfigService: wechatConfigService, wechatPayment: wechatPayment, queueClient: queueClient, logger: logger, @@ -543,6 +552,18 @@ func (s *Service) CreateAdminOrder(ctx context.Context, req *dto.CreateAdminOrde return nil, errors.New(errors.CodeInvalidParam, "后台仅支持钱包支付或线下支付") } + // 查询当前生效的支付配置 + var paymentConfigID *uint + if req.PaymentMethod == model.PaymentMethodWechat || req.PaymentMethod == model.PaymentMethodAlipay { + activeConfig, err := s.wechatConfigService.GetActiveConfig(ctx) + if err != nil { + s.logger.Warn("查询生效支付配置失败", zap.Error(err)) + } + if activeConfig != nil { + paymentConfigID = &activeConfig.ID + } + } + order := &model.Order{ BaseModel: model.BaseModel{ Creator: userID, @@ -568,6 +589,7 @@ func (s *Service) CreateAdminOrder(ctx context.Context, req *dto.CreateAdminOrde OperatorType: operatorType, ActualPaidAmount: actualPaidAmount, PurchaseRole: purchaseRole, + PaymentConfigID: paymentConfigID, } items := s.buildOrderItems(userID, validationResult.Packages) @@ -775,6 +797,18 @@ func (s *Service) CreateH5Order(ctx context.Context, req *dto.CreateOrderRequest } } + // 查询当前生效的支付配置 + var h5PaymentConfigID *uint + if req.PaymentMethod == model.PaymentMethodWechat || req.PaymentMethod == model.PaymentMethodAlipay { + activeConfig, err := s.wechatConfigService.GetActiveConfig(ctx) + if err != nil { + s.logger.Warn("查询生效支付配置失败", zap.Error(err)) + } + if activeConfig != nil { + h5PaymentConfigID = &activeConfig.ID + } + } + order := &model.Order{ BaseModel: model.BaseModel{ Creator: userID, @@ -801,6 +835,7 @@ func (s *Service) CreateH5Order(ctx context.Context, req *dto.CreateOrderRequest ActualPaidAmount: actualPaidAmount, PurchaseRole: purchaseRole, ExpiresAt: expiresAt, + PaymentConfigID: h5PaymentConfigID, } items := s.buildOrderItems(userID, validationResult.Packages) @@ -2056,6 +2091,7 @@ func (s *Service) buildOrderResponse(order *model.Order, items []*model.OrderIte } // WechatPayJSAPI 发起微信 JSAPI 支付 +// TODO: 从 payment_config_id 加载配置动态创建 Payment 实例,替代 s.wechatPayment 单例 func (s *Service) WechatPayJSAPI(ctx context.Context, orderID uint, openID string, buyerType string, buyerID uint) (*dto.WechatPayJSAPIResponse, error) { if s.wechatPayment == nil { s.logger.Error("微信支付服务未配置") @@ -2111,6 +2147,7 @@ func (s *Service) WechatPayJSAPI(ctx context.Context, orderID uint, openID strin } // WechatPayH5 发起微信 H5 支付 +// TODO: 从 payment_config_id 加载配置动态创建 Payment 实例,替代 s.wechatPayment 单例 func (s *Service) WechatPayH5(ctx context.Context, orderID uint, sceneInfo *dto.WechatH5SceneInfo, buyerType string, buyerID uint) (*dto.WechatPayH5Response, error) { if s.wechatPayment == nil { s.logger.Error("微信支付服务未配置") @@ -2301,3 +2338,15 @@ func (s *Service) GetPurchaseCheck(ctx context.Context, req *dto.PurchaseCheckRe return response, nil } + +// FuiouPayJSAPI 富友公众号 JSAPI 支付发起(留桩) +// TODO: 实现富友支付发起逻辑 +func (s *Service) FuiouPayJSAPI(ctx context.Context, orderID uint, openID string, buyerType string, buyerID uint) error { + return errors.New(errors.CodeFuiouPayFailed, "富友支付发起暂未实现") +} + +// FuiouPayMiniApp 富友小程序支付发起(留桩) +// TODO: 实现富友小程序支付发起逻辑 +func (s *Service) FuiouPayMiniApp(ctx context.Context, orderID uint, openID string, buyerType string, buyerID uint) error { + return errors.New(errors.CodeFuiouPayFailed, "富友小程序支付发起暂未实现") +} diff --git a/internal/service/recharge/service.go b/internal/service/recharge/service.go index c17efd5..bda213b 100644 --- a/internal/service/recharge/service.go +++ b/internal/service/recharge/service.go @@ -28,6 +28,11 @@ type ForceRechargeRequirement struct { FirstCommissionPaid bool `json:"first_commission_paid"` // 一次性佣金是否已发放 } +// WechatConfigServiceInterface 支付配置服务接口 +type WechatConfigServiceInterface interface { + GetActiveConfig(ctx context.Context) (*model.WechatConfig, error) +} + // Service 充值服务 // 负责资产钱包(IoT卡/设备)的充值订单创建、预检、支付回调处理等业务逻辑 type Service struct { @@ -40,6 +45,7 @@ type Service struct { shopSeriesAllocationStore *postgres.ShopSeriesAllocationStore packageSeriesStore *postgres.PackageSeriesStore commissionRecordStore *postgres.CommissionRecordStore + wechatConfigService WechatConfigServiceInterface logger *zap.Logger } @@ -54,6 +60,7 @@ func New( shopSeriesAllocationStore *postgres.ShopSeriesAllocationStore, packageSeriesStore *postgres.PackageSeriesStore, commissionRecordStore *postgres.CommissionRecordStore, + wechatConfigService WechatConfigServiceInterface, logger *zap.Logger, ) *Service { return &Service{ @@ -66,6 +73,7 @@ func New( shopSeriesAllocationStore: shopSeriesAllocationStore, packageSeriesStore: packageSeriesStore, commissionRecordStore: commissionRecordStore, + wechatConfigService: wechatConfigService, logger: logger, } } @@ -114,7 +122,19 @@ func (s *Service) Create(ctx context.Context, req *dto.CreateRechargeRequest, us // 4. 生成充值订单号 rechargeNo := s.generateRechargeNo() - // 5. 创建充值订单 + // 5. 查询当前生效的支付配置 + var paymentConfigID *uint + if req.PaymentMethod == "wechat" || req.PaymentMethod == "alipay" { + activeConfig, err := s.wechatConfigService.GetActiveConfig(ctx) + if err != nil { + s.logger.Warn("查询生效支付配置失败", zap.Error(err)) + } + if activeConfig != nil { + paymentConfigID = &activeConfig.ID + } + } + + // 6. 创建充值订单 recharge := &model.AssetRechargeRecord{ UserID: userID, AssetWalletID: wallet.ID, @@ -123,6 +143,7 @@ func (s *Service) Create(ctx context.Context, req *dto.CreateRechargeRequest, us RechargeNo: rechargeNo, Amount: req.Amount, PaymentMethod: req.PaymentMethod, + PaymentConfigID: paymentConfigID, Status: constants.RechargeStatusPending, ShopIDTag: wallet.ShopIDTag, EnterpriseIDTag: wallet.EnterpriseIDTag, @@ -247,6 +268,7 @@ func (s *Service) List(ctx context.Context, req *dto.RechargeListRequest, userID // HandlePaymentCallback 支付回调处理 // 支持幂等性检查、事务处理、更新余额、触发佣金 +// TODO: 按 payment_config_id 加载配置验签(当前留桩,验签由外层处理) func (s *Service) HandlePaymentCallback(ctx context.Context, rechargeNo string, paymentMethod string, paymentTransactionID string) error { // 1. 查询充值订单 recharge, err := s.assetRechargeStore.GetByRechargeNo(ctx, rechargeNo)