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 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); }
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); }