diff --git a/modules/EasyAbp.EShop.Orders/src/EasyAbp.EShop.Orders.Domain/EasyAbp/EShop/Orders/Orders/IOrderPaymentChecker.cs b/modules/EasyAbp.EShop.Orders/src/EasyAbp.EShop.Orders.Domain/EasyAbp/EShop/Orders/Orders/IOrderPaymentChecker.cs index af1eeb93..6a8ed084 100644 --- a/modules/EasyAbp.EShop.Orders/src/EasyAbp.EShop.Orders.Domain/EasyAbp/EShop/Orders/Orders/IOrderPaymentChecker.cs +++ b/modules/EasyAbp.EShop.Orders/src/EasyAbp.EShop.Orders.Domain/EasyAbp/EShop/Orders/Orders/IOrderPaymentChecker.cs @@ -5,6 +5,6 @@ namespace EasyAbp.EShop.Orders.Orders { public interface IOrderPaymentChecker { - Task IsValidPaymentAsync(Order order, PaymentEto paymentEto); + Task IsValidPaymentAsync(Order order, PaymentEto payment, PaymentItemEto paymentItem); } } \ No newline at end of file diff --git a/modules/EasyAbp.EShop.Orders/src/EasyAbp.EShop.Orders.Domain/EasyAbp/EShop/Orders/Orders/OrderPaymentChecker.cs b/modules/EasyAbp.EShop.Orders/src/EasyAbp.EShop.Orders.Domain/EasyAbp/EShop/Orders/Orders/OrderPaymentChecker.cs index ba6dbd75..ce65496e 100644 --- a/modules/EasyAbp.EShop.Orders/src/EasyAbp.EShop.Orders.Domain/EasyAbp/EShop/Orders/Orders/OrderPaymentChecker.cs +++ b/modules/EasyAbp.EShop.Orders/src/EasyAbp.EShop.Orders.Domain/EasyAbp/EShop/Orders/Orders/OrderPaymentChecker.cs @@ -8,12 +8,27 @@ namespace EasyAbp.EShop.Orders.Orders { public class OrderPaymentChecker : IOrderPaymentChecker, ITransientDependency { - public Task IsValidPaymentAsync(Order order, PaymentEto paymentEto) + public virtual async Task IsValidPaymentAsync(Order order, PaymentEto payment, PaymentItemEto paymentItem) { - return Task.FromResult( - Guid.TryParse(paymentEto.GetProperty("StoreId"), out var paymentStoreId) && - order.StoreId == paymentStoreId - ); + return await IsStoreIdCorrectAsync(order, payment) && + await IsPaymentPriceCorrectAsync(order, paymentItem) && + await IsUserAllowedToPayAsync(order, payment); + } + + protected virtual Task IsStoreIdCorrectAsync(Order order, PaymentEto payment) + { + return Task.FromResult(Guid.TryParse(payment.GetProperty("StoreId"), out var paymentStoreId) && + order.StoreId == paymentStoreId); + } + + protected virtual Task IsPaymentPriceCorrectAsync(Order order, PaymentItemEto paymentItem) + { + return Task.FromResult(order.TotalPrice == paymentItem.OriginalPaymentAmount); + } + + protected virtual Task IsUserAllowedToPayAsync(Order order, PaymentEto payment) + { + return Task.FromResult(order.CustomerUserId == payment.UserId); } } } \ No newline at end of file diff --git a/modules/EasyAbp.EShop.Orders/src/EasyAbp.EShop.Orders.Domain/EasyAbp/EShop/Orders/Orders/OrderPaymentCompletedEventHandler.cs b/modules/EasyAbp.EShop.Orders/src/EasyAbp.EShop.Orders.Domain/EasyAbp/EShop/Orders/Orders/OrderPaymentCompletedEventHandler.cs index 73e6b08b..67e67ea6 100644 --- a/modules/EasyAbp.EShop.Orders/src/EasyAbp.EShop.Orders.Domain/EasyAbp/EShop/Orders/Orders/OrderPaymentCompletedEventHandler.cs +++ b/modules/EasyAbp.EShop.Orders/src/EasyAbp.EShop.Orders.Domain/EasyAbp/EShop/Orders/Orders/OrderPaymentCompletedEventHandler.cs @@ -43,7 +43,7 @@ namespace EasyAbp.EShop.Orders.Orders var order = await _orderRepository.FindAsync(item.ItemKey); if (order == null || order.PaidTime.HasValue || - !await _orderPaymentChecker.IsValidPaymentAsync(order, eventData.Entity)) + !await _orderPaymentChecker.IsValidPaymentAsync(order, eventData.Entity, item)) { continue; } diff --git a/modules/EasyAbp.EShop.Orders/src/EasyAbp.EShop.Orders.Domain/EasyAbp/EShop/Orders/Orders/OrderPaymentCreatedEventHandler.cs b/modules/EasyAbp.EShop.Orders/src/EasyAbp.EShop.Orders.Domain/EasyAbp/EShop/Orders/Orders/OrderPaymentCreatedEventHandler.cs index 8eb12f28..d7a55b39 100644 --- a/modules/EasyAbp.EShop.Orders/src/EasyAbp.EShop.Orders.Domain/EasyAbp/EShop/Orders/Orders/OrderPaymentCreatedEventHandler.cs +++ b/modules/EasyAbp.EShop.Orders/src/EasyAbp.EShop.Orders.Domain/EasyAbp/EShop/Orders/Orders/OrderPaymentCreatedEventHandler.cs @@ -34,7 +34,7 @@ namespace EasyAbp.EShop.Orders.Orders var order = await _orderRepository.FindAsync(item.ItemKey); if (order == null || order.PaymentId.HasValue || - !await _orderPaymentChecker.IsValidPaymentAsync(order, eventData.Entity)) + !await _orderPaymentChecker.IsValidPaymentAsync(order, eventData.Entity, item)) { continue; }