예제 #1
0
        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};
        }
예제 #2
0
        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});
        }
예제 #3
0
        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());
        }