public async Task <bool> PaymentOnDelivery(OrderItemsVm itemsVm, string username) { var orderVms = itemsVm.orderedProducts; var addressVm = itemsVm.address; if (orderVms.Count == 0 || orderVms == null) { throw new Exception("The order is null or empty"); } var bucketEntity = await _dbContext.Orders .Include(o => o.Items) .ThenInclude(c => c.Coffee) .Where(o => o.ClientId == username) .FirstOrDefaultAsync(o => o.IsPaymentCompleted == false); if (bucketEntity == null || bucketEntity.Items.Count == 0) { throw new Exception("Bucket is empty"); } long dbPriceSum = 0; foreach (OrderVm order in orderVms) { var item = bucketEntity.Items.FirstOrDefault(i => i.Id == order.id); dbPriceSum += (long)(item.Price * 100); if (item.Id != order.id) { throw new Exception("The order's id is invalid"); } item.PaymentStatus = (PaymentStatus)2; _dbContext.OrderItems.Update(item); } await _dbContext.SaveChangesAsync(); var amount = (long)(orderVms.Sum(o => o.price) * 100); if (amount != dbPriceSum) { return(false); } bucketEntity.City = addressVm.place; bucketEntity.Street = addressVm.road; bucketEntity.HouseNumber = addressVm.houseNumber; bucketEntity.PostalCode = addressVm.zipcode; bucketEntity.Latitude = addressVm.latLng.latitude; bucketEntity.Longitude = addressVm.latLng.longitude; bucketEntity.PaymentMethod = "On Delivery"; bucketEntity.PaymentCard = ""; _dbContext.Update(bucketEntity); await _dbContext.SaveChangesAsync(); return(true); }
public async Task <ActionResult> OnDelivery(OrderItemsVm itemsVm) { var identity = HttpContext.User.Identity as ClaimsIdentity; var username = _userService.GetUserName(identity); try { if (await _paymentService.PaymentOnDelivery(itemsVm, username)) { await _paymentService.Success(username); return(Ok(new { status = 200, message = "Order complete" })); } await _paymentService.Cancel(username); return(StatusCode(406, new { status = 406, message = "Something went wrong." })); } catch (Exception e) { await _paymentService.Cancel(username); return(StatusCode(406, new { status = 406, message = e.Message })); } }
public async Task <bool> Payment(OrderItemsVm itemsVm, string username) { var orderVms = itemsVm.orderedProducts; var addressVm = itemsVm.address; var token = itemsVm.token; StripeConfiguration.ApiKey = System.Environment.GetEnvironmentVariable("STRIPE_SKKEY"); if (orderVms.Count == 0 || orderVms == null) { throw new Exception("The order is null or empty."); } var bucketEntity = await _dbContext.Orders .Include(o => o.Items) .ThenInclude(c => c.Coffee) .Where(o => o.ClientId == username) .FirstOrDefaultAsync(o => o.IsPaymentCompleted == false); if (bucketEntity == null || bucketEntity.Items.Count == 0) { throw new Exception("Bucket is empty"); } long dbPriceSum = 0; foreach (OrderVm order in orderVms) { var item = bucketEntity.Items.FirstOrDefault(i => i.Id == order.id); dbPriceSum += (long)(item.Price * 100); if (item.Id != order.id) { throw new Exception("The order's id is invalid"); } item.PaymentStatus = (PaymentStatus)2; _dbContext.OrderItems.Update(item); } await _dbContext.SaveChangesAsync(); var amount = (long)(orderVms.Sum(o => o.price) * 100); if (amount != dbPriceSum) { return(false); } bucketEntity.City = addressVm.place; bucketEntity.Street = addressVm.road; bucketEntity.HouseNumber = addressVm.houseNumber; bucketEntity.PostalCode = addressVm.zipcode; bucketEntity.Latitude = addressVm.latLng.latitude; bucketEntity.Longitude = addressVm.latLng.longitude; _dbContext.Update(bucketEntity); await _dbContext.SaveChangesAsync(); var options = new ChargeCreateOptions { Amount = amount, Currency = "pln", Description = "Płatność", Source = token }; var service = new ChargeService(); Charge charge = service.Create(options); bucketEntity.PaymentMethod = charge.PaymentMethodDetails.Card.Brand; bucketEntity.PaymentCard = "**** **** **** " + charge.PaymentMethodDetails.Card.Last4; await _dbContext.SaveChangesAsync(); return(true); }