public ActionResult LiqPayCallback() { LiqPayHelper liqPayHelper = new LiqPayHelper(ConfigurationManager.AppSettings["LiqPayPrivateKey"], ConfigurationManager.AppSettings["LiqPayPublicKey"]); // --- Перетворюю відповідь LiqPay в Dictionary<string, string> для зручності: var request_dictionary = Request.Form.AllKeys.ToDictionary(key => key, key => Request.Form[key]); // --- Розшифровую параметр data відповіді LiqPay та перетворюю в Dictionary<string, string> для зручності: byte[] request_data = Convert.FromBase64String(request_dictionary["data"]); string decodedString = Encoding.UTF8.GetString(request_data); var request_data_dictionary = JsonConvert.DeserializeObject <Dictionary <string, string> >(decodedString); // --- Отримую сигнатуру для перевірки var mySignature = liqPayHelper.GetLiqPaySignature(request_dictionary["data"]); // --- Якщо сигнатура серевера не співпадає з сигнатурою відповіді LiqPay - щось пішло не так if (mySignature != request_dictionary["signature"]) { return(View("PurchaseError")); } //return new HttpStatusCodeResult(HttpStatusCode.BadRequest); string order_id = request_data_dictionary["order_id"]; Order order = orderRepository.FindBy(x => x.TestIdForLiqpay == order_id).FirstOrDefault(); if (order == null) { return(View("PurchaseError")); } //new HttpStatusCodeResult(HttpStatusCode.BadRequest); // --- Якщо статус відповіді "Тест" або "Успіх" - все добре if (request_data_dictionary["status"] == "sandbox" || request_data_dictionary["status"] == "success") { // Тут можна оновити статус замовлення та зробити всі необхідні речі. Id замовлення можна взяти тут: request_data_dictionary[order_id] foreach (var item in order.OrderItems) { item.Ticket.StatusId = 1; } order.OrderStatusId = 1; order.PurchaseDate = DateTime.Now; orderRepository.AddOrUpdate(order); orderRepository.Save(); return(View("PurchaseSuccess", order)); } // delete tickets foreach (var item in order.OrderItems) { if (item.Ticket != null) { ticketRepository.Delete(item.Ticket); } } ticketRepository.Save(); TicketHub.NotifyToAllClients(); return(View("PurchaseError")); }
public ActionResult ReserveTickets(List <SelectedSeatsViewModel> selected_seats, int?session_id) { if (!IsValidSelectedSeats(selected_seats, session_id) || !ModelState.IsValid) { return(new HttpStatusCodeResult(HttpStatusCode.BadRequest)); } ApplicationUserManager userMgr = new ApplicationUserManager(new UserStore <ApplicationUser>(context)); var user = userMgr.FindByName(User.Identity.Name); // якщо в юзера вже заброньовано більше 10 квитків - не дозволю йому бронювати більше, поки він не сплатить заброньовані замовлення if (user.Orders.Where(x => x.OrderStatusId == 2).Sum(x => x.OrderItems.Count) + selected_seats.Count > 10) { return(new HttpStatusCodeResult(HttpStatusCode.BadRequest)); } Session session = sessionRepository.FindBy(x => x.Id == session_id).FirstOrDefault(); if (session.DateTime < DateTime.Now.AddMinutes(35)) { return(new HttpStatusCodeResult(HttpStatusCode.BadRequest)); } // створюю список позицій замовлення (квитків) List <OrderItem> orderItems = new List <OrderItem>(); foreach (var item in selected_seats) { TicketPrice ticketPrice = session.TicketPrices.FirstOrDefault(x => x.Seat.Row == item.Row && x.Seat.Number == item.Number); orderItems.Add(new OrderItem { Movie = session.Movie, Price = ticketPrice.Price, Ticket = new Ticket { SessionDateTime = session.DateTime, CreationDateTime = DateTime.Now, TicketPrice = ticketPrice, Seat = ticketPrice.Seat, StatusId = 2, // заброньовано (видалиться за 30хв до початку сеансу) } }); } // створюю замовлення та зберігаю його в бд Order order = new Order { OrderItems = orderItems, OrderStatusId = 2, // не сплачено (заброньовано) User = userMgr.FindByName(User.Identity.Name), PurchaseDate = DateTime.Now }; orderRepository.AddOrUpdate(order); orderRepository.Save(); TicketHub.NotifyToAllClients(); return(View()); }
public ActionResult BuyTickets(List <SelectedSeatsViewModel> selected_seats, int?session_id) { if (!IsValidSelectedSeats(selected_seats, session_id) || !ModelState.IsValid) { return(new HttpStatusCodeResult(HttpStatusCode.BadRequest)); } // створюю список позицій замовлення (квитків) Session session = sessionRepository.FindBy(x => x.Id == session_id).FirstOrDefault(); List <OrderItem> orderItems = new List <OrderItem>(); foreach (var item in selected_seats) { TicketPrice ticketPrice = session.TicketPrices.FirstOrDefault(x => x.Seat.Row == item.Row && x.Seat.Number == item.Number); orderItems.Add(new OrderItem { Movie = session.Movie, Price = ticketPrice.Price, Ticket = new Ticket { SessionDateTime = session.DateTime, CreationDateTime = DateTime.Now, TicketPrice = ticketPrice, Seat = ticketPrice.Seat, StatusId = 3, // зарезервовано на 15хв } }); } // створюю замовлення та зберігаю його в бд ApplicationUserManager userMgr = new ApplicationUserManager(new UserStore <ApplicationUser>(context)); Order order = new Order { TestIdForLiqpay = Guid.NewGuid().ToString(), // ця властивість необхідна для тестування "лікпею" OrderItems = orderItems, OrderStatusId = 3, // статус "відхилено" поки користувач не заплатить User = userMgr.FindByName(User.Identity.Name), PurchaseDate = DateTime.Now }; orderRepository.AddOrUpdate(order); orderRepository.Save(); TicketHub.NotifyToAllClients(); // на основі створенго замовлення збираю необхідні для liqpay api дані та відправляю їх на в'ю LiqPayHelper liqPayHelper = new LiqPayHelper(ConfigurationManager.AppSettings["LiqPayPrivateKey"], ConfigurationManager.AppSettings["LiqPayPublicKey"]); string redirect_url = Request.Url.Scheme + System.Uri.SchemeDelimiter + Request.Url.Host + (Request.Url.IsDefaultPort ? "" : ":" + Request.Url.Port) + "/Order/LiqPayCallback"; var model = liqPayHelper.GetLiqPayModel(order, redirect_url); return(View(model)); }
//CinemaContext db = new CinemaContext(); public void Execute(IJobExecutionContext context) { using (CinemaContext db = new CinemaContext()) { // видаляю зарезервовані на 15 хв квитики, які по якимось причинам не були викуплені DateTime dtNow = DateTime.Now.AddMinutes(-15); var deleteTickest = db.Tickets.Where(x => dtNow > x.CreationDateTime && x.StatusId == 3).ToList(); db.Tickets.RemoveRange(deleteTickest); db.SaveChanges(); if (deleteTickest != null && deleteTickest.Count > 0) { TicketHub.NotifyToAllClients(); } // видаляю квитки, які були заброньовані, але не викуплені за 30хв до початку сеансу (+ змінюю статус замовлення на "відхилено") DateTime dtNow2 = DateTime.Now.AddMinutes(30); var reservedDidntPayed = db.Sessions.Where(x => dtNow2 > x.DateTime).SelectMany(x => x.TicketPrices.Where(y => y.Ticket.StatusId == 2).Select(xx => xx.Ticket).ToList()).ToList(); foreach (var item in reservedDidntPayed) { if (item.OrderItem != null) { var order = item.OrderItem.Order; order.OrderStatusId = 3; db.Orders.AddOrUpdate(order); } } db.Tickets.RemoveRange(reservedDidntPayed); db.SaveChanges(); if (reservedDidntPayed != null && reservedDidntPayed.Count > 0) { TicketHub.NotifyToAllClients(); } // видаляю застарілі сеанси (які почались 12 годин тому) DateTime dtNow3 = DateTime.Now.AddHours(-12); //dtNow = DateTime.Now.AddMinutes(-10); var oldSessions = db.Sessions.Where(x => dtNow3 > x.DateTime).ToList(); db.Sessions.RemoveRange(oldSessions); db.SaveChanges(); // якщо сеансів меньше 50 - додаю 1 if (db.Sessions.Count() < 50) { Random random = new Random(); int movieId = random.Next(1, db.Movies.Count() + 1); int cinemaHallId = random.Next(1, db.CinemaHalls.Count() + 1); var itemCinemaHall = db.CinemaHalls.Find(cinemaHallId); double randMin = random.Next(-10, 30); int randHour = random.Next(1, 120); var currentSession = new Session { MovieId = movieId, DateTime = DateTime.Now.AddHours(randHour).AddMinutes(randMin), CinemaHall = itemCinemaHall }; db.Sessions.Add(currentSession); // додаю ціни за місця на сеанс foreach (var itemSeat in itemCinemaHall.Seats) { db.TicketPrices.Add(new TicketPrice { Seat = itemSeat, Price = Convert.ToInt32(itemSeat.SeatType.DefaultPrice), Session = currentSession }); } db.SaveChanges(); } } }