in src/Modules/SimplCommerce.Module.PaymentStripe/Areas/PaymentStripe/Controllers/StripeController.cs [48:110]
public async Task<IActionResult> Charge(string stripeEmail, string stripeToken)
{
var stripeProvider = await _paymentProviderRepository.Query().FirstOrDefaultAsync(x => x.Id == PaymentProviderHelper.StripeProviderId);
var stripeSetting = JsonConvert.DeserializeObject<StripeConfigForm>(stripeProvider.AdditionalSettings);
var stripeChargeService = new ChargeService(stripeSetting.PrivateKey);
var currentUser = await _workContext.GetCurrentUser();
var cart = await _cartService.GetActiveCart(currentUser.Id);
if(cart == null)
{
return NotFound();
}
var orderCreationResult = await _orderService.CreateOrder(cart.Id, "Stripe", 0, OrderStatus.PendingPayment);
if(!orderCreationResult.Success)
{
TempData["Error"] = orderCreationResult.Error;
return Redirect("~/checkout/payment");
}
var order = orderCreationResult.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 = "Stripe",
CreatedOn = DateTimeOffset.UtcNow
};
try
{
var charge = stripeChargeService.Create(new ChargeCreateOptions
{
Amount = (int)zeroDecimalOrderAmount,
Description = "Sample Charge",
Currency = regionInfo.ISOCurrencySymbol,
SourceId = stripeToken
});
payment.GatewayTransactionId = charge.Id;
payment.Status = PaymentStatus.Succeeded;
order.OrderStatus = OrderStatus.PaymentReceived;
_paymentRepository.Add(payment);
await _paymentRepository.SaveChangesAsync();
return Redirect($"~/checkout/success?orderId={order.Id}");
}
catch(StripeException ex)
{
payment.Status = PaymentStatus.Failed;
payment.FailureMessage = ex.StripeError.Message;
order.OrderStatus = OrderStatus.PaymentFailed;
_paymentRepository.Add(payment);
await _paymentRepository.SaveChangesAsync();
TempData["Error"] = ex.StripeError.Message;
return Redirect($"~/checkout/error?orderId={order.Id}");
}
}