示例#1
0
        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));
            }
        }