示例#1
0
        // TODO:
        // 이 로직은 비지니스 로직을 담고 있습니다.
        // 비즈니스 레이어로 옮기는 것이 좋습니다.
        private async Task RefreshPaymentAsync(AspNetCore.Models.Payment payment)
        {
            var iamportPayment = await paymentsApi.GetByTransactionIdAsync(payment.TransactionId);

            if (iamportPayment == null)
            {
                throw new InvalidOperationException("Failed to get payment information from Iamport.");
            }

            // 기존 상태(payment.State)와 최신 상태(iamportPayment.Status)를 비교합니다.
            switch (iamportPayment.Status)
            {
            case PaymentStatus.Ready:
                if (iamportPayment.Method == PaymentMethod.VirtualBank &&
                    !string.IsNullOrEmpty(iamportPayment.VirtualBankAccount))
                {
                    payment.SetAwatingForVirtualBank(
                        iamportPayment.IamportId,
                        iamportPayment.PaymentGatewayTransactionId,
                        iamportPayment.VirtualBankName,
                        iamportPayment.VirtualBankAccount,
                        iamportPayment.VirtualBankAccountHolder);
                }
                else
                {
                    payment.SetInProgress(iamportPayment.IamportId);
                }
                break;

            case PaymentStatus.Paid:
                switch (iamportPayment.Method)
                {
                case PaymentMethod.CreditCard:
                    payment.SetPaidForCreditCard(
                        iamportPayment.IamportId,
                        iamportPayment.PaidAtUtc,
                        iamportPayment.PaymentGatewayTransactionId,
                        iamportPayment.ApplyNumber,
                        iamportPayment.CreditCardCompanyName,
                        iamportPayment.InstallmentPlanPeriod);
                    break;

                case PaymentMethod.VirtualBank:
                    payment.SetPaiedForVirtualBank(
                        iamportPayment.IamportId,
                        iamportPayment.PaidAtUtc,
                        iamportPayment.PaymentGatewayTransactionId,
                        iamportPayment.VirtualBankName,
                        iamportPayment.VirtualBankAccount,
                        iamportPayment.VirtualBankAccountHolder);
                    break;

                case PaymentMethod.Transfer:
                case PaymentMethod.Mobile:
                case PaymentMethod.CultureLand:
                case PaymentMethod.SmartCulture:
                case PaymentMethod.HappyMoney:
                default:
                    payment.SetPaidForOthers(
                        iamportPayment.IamportId,
                        iamportPayment.PaidAtUtc,
                        iamportPayment.PaymentGatewayTransactionId);
                    break;
                }
                break;

            case PaymentStatus.Cancelled:
                payment.SetCancelled(
                    iamportPayment.IamportId,
                    iamportPayment.CancelledAtUtc,
                    iamportPayment.CancelledReason,
                    iamportPayment.CancelledAmount);
                break;

            case PaymentStatus.Failed:
                payment.SetFailed(
                    iamportPayment.IamportId,
                    iamportPayment.FailedAtUtc,
                    iamportPayment.FailedReason);
                break;

            default:
                break;
            }
            paymentRepository.Update(payment);
        }