Handler.cs 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344
  1. using Application.Abstractions.Data;
  2. using Application.Abstractions.Messaging;
  3. using Application.Abstractions.Payment;
  4. using Domain.Entities.Payments;
  5. using Microsoft.Extensions.Options;
  6. using SharedKernel;
  7. namespace Application.Features.Api.Payment.CreateOrder;
  8. internal sealed class Handler(
  9. IAppDbContext db,
  10. IDanalPayService danalPay,
  11. IOptions<AppSettings> options
  12. ) : IQueryHandler<Command, Response>
  13. {
  14. public async Task<Response> Handle(Command r, CancellationToken ct)
  15. {
  16. var settings = options.Value;
  17. var baseUrl = settings.App.FrontURL?.TrimEnd('/') ?? settings.App.BaseURL?.TrimEnd('/') ?? "https://localhost:3000";
  18. // 주문번호 생성
  19. var orderID = $"DPOT-{DateTime.UtcNow:yyyyMMddHHmmss}-{r.MemberID}-{Random.Shared.Next(1000, 9999)}";
  20. // 다날 클라이언트 설정 (CPID 획득)
  21. var config = await danalPay.GetClientConfigAsync(ct);
  22. // 엔티티 생성
  23. var order = PaymentOrder.Create(r.MemberID, orderID, config.MerchantID, r.Amount, r.PaymentMethod);
  24. await db.PaymentOrder.AddAsync(order);
  25. await db.SaveChangesAsync(ct);
  26. return new Response(
  27. orderID,
  28. config.ClientKey,
  29. config.MerchantID,
  30. order.Amount,
  31. order.PointAmount,
  32. order.VatAmount,
  33. $"{baseUrl}/api/payment/success?orderId={orderID}",
  34. $"{baseUrl}/api/payment/fail?orderId={orderID}"
  35. );
  36. }
  37. }