Example #1
0
        public async Task <PaymentWithXp> VoidOrRefundCardPayment(string orderID, PaymentWithXp payment)
        {
            var authorizationTransaction = GetLastSuccessfulTransactionOfType(PaymentTransactionType.Authorization, payment);

            if (authorizationTransaction == null)
            {
                return(payment);
            }
            var isCaptured = payment.Transactions.Any(x => x.Type == PaymentTransactionType.Capture.ToString());
            Func <FollowUpCCTransaction, OCIntegrationConfig, Task <CCTransactionResult> > reverseMethod;

            if (isCaptured)
            {
                reverseMethod = _creditCardProcessor.RefundCaptureAsync;
            }
            else
            {
                reverseMethod = _creditCardProcessor.VoidAuthorizationAsync;
            }

            var reverseTransactionResult = await reverseMethod(new FollowUpCCTransaction()
            {
                TransactionID = authorizationTransaction.ID,
                Amount        = authorizationTransaction.Amount ?? 0
            }, null);

            var type = isCaptured ? PaymentTransactionType.Refund : PaymentTransactionType.Void;

            var updatedPayment = await CreatePaymentTransaction(orderID, payment, type, reverseTransactionResult);

            return(updatedPayment);
        }
Example #2
0
        public async Task <PaymentWithXp> CreateCreditCardPaymentAsync(MeUserWithXp shopper, CreditCardPayment ccPayment)
        {
            PCISafeCardDetails safeCardDetails;

            if (ccPayment.CardDetails != null)
            {
                if (ccPayment.SaveCardDetailsForFutureUse)
                {
                    // entering a new CC and saving it
                    safeCardDetails = await _creditCardCommand.CreateSavedCardAsync(shopper, ccPayment.CardDetails);
                }
                else
                {
                    // one time use of CC
                    safeCardDetails = ccPayment.CardDetails;
                }
            }
            else if (ccPayment.SavedCardID != null)
            {
                // selecting a saved CC
                safeCardDetails = await _creditCardCommand.GetSavedCardAsync(shopper, ccPayment.SavedCardID);
            }
            else
            {
                throw new CatalystBaseException(MyErrorCodes.Payment.DetailsMissing);
            }


            var payments          = (await _oc.Payments.ListAsync <PaymentWithXp>(OrderDirection.All, ccPayment.OrderID)).Items.ToList();
            var existingCCPayment = payments.FirstOrDefault(IsCreditCardPayment);

            if (existingCCPayment == null)
            {
                var payment = new PaymentWithXp()
                {
                    Type     = PaymentType.CreditCard,
                    Amount   = ccPayment.Amount,
                    Accepted = false,
                    xp       = new PaymentXp()
                    {
                        SafeCardDetails = safeCardDetails
                    }
                };
                return(await _oc.Payments.CreateAsync <PaymentWithXp>(OrderDirection.All, ccPayment.OrderID, payment));
            }
            else
            {
                var payment = new PartialPayment()
                {
                    Amount   = ccPayment.Amount,
                    Accepted = false,
                    xp       = new PaymentXp()
                    {
                        SafeCardDetails = safeCardDetails
                    }
                };
                return(await _oc.Payments.PatchAsync <PaymentWithXp>(OrderDirection.All, ccPayment.OrderID, existingCCPayment.ID, payment));
            }
        }
Example #3
0
        public async Task <PaymentWithXp> CaptureCardPayment(string orderID, PaymentWithXp payment)
        {
            var authorizationTransaction = GetLastSuccessfulTransactionOfType(PaymentTransactionType.Authorization, payment);

            Require.That(authorizationTransaction != null, MyErrorCodes.Payment.CannotCapture, payment);
            var captureResult = await _creditCardProcessor.CapturePriorAuthorizationAsync(new FollowUpCCTransaction()
            {
                Amount        = payment.Amount ?? 0,
                TransactionID = authorizationTransaction.ID
            });

            var updatedPayment = await CreatePaymentTransaction(orderID, payment, PaymentTransactionType.Capture, captureResult);

            return(updatedPayment);
        }
Example #4
0
        private async Task <PaymentWithXp> CreatePaymentTransaction(string orderID, PaymentWithXp payment, PaymentTransactionType type, CCTransactionResult transaction)
        {
            var updatedPayment = await _oc.Payments.CreateTransactionAsync <PaymentWithXp>(OrderDirection.All, orderID, payment.ID, new PaymentTransactionWithXp()
            {
                ID            = transaction.TransactionID,
                Amount        = payment.Amount,
                DateExecuted  = DateTime.Now,
                ResultCode    = transaction.AuthorizationCode,
                ResultMessage = transaction.Message,
                Succeeded     = transaction.Succeeded,
                Type          = type.ToString(),
                xp            = new PaymentTransactionXp
                {
                    TransactionDetails = transaction,
                }
            });

            return(updatedPayment);
        }
Example #5
0
 private bool IsCreditCardPayment(PaymentWithXp payment) => payment.Type == PaymentType.CreditCard && payment.xp.SafeCardDetails.Token != null;
Example #6
0
        public async Task <PaymentWithXp> AuthorizeCardPayment(OrderWorksheetWithXp worksheet, PaymentWithXp payment)
        {
            //TODO - probably some checks
            var authorizeRequest = new AuthorizeCCTransaction()
            {
                OrderID             = worksheet.Order.ID,
                Amount              = worksheet.Order.Total,
                Currency            = worksheet.Order.Currency,
                AddressVerification = worksheet.Order.BillingAddress,
                CustomerIPAddress   = "",
            };
            var payWithSavedCard = payment?.xp?.SafeCardDetails?.SavedCardID != null;

            if (payWithSavedCard)
            {
                authorizeRequest.CardDetails.SavedCardID = payment.xp.SafeCardDetails.SavedCardID;
                authorizeRequest.ProcessorCustomerID     = worksheet.Order.FromUser.xp.PaymentProcessorCustomerID;
            }
            else
            {
                authorizeRequest.CardDetails.Token = payment?.xp?.SafeCardDetails?.Token;
            }

            var authorizationResult = await _creditCardProcessor.AuthorizeOnlyAsync(authorizeRequest);

            Require.That(authorizationResult.Succeeded, MyErrorCodes.Payment.AuthorizationFailed, authorizationResult);

            await _oc.Payments.PatchAsync <PaymentWithXp>(OrderDirection.All, worksheet.Order.ID, payment.ID, new PartialPayment { Accepted = true, Amount = authorizeRequest.Amount });

            var updatedPayment = await CreatePaymentTransaction(worksheet.Order.ID, payment, PaymentTransactionType.Authorization, authorizationResult);

            return(updatedPayment);
        }
Example #7
0
        private PaymentTransactionWithXp GetLastSuccessfulTransactionOfType(PaymentTransactionType type, PaymentWithXp payment)
        {
            var authorizationTransaction = payment.Transactions
                                           .Where(x => x.Type == type.ToString())
                                           .OrderBy(x => x.DateExecuted)
                                           .LastOrDefault(t => t.Succeeded);

            return(authorizationTransaction);
        }