public async Task <ActionResult> Payment([FromBody] OrderRM OrderRM) { var claim = HttpContext.User.Claims.ElementAt(0); string userName = claim.Value; var order = await new PaymentRepo(_context, _config).Order(OrderRM, userName); if (!order.Item1) { return(BadRequest(order.Item2)); } return(Ok(order.Item2)); }
public async Task <Tuple <bool, object> > Order(OrderRM orderRM, string userName) { Random random = new Random(); var items = new List <ItemsRM>(); //PaymentTypeId 3 is pay by cash if (orderRM.PaymentTypeId != 3) { StripeConfiguration.ApiKey = _config["Stripe_SecretKey"]; var optionsToken = new TokenCreateOptions { Card = new CreditCardOptions { Number = orderRM.CardNumber, ExpMonth = orderRM.Month, ExpYear = orderRM.Year, Cvc = orderRM.Cvc } }; if (optionsToken == null) { return(new Tuple <bool, object>(false, "Payment cannot be completed")); } var serviceToken = new TokenService(); Token stripeToken = await serviceToken.CreateAsync(optionsToken); if (stripeToken == null) { return(new Tuple <bool, object>(false, "Payment cannot be completed")); } var options = new ChargeCreateOptions { Amount = orderRM.Amount * 100, Currency = "usd", Source = stripeToken.Id, Description = $"Success final project payment by {userName}" }; var service = new ChargeService(); Charge charge = await service.CreateAsync(options); if (!charge.Paid) { return(new Tuple <bool, object>(false, "Payment cannot be completed")); } } var customerId = _context.CustomerInfo.Where(c => c.UsersEmail == userName).FirstOrDefault().CustomerId; var order = new Orders { CustomerId = customerId, OrderTotal = orderRM.Amount, PaymentTypeId = orderRM.PaymentTypeId, }; var randomId = random.Next(10000); while (_context.Orders.Any(id => id.OrderId == randomId)) { randomId = random.Next(10000); } order.OrderId = randomId; _context.Orders.Add(order); foreach (ItemsRM item in orderRM.itemsRM) { var StoreItem = new SelectedItem { OrderId = randomId, MenuItemId = item.Item.MenuItemId, Quantity = item.qty }; items.Add(item); _context.SelectedItem.Add(StoreItem); } await _context.SaveChangesAsync(); var returnOrder = new OrderCompleteRM { OrderId = order.OrderId, Customer = userName, ItemsRM = items, OrderTotal = order.OrderTotal, PaymentTypeId = order.PaymentTypeId }; return(new Tuple <bool, object>(true, returnOrder)); }