public async Task <IActionResult> Charge(string nonce) { var gateway = await _braintreeConfiguration.BraintreeGateway(); var curentUser = await _workContext.GetCurrentUser(); var cart = await _cartService.GetActiveCartDetails(curentUser.Id); if (cart == null) { return(NotFound()); } var orderCreateResult = await _orderService.CreateOrder(cart.Id, PaymentProviderHelper.BraintreeProviderId, 0, OrderStatus.PendingPayment); if (!orderCreateResult.Success) { return(BadRequest(orderCreateResult.Error)); } var order = orderCreateResult.Value; var zeroDecimalOrderAmount = order.OrderTotal; if (!CurrencyHelper.IsZeroDecimalCurrencies(_currencyService.CurrencyCulture)) { zeroDecimalOrderAmount = zeroDecimalOrderAmount * 100; } var regionInfo = new RegionInfo(_currencyService.CurrencyCulture.LCID); var payment = new Payment() { OrderId = order.Id, Amount = order.OrderTotal, PaymentMethod = PaymentProviderHelper.BraintreeProviderId, CreatedOn = DateTimeOffset.UtcNow }; var lineItemsRequest = new List <TransactionLineItemRequest>(); //TODO: Need validation //foreach(var item in order.OrderItems) //{ // lineItemsRequest.Add(new TransactionLineItemRequest // { // Description = item.Product.Description.Substring(0, 255), // Name = item.Product.Name, // Quantity = item.Quantity, // UnitAmount = item.ProductPrice, // ProductCode = item.ProductId.ToString(), // TotalAmount = item.ProductPrice * item.Quantity // }); //} //TODO: See how customer id works var request = new TransactionRequest { Amount = order.OrderTotal, PaymentMethodNonce = nonce, OrderId = order.Id.ToString(), //LineItems = lineItemsRequest.ToArray(), //CustomerId = order.CustomerId.ToString(), Options = new TransactionOptionsRequest { SubmitForSettlement = true, SkipAdvancedFraudChecking = false, SkipCvv = false, SkipAvs = false, } }; var result = gateway.Transaction.Sale(request); if (result.IsSuccess()) { var transaction = result.Target; payment.GatewayTransactionId = transaction.Id; payment.Status = PaymentStatus.Succeeded; order.OrderStatus = OrderStatus.PaymentReceived; _paymentRepository.Add(payment); await _paymentRepository.SaveChangesAsync(); return(Ok(new { Status = "success", OrderId = order.Id, TransactionId = transaction.Id })); } else { string errorMessages = ""; foreach (var error in result.Errors.DeepAll()) { errorMessages += "Error: " + (int)error.Code + " - " + error.Message + "\n"; } return(BadRequest(errorMessages)); } }