更新
This commit is contained in:
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user