feat: 更新钱包充值逻辑,自动处理充值订单支付,模拟支付成功返回

This commit is contained in:
2025-12-31 12:00:38 +08:00
parent a6b870bc8f
commit 95bc5bdb5d
2 changed files with 53 additions and 36 deletions

View File

@@ -234,8 +234,17 @@ func (s *order) payWithBalance(ctx context.Context, o *models.Order) (*transacti
func (s *order) settleOrder(ctx context.Context, o *models.Order, method, externalID string) error {
var tenantOwnerID int64
err := models.Q.Transaction(func(tx *models.Query) error {
// 1. Deduct User Balance (Only for balance method)
if method == "balance" {
// 1. Handle Balance Updates
if o.Type == consts.OrderTypeRecharge {
// Income: Recharge (Credit User Balance)
_, err := tx.User.WithContext(ctx).
Where(tx.User.ID.Eq(o.UserID)).
Update(tx.User.Balance, gorm.Expr("balance + ?", o.AmountPaid))
if err != nil {
return err
}
} else if method == "balance" {
// Expense: Purchase with Balance (Deduct User Balance)
info, err := tx.User.WithContext(ctx).
Where(tx.User.ID.Eq(o.UserID), tx.User.Balance.Gte(o.AmountPaid)).
Update(tx.User.Balance, gorm.Expr("balance - ?", o.AmountPaid))
@@ -283,7 +292,8 @@ func (s *order) settleOrder(ctx context.Context, o *models.Order, method, extern
}
}
// 4. Create Tenant Ledger (Revenue)
// 4. Create Tenant Ledger (Revenue) - Only for Content Purchase
if o.Type == consts.OrderTypeContentPurchase {
t, err := tx.Tenant.WithContext(ctx).Where(tx.Tenant.ID.Eq(o.TenantID)).First()
if err != nil {
return err
@@ -320,6 +330,7 @@ func (s *order) settleOrder(ctx context.Context, o *models.Order, method, extern
if err := tx.TenantLedger.WithContext(ctx).Create(ledger); err != nil {
return err
}
}
return nil
})

View File

@@ -96,9 +96,15 @@ func (s *wallet) Recharge(
return nil, errorx.ErrDatabaseError.WithCause(err)
}
// MOCK: Automatically pay for recharge order to close the loop
// In production, this would be a callback from payment gateway
if err := Order.ProcessExternalPayment(ctx, cast.ToString(order.ID), "mock_auto_pay"); err != nil {
return nil, err
}
// Mock Pay Params
return &user_dto.RechargeResponse{
PayParams: "mock_recharge_url",
PayParams: "mock_paid_success",
OrderID: cast.ToString(order.ID),
}, nil
}