DanalConfirm.cs 7.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196
  1. using System.ComponentModel.DataAnnotations;
  2. using System.ComponentModel.DataAnnotations.Schema;
  3. using Domain.Entities.Members;
  4. using Domain.Entities.Payments.ValueObject;
  5. namespace Domain.Entities.Payments.Danal;
  6. /// <summary>
  7. /// 다날 결제 승인 요청 + 응답 통합
  8. /// confirm API 호출 시 요청 데이터를 먼저 저장하고, 응답 수신 시 업데이트
  9. /// </summary>
  10. public class DanalConfirm
  11. {
  12. [ForeignKey(nameof(MemberID))]
  13. public virtual Member? Member { get; private set; }
  14. [ForeignKey(nameof(PaymentOrderID))]
  15. public virtual PaymentOrder? PaymentOrder { get; private set; }
  16. [Key]
  17. public int ID { get; private set; }
  18. public int MemberID { get; private set; }
  19. public int PaymentOrderID { get; private set; }
  20. public PaymentMethod Method { get; private set; }
  21. /// <summary>다날 거래번호</summary>
  22. public string TransactionID { get; private set; } = default!;
  23. /// <summary>가맹점 주문번호</summary>
  24. public string OrderID { get; private set; } = default!;
  25. /// <summary>요청 금액</summary>
  26. public int Amount { get; private set; }
  27. /// <summary>CPID</summary>
  28. public string MerchantID { get; private set; } = default!;
  29. /// <summary>도서문화상품권: 승인 요청 토큰</summary>
  30. public string? CertificateToken { get; private set; }
  31. // ── 응답 필드 (승인 완료 시 업데이트) ────────────────────────────
  32. /// <summary>응답 코드 (0000 = 성공)</summary>
  33. public string? ResponseCode { get; private set; }
  34. /// <summary>응답 메시지</summary>
  35. public string? ResponseMessage { get; private set; }
  36. /// <summary>승인된 상품명</summary>
  37. public string? OrderName { get; private set; }
  38. /// <summary>최종 승인 금액</summary>
  39. public int? TotalAmount { get; private set; }
  40. /// <summary>할인 금액</summary>
  41. public int? DiscountAmount { get; private set; }
  42. /// <summary>사용자 이름</summary>
  43. public string? UserName { get; private set; }
  44. // ── 카드 응답 ────────────────────────────────────────────────────
  45. /// <summary>승인일자 (YYYYMMDD)</summary>
  46. public string? TransDate { get; private set; }
  47. /// <summary>승인시간</summary>
  48. public string? TransTime { get; private set; }
  49. /// <summary>카드사 코드</summary>
  50. public string? CardCode { get; private set; }
  51. /// <summary>카드사 이름</summary>
  52. public string? CardName { get; private set; }
  53. /// <summary>카드번호 (마스킹)</summary>
  54. public string? CardNo { get; private set; }
  55. /// <summary>할부 개월 수 (0=일시불)</summary>
  56. public byte? InstallmentMonths { get; private set; }
  57. /// <summary>승인번호</summary>
  58. public string? ApproveNo { get; private set; }
  59. // ── 휴대폰 응답 ─────────────────────────────────────────────────
  60. /// <summary>결제 승인 일시</summary>
  61. public string? ApprovalDateTime { get; private set; }
  62. /// <summary>정기 결제 시 사용하는 키</summary>
  63. public string? AuthKey { get; private set; }
  64. // ── 계좌이체 응답 ────────────────────────────────────────────────
  65. /// <summary>출금계좌 뒷자리</summary>
  66. public string? AccountNumber { get; private set; }
  67. /// <summary>은행 코드</summary>
  68. public string? BankCode { get; private set; }
  69. /// <summary>구매자 ID</summary>
  70. public string? UserId { get; private set; }
  71. /// <summary>구매자 이메일</summary>
  72. public string? UserEmail { get; private set; }
  73. // ── 가상계좌 응답 ────────────────────────────────────────────────
  74. /// <summary>입금은행 이름</summary>
  75. public string? BankName { get; private set; }
  76. /// <summary>입금 마감 날짜 (YYYYMMDD)</summary>
  77. public string? ExpireDate { get; private set; }
  78. /// <summary>입금 마감 시간</summary>
  79. public string? ExpireTime { get; private set; }
  80. /// <summary>가상계좌 번호</summary>
  81. public string? VirtualAccountNumber { get; private set; }
  82. /// <summary>현금영수증 설정 유무</summary>
  83. public string? UseCashReceipt { get; private set; }
  84. public DateTime CreatedAt { get; private set; } = DateTime.UtcNow;
  85. public DateTime? UpdatedAt { get; private set; }
  86. private DanalConfirm() { }
  87. /// <summary>승인 요청 시 생성 (응답 전)</summary>
  88. public static DanalConfirm CreateRequest(
  89. int memberID,
  90. int paymentOrderID,
  91. PaymentMethod method,
  92. string transactionID,
  93. string orderID,
  94. int amount,
  95. string merchantID,
  96. string? certificateToken = null
  97. ) {
  98. return new DanalConfirm
  99. {
  100. MemberID = memberID,
  101. PaymentOrderID = paymentOrderID,
  102. Method = method,
  103. TransactionID = transactionID,
  104. OrderID = orderID,
  105. Amount = amount,
  106. MerchantID = merchantID,
  107. CertificateToken = certificateToken
  108. };
  109. }
  110. /// <summary>승인 응답 수신 시 업데이트</summary>
  111. public void SetResponse(
  112. string code, string message, string? orderName = null,
  113. int? totalAmount = null, int? discountAmount = null, string? userName = null,
  114. string? transDate = null, string? transTime = null,
  115. string? cardCode = null, string? cardName = null, string? cardNo = null,
  116. byte? installmentMonths = null, string? approveNo = null,
  117. string? approvalDateTime = null, string? authKey = null,
  118. string? accountNumber = null, string? bankCode = null, string? userId = null, string? userEmail = null,
  119. string? bankName = null, string? expireDate = null, string? expireTime = null,
  120. string? virtualAccountNumber = null, string? useCashReceipt = null
  121. ) {
  122. ResponseCode = code;
  123. ResponseMessage = message;
  124. OrderName = orderName;
  125. TotalAmount = totalAmount;
  126. DiscountAmount = discountAmount;
  127. UserName = userName;
  128. TransDate = transDate;
  129. TransTime = transTime;
  130. CardCode = cardCode;
  131. CardName = cardName;
  132. CardNo = cardNo;
  133. InstallmentMonths = installmentMonths;
  134. ApproveNo = approveNo;
  135. ApprovalDateTime = approvalDateTime;
  136. AuthKey = authKey;
  137. AccountNumber = accountNumber;
  138. BankCode = bankCode;
  139. UserId = userId;
  140. UserEmail = userEmail;
  141. BankName = bankName;
  142. ExpireDate = expireDate;
  143. ExpireTime = expireTime;
  144. VirtualAccountNumber = virtualAccountNumber;
  145. UseCashReceipt = useCashReceipt;
  146. UpdatedAt = DateTime.UtcNow;
  147. }
  148. public bool IsSuccess => ResponseCode == "0000";
  149. }