in src/Modules/SimplCommerce.Module.PaymentBraintree/Areas/PaymentBraintree/Controllers/BraintreeController.cs [51:142]
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);
}
}