This commit is contained in:
GukSang.Jin
2026-03-20 16:23:56 +08:00
parent 252dc17747
commit ac05493177
11 changed files with 580 additions and 143 deletions

View File

@@ -20,18 +20,25 @@ public class OrdersController : ControllerBase
[HttpPost]
public async Task<IActionResult> CreateOrder([FromBody] CreateOrderRequest request)
{
Order? order = null;
try
{
var order = await _orderService.CreateOrderAsync(request.PackageId);
var payment = await _weChatPayService.CreateNativePayAsync(order, HttpContext.RequestAborted);
return Ok(new CreateOrderResponse
order = await _orderService.GetLatestRetryableOrderAsync(request.PackageId);
if (order is not null && HasActivePayment(order))
{
Order = order,
CodeUrl = payment.CodeUrl,
OutTradeNo = payment.OutTradeNo,
ExpiresAt = payment.ExpiresAt
});
return Ok(ToCreateOrderResponse(order));
}
order ??= await _orderService.CreateOrderAsync(request.PackageId);
var payment = await _weChatPayService.CreateNativePayAsync(order, HttpContext.RequestAborted);
order = await _orderService.MarkPaymentReadyAsync(
order.Id,
payment.OutTradeNo,
payment.CodeUrl,
payment.ExpiresAt) ?? order;
return Ok(ToCreateOrderResponse(order));
}
catch (ArgumentException ex)
{
@@ -39,6 +46,11 @@ public class OrdersController : ControllerBase
}
catch (InvalidOperationException ex)
{
if (order != null)
{
await _orderService.MarkPaymentInitializationFailedAsync(order.Id, ex.Message);
}
return StatusCode(StatusCodes.Status502BadGateway, ex.Message);
}
}
@@ -52,20 +64,25 @@ public class OrdersController : ControllerBase
return NotFound();
}
if (HasActivePayment(order))
{
return Ok(ToCreateOrderResponse(order));
}
try
{
var payment = await _weChatPayService.CreateNativePayAsync(order, HttpContext.RequestAborted);
order = await _orderService.MarkPaymentReadyAsync(
order.Id,
payment.OutTradeNo,
payment.CodeUrl,
payment.ExpiresAt) ?? order;
return Ok(new CreateOrderResponse
{
Order = order,
CodeUrl = payment.CodeUrl,
OutTradeNo = payment.OutTradeNo,
ExpiresAt = payment.ExpiresAt
});
return Ok(ToCreateOrderResponse(order));
}
catch (InvalidOperationException ex)
{
await _orderService.MarkPaymentInitializationFailedAsync(order.Id, ex.Message);
return StatusCode(StatusCodes.Status502BadGateway, ex.Message);
}
}
@@ -96,6 +113,12 @@ public class OrdersController : ControllerBase
if (order.IsPaid)
{
if (order.Status == OrderStatus.Paid)
{
await _orderService.EnsureOpenDoorCommandDispatchedAsync(id);
order = await _orderService.GetOrderAsync(id) ?? order;
}
return Ok(new PaymentStatusResponse
{
Order = order,
@@ -149,6 +172,30 @@ public class OrdersController : ControllerBase
return Ok(order);
}
private static bool HasActivePayment(Order? order)
{
return order is
{
IsPaid: false,
Status: OrderStatus.WaitingPayment
} &&
!string.IsNullOrWhiteSpace(order.PaymentCodeUrl) &&
!string.IsNullOrWhiteSpace(order.OutTradeNo) &&
order.PaymentExpiresAt is not null &&
order.PaymentExpiresAt > DateTimeOffset.UtcNow;
}
private static CreateOrderResponse ToCreateOrderResponse(Order order)
{
return new CreateOrderResponse
{
Order = order,
CodeUrl = order.PaymentCodeUrl,
OutTradeNo = order.OutTradeNo,
ExpiresAt = order.PaymentExpiresAt
};
}
}
public record CreateOrderRequest(int PackageId);