public ActionResult Process(Order order) { string postUrl = settings.TestMode ? "https://www.sandbox.paypal.com/cgi-bin/webscr" : "https://www.paypal.com/cgi-bin/webscr"; /* var form = string.Format(@" <!DOCTYPE HTML PUBLIC ""-//W3C//DTD HTML 4.0 Transitional//EN""> <html> <head> <title>Payment</title> </head> <body onload=""PayForm.submit();""> <form action=""{0}"" method=post name=""PayForm""> <input type=""hidden"" name=""cmd"" value=""_xclick""> <input type=""hidden"" name=""business"" value=""{1}""> <input type=""hidden"" name=""currency_code"" value=""{2}""> <input type=""hidden"" name=""custom"" value=""{3}""> <input type=""hidden"" name=""item_name"" value=""{4}""> <input type=""hidden"" name=""item_number"" value=""{5}""> <input type=""hidden"" name=""amount"" value=""{6}""> <input type=""hidden"" name=""first_name"" value=""{7}""> <input type=""hidden"" name=""last_name"" value=""{8}""> <input type=""hidden"" name=""address1"" value=""{9}""> <input type=""hidden"" name=""address2"" value=""{10}""> <input type=""hidden"" name=""city"" value=""{11}""> <input type=""hidden"" name=""state"" value=""{12}""> <input type=""hidden"" name=""zip"" value=""{13}""> <input type=""hidden"" name=""country"" value=""{14}""> <input type=""hidden"" name=""charset"" value=""utf-8""> <input type=""hidden"" name=""callback_url"" value=""{15}""> <input type=""image"" name=""submit"" border=""0"" src=""https://www.paypalobjects.com/en_US/i/btn/btn_buynow_LG.gif"" alt=""PayPal - The safer, easier way to pay online""> </form>", postUrl, settings.Email, SettingsHelper.GetSetting<string>(Helpers.Settings.CurrencyCode), order.Id, string.Format("Order {0}".T(), order.Id), order.Id, order.Total, order.BillingAddress.FirstName, order.BillingAddress.LastName, order.BillingAddress.Address1, order.BillingAddress.Address2, order.BillingAddress.City, order.BillingAddress.RegionId.HasValue ? order.BillingAddress.Region.Name : order.BillingAddress.RegionOther, order.BillingAddress.ZipPostal, order.BillingAddress.CountryCode, IpnUrl); */ string itemsHtml = ""; int itemNo = 1; foreach (OrderItem item in order.Items) { itemsHtml += string.Format(@" <input type=""hidden"" name=""quantity_{0}"" value=""{1}""> <input type=""hidden"" name=""item_name_{0}"" value=""{2}""> <input type=""hidden"" name=""item_number_{0}"" value=""{3}""> <input type=""hidden"" name=""amount_{0}"" value=""{4}"">", itemNo++, item.Quantity, item.Product.Name, item.Product.Sku, item.Quantity*item.ItemPrice); } string taxHtml = ""; if (!settingService.Get<bool>(global::SettingField.TaxIncludedInPrices)) taxHtml += string.Format(@"<input type=""hidden"" name=""tax_cart"" value=""{0}"">", order.TaxAmount); var currencyCode = settingService.Get<string>(SettingField.CurrencyCode); string form = string.Format(@" <!DOCTYPE HTML PUBLIC ""-//W3C//DTD HTML 4.0 Transitional//EN""> <html> <head> <title>Payment</title> </head> <body onload=""PayForm.submit();""> <form action=""{0}"" method=post name=""PayForm""> <input type=""hidden"" name=""cmd"" value=""_cart""> <input type=""hidden"" name=""upload"" value=""1""> <input type=""hidden"" name=""business"" value=""{1}""> <input type=""hidden"" name=""currency_code"" value=""{2}""> <input type=""hidden"" name=""custom"" value=""{3}""> {4} {5} <input type=""hidden"" name=""handling_cart"" value=""{6}""> <input type=""hidden"" name=""first_name"" value=""{7}""> <input type=""hidden"" name=""last_name"" value=""{8}""> <input type=""hidden"" name=""address1"" value=""{9}""> <input type=""hidden"" name=""address2"" value=""{10}""> <input type=""hidden"" name=""city"" value=""{11}""> <input type=""hidden"" name=""state"" value=""{12}""> <input type=""hidden"" name=""zip"" value=""{13}""> <input type=""hidden"" name=""country"" value=""{14}""> <input type=""hidden"" name=""charset"" value=""utf-8""> <input type=""hidden"" name=""notify_url"" value=""{15}""> <input type=""image"" name=""submit"" border=""0"" style=""display: none"" src=""https://www.paypalobjects.com/en_US/i/btn/btn_buynow_LG.gif"" alt=""PayPal - The safer, easier way to pay online""> Redirecting to PayPal... </form>", postUrl, settings.Email, currencyCode, order.Id, itemsHtml, taxHtml, order.ShippingAmount, order.BillingAddress.FirstName, order.BillingAddress.LastName, order.BillingAddress.Address1, order.BillingAddress.Address2, order.BillingAddress.City, order.BillingAddress.RegionId.HasValue ? order.BillingAddress.Region.Name : order.BillingAddress.RegionOther, order.BillingAddress.ZipPostal, order.BillingAddress.CountryCode, IpnUrl); return new ContentResult {Content = form}; }
public ActionResult Checkout(ShoppingCartCheckoutViewModel model) { if (!ModelState.IsValid) return JsonValidationError(); // Get cart contents ShoppingCart cart = GetOrCreateCart(); if (!cart.ShoppingCartItems.Any()) { return JsonError("Your shopping cart is empty!"); } // Check quantity foreach (ShoppingCartItem cartItem in cart.ShoppingCartItems) { Product product = db.Products.Find(cartItem.ProductId); int? qty = null; if (cartItem.ProductSkuId.HasValue && cartItem.ProductSku.Quantity.HasValue) qty = cartItem.ProductSku.Quantity.Value; if (qty == null && product.Quantity.HasValue) qty = product.Quantity.Value; if (qty.HasValue && qty < cartItem.Quantity) { return JsonError(string.Format("The requested quantity for \"{0}\" is not available", product.Name)); } } // Get current user (or create a new one) User user = null; if (User.Identity.IsAuthenticated) { user = customerService.Find(currentUser.User.Id); } if (user == null) { var userModel = new CustomerViewModel { FirstName = model.BillingAddress.FirstName, LastName = model.BillingAddress.LastName, Company = model.BillingAddress.Company, PhoneNumber = model.BillingAddress.Phone, Email = model.Email }; try { user = customerService.AddOrUpdate(userModel); } catch (ArgumentException err) { return JsonError(err.Message); } customerService.LoginUser(HttpContext, user); } // Get addresses var billingAddress = Mapper.Map<Address>(model.BillingAddress); billingAddress.Type = AddressType.Billing; var shippingAddress = Mapper.Map<Address>(model.SameShippingAddress ? model.BillingAddress : model.ShippingAddress); shippingAddress.Type = AddressType.Shipping; var defaultBillingAddress = customerService.GetAddress(user.Id, AddressType.Billing); if (defaultBillingAddress == null) { // Add default billing address defaultBillingAddress = Mapper.Map<Address>(model.BillingAddress); defaultBillingAddress.Type = AddressType.Billing; defaultBillingAddress.IsPrimary = true; user.Addresses.Add(defaultBillingAddress); } var defaultShippingAddress = customerService.GetAddress(user.Id, AddressType.Shipping); if (defaultShippingAddress == null) { // Add default shipping address defaultShippingAddress = Mapper.Map<Address>(model.SameShippingAddress ? model.BillingAddress : model.ShippingAddress); defaultShippingAddress.Type = AddressType.Shipping; defaultShippingAddress.IsPrimary = true; user.Addresses.Add(defaultShippingAddress); } db.SaveChanges(); // Create order var order = new Order { UserId = user.Id, BillingAddress = billingAddress, ShippingAddress = shippingAddress, DatePlaced = DateTime.Now, DateUpdated = DateTime.Now, IPAddress = Request.UserHostAddress, UserComments = model.UserComments, Status = OrderStatus.AwaitingPayment }; db.Orders.Add(order); TaxZone taxZone = taxZoneService.Find(billingAddress.CountryCode, billingAddress.RegionId); foreach (ShoppingCartItem cartItem in cart.ShoppingCartItems) { Product product = db.Products.Find(cartItem.ProductId); ProductSku productSku = cartItem.ProductSku; if (productSku != null && productSku.Quantity.HasValue) { productSkuService.RemoveQuantity(productSku.Id, cartItem.Quantity); } else if (product.Quantity.HasValue) { productService.RemoveQuantity(product.Id, cartItem.Quantity); } decimal price = product.SalePrice ?? product.Price; if (cartItem.ProductSkuId.HasValue && cartItem.ProductSku.Price.HasValue) price = cartItem.ProductSku.Price.Value; var cartItemOptions = JsonConvert.DeserializeObject<ShoppingCartItemOptionViewModel[]>(cartItem.Options); var orderItemOptions = Mapper.Map<OrderItemOption[]>(cartItemOptions); var orderItem = new OrderItem { Order = order, ProductId = product.Id, ProductSkuId = cartItem.ProductSkuId, Quantity = cartItem.Quantity, Options = JsonConvert.SerializeObject(orderItemOptions), ItemPrice = price }; db.OrderItems.Add(orderItem); order.Subtotal += cartItem.Quantity * price; if (taxZone != null) order.TaxAmount += taxRateService.CalculateTax(taxZone.Id, product.TaxClassId, price * cartItem.Quantity); } ShippingMethod shippingMethod = db.ShippingMethods.Find(model.ShippingMethodId); order.ShippingAmount = shippingService.CalculateShipping(shippingMethod, cart.ShoppingCartItems.Sum(i => i.Quantity), cart.ShoppingCartItems.Sum(i => i.Quantity*i.Product.Weight), order.Subtotal, shippingAddress).GetValueOrDefault(); order.Total = order.Subtotal + order.ShippingAmount; if (!settings.Get<bool>(SettingField.TaxIncludedInPrices)) order.Total += order.TaxAmount; db.SaveChanges(); return JsonSuccess(new {orderId = order.Id, paymentMethodId = model.PaymentMethodId}); }
public ActionResult Create(OrderEditViewModel model) { if (!ModelState.IsValid) return JsonValidationError(); var user = customerService.FindAll().FirstOrDefault(u => u.Email == model.UserEmail); if (user == null) { var userModel = new CustomerViewModel { FirstName = model.BillingAddress.FirstName, LastName = model.BillingAddress.LastName, Company = model.BillingAddress.Company, PhoneNumber = model.BillingAddress.Phone, Email = model.UserEmail }; try { user = customerService.AddOrUpdate(userModel); } catch (ArgumentException err) { return JsonError(err.Message); } } // Get addresses var billingAddress = Mapper.Map<Address>(model.BillingAddress); billingAddress.Type = AddressType.Billing; var shippingAddress = Mapper.Map<Address>(model.SameShippingAddress ? model.BillingAddress : model.ShippingAddress); shippingAddress.Type = AddressType.Shipping; var defaultBillingAddress = customerService.GetAddress(user.Id, AddressType.Billing); if (defaultBillingAddress == null || defaultBillingAddress.FirstName == null) { // Add default billing address defaultBillingAddress = Mapper.Map<Address>(model.BillingAddress); defaultBillingAddress.Type = AddressType.Billing; defaultBillingAddress.IsPrimary = true; if (defaultBillingAddress.Id == 0) user.Addresses.Add(defaultBillingAddress); } var defaultShippingAddress = customerService.GetAddress(user.Id, AddressType.Shipping); if (defaultShippingAddress == null || defaultBillingAddress.FirstName == null) { // Add default shipping address defaultShippingAddress = Mapper.Map<Address>(model.SameShippingAddress ? model.BillingAddress : model.ShippingAddress); defaultShippingAddress.Type = AddressType.Shipping; defaultShippingAddress.IsPrimary = true; if (defaultShippingAddress.Id == 0) user.Addresses.Add(defaultShippingAddress); } db.SaveChanges(); // Create order var order = new Order { UserId = user.Id, BillingAddress = billingAddress, ShippingAddress = shippingAddress, DatePlaced = DateTime.Now, DateUpdated = DateTime.Now, IPAddress = Request.UserHostAddress, UserComments = model.UserComments, Status = OrderStatus.AwaitingPayment, Discount = model.Discount, ShippingAmount = model.ShippingAmount, }; db.Orders.Add(order); var itemDiscount = 0m; if (model.Discount < 0) { itemDiscount = model.Discount / model.Items.Count; } foreach (var item in model.Items) { Product product = productFinder.Find(item.ProductId); var orderItem = new OrderItem { Order = order, ProductId = item.ProductId, ProductSkuId = item.ProductSkuId, Quantity = item.Quantity, Options = item.Options, ItemPrice = item.ItemPrice }; db.OrderItems.Add(orderItem); order.Subtotal += orderItem.Quantity * orderItem.ItemPrice; order.TaxAmount += taxService.CalculateTax(billingAddress.CountryCode, billingAddress.RegionId, product.TaxClassId, (orderItem.ItemPrice + itemDiscount) * orderItem.Quantity); } order.Total = order.Subtotal + order.Discount + order.ShippingAmount; if (!settingService.Get<bool>(SettingField.TaxIncludedInPrices)) order.Total += order.TaxAmount; db.SaveChanges(); return JsonSuccess(new { orderId = order.Id }) .WithSuccess("Order created successfully".TA()); }