public async Task <OrderInfo> Buy(OrderRequest orderRequest) { if (!OrderRepository.CheckValidOrder(orderRequest.OrderItems)) { throw new MessageException("Invalid order"); } decimal amount = OrderRepository.PricePerOrder(orderRequest.OrderItems); Order order = Mapper.Map <Order>(orderRequest); await InitializeOrderAsync(orderRequest, order); string chargeId = StripeService.CreateCharge(orderRequest.TokenId, (long)amount); order.ExternalReferenceId = chargeId; string status = await StripeService.GetStatusAsync(chargeId); order.OrderStatus = status; await OrderRepository.UpdateAsync(order); if (order.OrderStatus == "succeeded" || order.OrderStatus == "amount_capturable_updated") { await OrderRepository.RemoveItemsAsync(orderRequest.OrderItems); return(new OrderInfo() { Message = "Transaction succeeded!" }); } return(new OrderInfo() { Message = "Payment failed!" }); }