示例#1
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);
        }
示例#2
0
        private async Task <List <LineItemWithXp> > FindInactiveLineItems(OrderWorksheetWithXp worksheet, string userToken)
        {
            List <LineItemWithXp> inactiveLineItems = new List <LineItemWithXp>();
            await Throttler.RunAsync(worksheet.LineItems, 100, 8, async lineItem =>
            {
                try
                {
                    await _oc.Me.GetProductAsync(lineItem.ProductID, accessToken: userToken);
                }
                catch (OrderCloudException ex) when(ex.HttpStatus == HttpStatusCode.NotFound)
                {
                    inactiveLineItems.Add(lineItem);
                }
            });

            return(inactiveLineItems);
        }
示例#3
0
        private async Task ValidateOrder(OrderWorksheetWithXp worksheet, List <PaymentWithXp> payments, DecodedToken shopperToken)
        {
            Require.That(!worksheet.Order.IsSubmitted, MyErrorCodes.OrderSubmit.AlreadySubmitted);
            Require.That(
                worksheet.OrderCalculateResponse != null &&
                worksheet.OrderCalculateResponse.HttpStatusCode == 200 &&
                worksheet?.OrderCalculateResponse?.xp != null &&
                worksheet?.OrderCalculateResponse?.xp.TaxDetails != null,
                MyErrorCodes.OrderSubmit.OrderCalculateError
                );

            var shipMethodsWithoutSelections = worksheet?.ShipEstimateResponse?.ShipEstimates?.Where(estimate => estimate.SelectedShipMethodID == null);

            Require.That(
                worksheet?.ShipEstimateResponse != null &&
                shipMethodsWithoutSelections.Count() == 0,
                MyErrorCodes.OrderSubmit.MissingShippingSelections,
                shipMethodsWithoutSelections
                );

            Require.That(payments.Any(IsCreditCardPayment), MyErrorCodes.OrderSubmit.MissingPayment);

            var inactiveLineItems = await FindInactiveLineItems(worksheet, shopperToken.AccessToken);

            Require.That(!inactiveLineItems.Any(), MyErrorCodes.OrderSubmit.InvalidProducts, inactiveLineItems);

            try
            {
                // ordercloud validates the same stuff that would be checked on order submit
                await _oc.Orders.ValidateAsync(OrderDirection.All, worksheet.Order.ID);
            }
            catch (OrderCloudException ex)
            {
                // this error is expected and will be resolved before oc order submit call happens
                var errors = ex.Errors.Where(ex => ex.ErrorCode != "Order.CannotSubmitWithUnacceptedPayments");
                Require.That(!errors.Any(), MyErrorCodes.OrderSubmit.OrderCloudValidationError, errors);
            }

            // Check if expired promotions or price schedule
            var orderPostValidate = await _oc.Orders.GetAsync(OrderDirection.All, worksheet.Order.ID);

            Require.That(worksheet.Order.Total == orderPostValidate.Total, MyErrorCodes.OrderSubmit.PricesHaveChanged);
        }