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); }
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)); } }
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); }
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); }
private bool IsCreditCardPayment(PaymentWithXp payment) => payment.Type == PaymentType.CreditCard && payment.xp.SafeCardDetails.Token != null;
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); }
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); }