Ejemplo n.º 1
0
    public void LoadSetting()
    {
        GoogleCheckOutWCFService         pw = new GoogleCheckOutWCFService();
        List <GoogleCheckOutSettingInfo> sf;
        OrderDetailsCollection           orderdata2 = new OrderDetailsCollection();

        orderdata2 = (OrderDetailsCollection)HttpContext.Current.Session["OrderCollection"];
        string itemidsWithVar = "";

        foreach (var item in orderdata2.LstOrderItemsInfo)
        {
            itemidsWithVar += item.ItemID + "&" + item.Quantity + "&" + orderdata2.ObjOrderDetails.OrderID + "&" + item.Variants + ",";
        }
        string country   = orderdata2.ObjShippingAddressInfo.Country.ToString();
        string state     = orderdata2.ObjShippingAddressInfo.State.ToString();
        string zip       = orderdata2.ObjShippingAddressInfo.Zip.ToString();
        int    addressID = Convert.ToInt32(orderdata2.ObjShippingAddressInfo.AddressID);

        try
        {
            sf = pw.GetAllGoogleCheckOutSetting(int.Parse(Session["GateWay"].ToString()), storeID, portalID);

            double  amountTotal          = double.Parse(Session["GrandTotalAll"].ToString()) * rate;
            decimal grandTotal           = decimal.Parse(amountTotal.ToString(CultureInfo.InvariantCulture));
            decimal totalTaxableAmount   = 0;
            decimal subtotalAmount       = 0;
            decimal taxSubTotal          = 0;
            decimal shipping             = Convert.ToDecimal(Convert.ToDouble(Session["ShippingCostAll"].ToString()) * rate);
            decimal shippingCost         = decimal.Parse(shipping.ToString(CultureInfo.InvariantCulture));
            decimal discountAmount       = 0;
            decimal couponDiscountAmount = 0;
            decimal rewardDiscountAmount = 0;

            if (sf[0].GoogleEnvironmentType == "Sandbox")
            {
                CheckoutShoppingCartRequest gCartRequest = new CheckoutShoppingCartRequest(sf[0].GoogleMerchantID, sf[0].GoogleMerchantKey, GCheckout.EnvironmentType.Sandbox, sf[0].GoogleCurrencyType, 30, false);
                HttpContext.Current.Session["EnvironmentType"] = "Sandbox";

                List <CartInfoforGoogleCheckOut> cd;
                cd = pw.GetCartDetailsForPG(storeID, portalID, customerID, userName, GetCurrentCultureName, sessionCode, country, state, zip, addressID);

                int nCount = 1;
                foreach (CartInfoforGoogleCheckOut oItem in cd)
                {
                    string  itemName     = oItem.ItemName.ToString();
                    string  description  = oItem.ShortDescription.ToString();
                    int     qty          = Convert.ToInt32(oItem.Quantity.ToString());
                    decimal TaxRateValue = Convert.ToDecimal(Convert.ToDouble(oItem.TaxRateValue.ToString()) * rate) / qty;
                    decimal amount       = Convert.ToDecimal(Convert.ToDouble(oItem.Price.ToString()) * rate);
                    decimal subTotal     = amount;// +TaxRateValue;

                    gCartRequest.AddItem(itemName, description, subTotal, qty);
                    nCount++;
                }
                nCount--;

                //Send Discount Amount
                if (orderdata2.ObjOrderDetails.DiscountAmount != 0)
                {
                    string itemName    = "Cart Discount Amount";
                    string description = "Discount Applied on Cart Items";
                    int    qty         = 1;
                    discountAmount = 0;
                    decimal discount = Convert.ToDecimal(Convert.ToDouble(orderdata2.ObjOrderDetails.DiscountAmount) * rate);
                    discountAmount = decimal.Parse(discount.ToString(CultureInfo.InvariantCulture));
                    gCartRequest.AddItem(itemName, description, -discountAmount, qty);
                }
                //Send Coupon Amount
                if (orderdata2.ObjOrderDetails.CouponDiscountAmount != 0)
                {
                    string itemName    = "Coupon Discount Amount";
                    string description = "Coupon Discount Applied on Cart Items";
                    int    qty         = 1;
                    couponDiscountAmount = 0;
                    decimal couponDiscount = Convert.ToDecimal(Convert.ToDouble(orderdata2.ObjOrderDetails.CouponDiscountAmount) * rate);
                    couponDiscountAmount = decimal.Parse(couponDiscount.ToString(CultureInfo.InvariantCulture));
                    gCartRequest.AddItem(itemName, description, -couponDiscountAmount, qty);
                }
                //Send Reward Discount Amount
                if (orderdata2.ObjOrderDetails.RewardDiscountAmount != 0)
                {
                    string itemName    = "Reward Points Discount Amount";
                    string description = "Reward Points Discount Applied on Cart Items";
                    int    qty         = 1;
                    rewardDiscountAmount = 0;
                    decimal rewardDiscount = Convert.ToDecimal(Convert.ToDouble(orderdata2.ObjOrderDetails.RewardDiscountAmount) * rate);
                    rewardDiscountAmount = decimal.Parse(rewardDiscount.ToString(CultureInfo.InvariantCulture));
                    gCartRequest.AddItem(itemName, description, -rewardDiscountAmount, qty);
                }
                //tax
                if (orderdata2.ObjOrderDetails.TaxTotal != 0)
                {
                    decimal tax = Convert.ToDecimal(Convert.ToDouble(orderdata2.ObjOrderDetails.TaxTotal) * rate);
                    taxSubTotal = decimal.Parse(tax.ToString(CultureInfo.InvariantCulture));
                }
                subtotalAmount     = grandTotal - shippingCost - taxSubTotal + discountAmount + couponDiscountAmount;
                totalTaxableAmount = subtotalAmount - discountAmount - couponDiscountAmount;
                double taxp   = Convert.ToDouble((taxSubTotal * 100) / totalTaxableAmount);
                double taxPer = taxp / 100;

                gCartRequest.AddCountryTaxRule(USAreas.ALL, taxPer, false);

                //Shipping Cost
                string shippingMethod;
                if (HttpContext.Current.Session["ShippingMethodName"] != null)
                {
                    shippingMethod = HttpContext.Current.Session["ShippingMethodName"].ToString();
                }
                else
                {
                    shippingMethod = "Default Shipping";
                }
                //shippingMethod = "Default Shipping";
                //decimal shippingcost = Convert.ToDecimal(Convert.ToDouble(Session["ShippingCostAll"].ToString()) * rate);
                gCartRequest.AddFlatRateShippingMethod(shippingMethod, shippingCost);

                //Create extra data to pass
                XmlDocument tempDoc = new System.Xml.XmlDocument();
                tempDoc.LoadXml("<root />");

                XmlNode orderIdNode = tempDoc.CreateElement("OrderID");
                orderIdNode.InnerText = Session["OrderID"].ToString();
                gCartRequest.AddMerchantPrivateDataNode(orderIdNode);

                XmlNode userIdNode = tempDoc.CreateElement("userName");
                userIdNode.InnerText = userName;
                gCartRequest.AddMerchantPrivateDataNode(userIdNode);

                XmlNode amountNode = tempDoc.CreateElement("amount");
                amountNode.InnerText = (double.Parse(Session["GrandTotalAll"].ToString()) * rate).ToString();
                gCartRequest.AddMerchantPrivateDataNode(amountNode);

                XmlNode currencyNode = tempDoc.CreateElement("selectedCurrency");
                currencyNode.InnerText = SelectedCurrency;
                gCartRequest.AddMerchantPrivateDataNode(currencyNode);


                XmlNode portalIDNode = tempDoc.CreateElement("portalID");
                portalIDNode.InnerText = portalID.ToString();
                gCartRequest.AddMerchantPrivateDataNode(portalIDNode);

                XmlNode customerIDNode = tempDoc.CreateElement("customerID");
                customerIDNode.InnerText = customerID.ToString();
                gCartRequest.AddMerchantPrivateDataNode(customerIDNode);

                XmlNode itemIdsNode = tempDoc.CreateElement("itemIds");
                itemIdsNode.InnerText = itemidsWithVar;
                gCartRequest.AddMerchantPrivateDataNode(itemIdsNode);

                XmlNode storeIDNode = tempDoc.CreateElement("storeID");
                storeIDNode.InnerText = storeID.ToString();
                gCartRequest.AddMerchantPrivateDataNode(storeIDNode);

                XmlNode couponCodeNode = tempDoc.CreateElement("couponCode");
                couponCodeNode.InnerText = couponCode;
                gCartRequest.AddMerchantPrivateDataNode(couponCodeNode);

                XmlNode sessionCodeNode = tempDoc.CreateElement("sessionCode");
                sessionCodeNode.InnerText = sessionCode;
                gCartRequest.AddMerchantPrivateDataNode(sessionCodeNode);

                XmlNode pgIDNode = tempDoc.CreateElement("pgID");
                pgIDNode.InnerText = Session["GateWay"].ToString();
                gCartRequest.AddMerchantPrivateDataNode(pgIDNode);

                XmlNode MerchantIDNode = tempDoc.CreateElement("MerchantID");
                MerchantIDNode.InnerText = sf[0].GoogleMerchantID;
                gCartRequest.AddMerchantPrivateDataNode(MerchantIDNode);

                XmlNode MerchantKeyNode = tempDoc.CreateElement("MerchantKey");
                MerchantKeyNode.InnerText = sf[0].GoogleMerchantKey;
                gCartRequest.AddMerchantPrivateDataNode(MerchantKeyNode);

                //Get response
                GCheckoutResponse response = gCartRequest.Send();
                // Post the request for Google checkout

                if (response.IsGood)
                {
                    Response.Redirect(response.RedirectUrl, false);
                }
            }


            if (sf[0].GoogleEnvironmentType == "Production")
            {
                CheckoutShoppingCartRequest gCartRequest = new CheckoutShoppingCartRequest(sf[0].GoogleMerchantID, sf[0].GoogleMerchantKey, GCheckout.EnvironmentType.Production, sf[0].GoogleCurrencyType, 30, false);
                HttpContext.Current.Session["EnvironmentType"] = "Production";

                List <CartInfoforGoogleCheckOut> cd;
                cd = pw.GetCartDetailsForPG(storeID, portalID, customerID, userName, GetCurrentCultureName, sessionCode, country, state, zip, addressID);

                int nCount = 1;
                foreach (CartInfoforGoogleCheckOut oItem in cd)
                {
                    string  itemName     = oItem.ItemName.ToString();
                    string  description  = oItem.ShortDescription.ToString();
                    int     qty          = Convert.ToInt32(oItem.Quantity.ToString());
                    decimal TaxRateValue = Convert.ToDecimal(Convert.ToDouble(oItem.TaxRateValue.ToString()) * rate) / qty;
                    decimal amount       = Convert.ToDecimal(Convert.ToDouble(oItem.Price.ToString()) * rate);
                    decimal subTotal     = amount + TaxRateValue;

                    gCartRequest.AddItem(itemName, description, subTotal, qty);
                    nCount++;
                }
                nCount--;

                //Send Discount Amount
                if (orderdata2.ObjOrderDetails.DiscountAmount != 0)
                {
                    string itemName    = "Cart Discount Amount";
                    string description = "Discount Applied on Cart Items";
                    int    qty         = 1;
                    discountAmount = 0;
                    decimal discount = Convert.ToDecimal(Convert.ToDouble(orderdata2.ObjOrderDetails.DiscountAmount) * rate);
                    discountAmount = decimal.Parse(discount.ToString(CultureInfo.InvariantCulture));
                    gCartRequest.AddItem(itemName, description, -discountAmount, qty);
                }
                //Send Coupon Amount
                if (orderdata2.ObjOrderDetails.CouponDiscountAmount != 0)
                {
                    string itemName    = "Coupon Discount Amount";
                    string description = "Coupon Discount Applied on Cart Items";
                    int    qty         = 1;
                    couponDiscountAmount = 0;
                    decimal couponDiscount = Convert.ToDecimal(Convert.ToDouble(orderdata2.ObjOrderDetails.CouponDiscountAmount) * rate);
                    couponDiscountAmount = decimal.Parse(couponDiscount.ToString(CultureInfo.InvariantCulture));
                    gCartRequest.AddItem(itemName, description, -couponDiscountAmount, qty);
                }
                //Send Reward Discount Amount
                if (orderdata2.ObjOrderDetails.RewardDiscountAmount != 0)
                {
                    string itemName    = "Reward Points Discount Amount";
                    string description = "Reward Points Discount Applied on Cart Items";
                    int    qty         = 1;
                    rewardDiscountAmount = 0;
                    decimal rewardDiscount = Convert.ToDecimal(Convert.ToDouble(orderdata2.ObjOrderDetails.RewardDiscountAmount) * rate);
                    rewardDiscountAmount = decimal.Parse(rewardDiscount.ToString(CultureInfo.InvariantCulture));
                    gCartRequest.AddItem(itemName, description, -rewardDiscountAmount, qty);
                }
                //tax
                if (orderdata2.ObjOrderDetails.TaxTotal != 0)
                {
                    decimal tax = Convert.ToDecimal(Convert.ToDouble(orderdata2.ObjOrderDetails.TaxTotal) * rate);
                    taxSubTotal = decimal.Parse(tax.ToString(CultureInfo.InvariantCulture));
                }
                subtotalAmount     = grandTotal - shippingCost - taxSubTotal + discountAmount + couponDiscountAmount;
                totalTaxableAmount = subtotalAmount - discountAmount - couponDiscountAmount;
                double taxp   = Convert.ToDouble((taxSubTotal * 100) / totalTaxableAmount);
                double taxPer = taxp / 100;
                gCartRequest.AddCountryTaxRule(USAreas.ALL, taxPer, false);

                //Shipping Cost
                string shippingMethod;
                if (HttpContext.Current.Session["ShippingMethodName"] != null)
                {
                    shippingMethod = HttpContext.Current.Session["ShippingMethodName"].ToString();
                }
                else
                {
                    shippingMethod = "Default Shipping";
                }
                //shippingMethod = "Default Shipping";
                //decimal shippingcost = Convert.ToDecimal(Convert.ToDouble(Session["ShippingCostAll"].ToString()) * rate);
                gCartRequest.AddFlatRateShippingMethod(shippingMethod, shippingCost);


                //Create extra data to pass
                XmlDocument tempDoc = new System.Xml.XmlDocument();
                tempDoc.LoadXml("<root />");

                XmlNode orderIdNode = tempDoc.CreateElement("OrderID");
                orderIdNode.InnerText = Session["OrderID"].ToString();
                gCartRequest.AddMerchantPrivateDataNode(orderIdNode);

                XmlNode userIdNode = tempDoc.CreateElement("userName");
                userIdNode.InnerText = userName;
                gCartRequest.AddMerchantPrivateDataNode(userIdNode);

                XmlNode amountNode = tempDoc.CreateElement("amount");
                amountNode.InnerText = (double.Parse(Session["GrandTotalAll"].ToString()) * rate).ToString();
                gCartRequest.AddMerchantPrivateDataNode(amountNode);

                XmlNode currencyNode = tempDoc.CreateElement("selectedCurrency");
                currencyNode.InnerText = SelectedCurrency;
                gCartRequest.AddMerchantPrivateDataNode(currencyNode);

                XmlNode portalIDNode = tempDoc.CreateElement("portalID");
                portalIDNode.InnerText = portalID.ToString();
                gCartRequest.AddMerchantPrivateDataNode(portalIDNode);

                XmlNode customerIDNode = tempDoc.CreateElement("customerID");
                customerIDNode.InnerText = customerID.ToString();
                gCartRequest.AddMerchantPrivateDataNode(customerIDNode);

                XmlNode itemIdsNode = tempDoc.CreateElement("itemIds");
                itemIdsNode.InnerText = itemidsWithVar;
                gCartRequest.AddMerchantPrivateDataNode(itemIdsNode);

                XmlNode storeIDNode = tempDoc.CreateElement("storeID");
                storeIDNode.InnerText = storeID.ToString();
                gCartRequest.AddMerchantPrivateDataNode(storeIDNode);

                XmlNode couponCodeNode = tempDoc.CreateElement("couponCode");
                couponCodeNode.InnerText = couponCode;
                gCartRequest.AddMerchantPrivateDataNode(couponCodeNode);

                XmlNode sessionCodeNode = tempDoc.CreateElement("sessionCode");
                sessionCodeNode.InnerText = sessionCode;
                gCartRequest.AddMerchantPrivateDataNode(sessionCodeNode);

                XmlNode pgIDNode = tempDoc.CreateElement("pgID");
                pgIDNode.InnerText = Session["GateWay"].ToString();
                gCartRequest.AddMerchantPrivateDataNode(pgIDNode);

                XmlNode MerchantIDNode = tempDoc.CreateElement("MerchantID");
                MerchantIDNode.InnerText = sf[0].GoogleMerchantID;
                gCartRequest.AddMerchantPrivateDataNode(MerchantIDNode);

                XmlNode MerchantKeyNode = tempDoc.CreateElement("MerchantKey");
                MerchantKeyNode.InnerText = sf[0].GoogleMerchantKey;
                gCartRequest.AddMerchantPrivateDataNode(MerchantKeyNode);

                //Get response
                GCheckoutResponse response = gCartRequest.Send();
                // Post the request for Google checkout

                if (response.IsGood)
                {
                    Response.Redirect(response.RedirectUrl, false);
                }
            }
        }
        catch (Exception ex)
        {
            lblnotity.Text    = "Something goes wrong, hit refresh or go back to checkout";
            clickhere.Visible = false;
            ProcessException(ex);
        }
    }
        /// <summary>
        /// Post cart to google
        /// </summary>
        /// <param name="req">Pre-generated request</param>
        /// <param name="cart">Shopping cart</param>
        /// <returns>Response</returns>
        public GCheckoutResponse PostCartToGoogle(CheckoutShoppingCartRequest req,
                                                  NopSolutions.NopCommerce.BusinessLogic.Orders.ShoppingCart cart)
        {
            //items
            foreach (NopSolutions.NopCommerce.BusinessLogic.Orders.ShoppingCartItem sci in cart)
            {
                ProductVariant productVariant = sci.ProductVariant;
                if (productVariant != null)
                {
                    string  description = ProductAttributeHelper.FormatAttributes(productVariant, sci.AttributesXml, NopContext.Current.User, ", ", false);
                    string  fullName    = productVariant.FullProductName;
                    decimal unitPrice   = TaxManager.GetPrice(sci.ProductVariant, PriceHelper.GetUnitPrice(sci, NopContext.Current.User, true));
                    req.AddItem(fullName, description, sci.ShoppingCartItemId.ToString(), unitPrice, sci.Quantity);
                }
            }

            //discounts
            decimal  subTotalDiscountBase = decimal.Zero;
            Discount appliedDiscount      = null;
            //List<AppliedGiftCard> appliedGiftCards = null;
            decimal subtotalBaseWithoutPromo = decimal.Zero;
            decimal subtotalBaseWithPromo    = decimal.Zero;
            string  SubTotalError            = ShoppingCartManager.GetShoppingCartSubTotal(cart,
                                                                                           NopContext.Current.User, out subTotalDiscountBase,
                                                                                           out appliedDiscount,
                                                                                           out subtotalBaseWithoutPromo, out subtotalBaseWithPromo);

            if (subTotalDiscountBase > decimal.Zero)
            {
                req.AddItem("Discount", string.Empty, string.Empty, (decimal)(-1.0) * subTotalDiscountBase, 1);
            }
            //foreach (AppliedGiftCard agc in appliedGiftCards)
            //{
            //    req.AddItem(string.Format("Gift Card - {0}", agc.GiftCard.GiftCardCouponCode), string.Empty, string.Empty, (decimal)(-1.0) * agc.AmountCanBeUsed, 1);
            //}

            bool shoppingCartRequiresShipping = ShippingManager.ShoppingCartRequiresShipping(cart);

            if (shoppingCartRequiresShipping)
            {
                string shippingError = string.Empty;
                //TODO AddMerchantCalculatedShippingMethod
                //TODO AddCarrierCalculatedShippingOption
                ShippingOptionCollection shippingOptions = ShippingManager.GetShippingOptions(cart, NopContext.Current.User, null, ref shippingError);
                foreach (ShippingOption shippingOption in shippingOptions)
                {
                    req.AddFlatRateShippingMethod(shippingOption.Name, TaxManager.GetShippingPrice(shippingOption.Rate, NopContext.Current.User));
                }
            }

            //add only US, GB states
            //CountryCollection countries = CountryManager.GetAllCountries();
            //foreach (Country country in countries)
            //{
            //    foreach (StateProvince state in country.StateProvinces)
            //    {
            //        TaxByStateProvinceCollection taxByStateProvinceCollection = TaxByStateProvinceManager.GetAllByStateProvinceID(state.StateProvinceID);
            //        foreach (TaxByStateProvince taxByStateProvince in taxByStateProvinceCollection)
            //        {
            //            if (!String.IsNullOrEmpty(state.Abbreviation))
            //            {
            //                Req.AddStateTaxRule(state.Abbreviation, (double)taxByStateProvince.Percentage, false);
            //            }
            //        }
            //    }
            //}

            XmlDocument customerInfoDoc = new XmlDocument();
            XmlElement  customerInfo    = customerInfoDoc.CreateElement("CustomerInfo");

            customerInfo.SetAttribute("CustomerID", NopContext.Current.User.CustomerId.ToString());
            customerInfo.SetAttribute("CustomerLanguageID", NopContext.Current.WorkingLanguage.LanguageId.ToString());
            customerInfo.SetAttribute("CustomerCurrencyID", NopContext.Current.WorkingCurrency.CurrencyId.ToString());
            req.AddMerchantPrivateDataNode(customerInfo);

            req.ContinueShoppingUrl = CommonHelper.GetStoreLocation(false);
            req.EditCartUrl         = CommonHelper.GetStoreLocation(false) + "ShoppingCart.aspx";

            GCheckoutResponse resp = req.Send();

            return(resp);
        }
        /// <summary>
        /// Post cart to google
        /// </summary>
        /// <param name="req">Pre-generated request</param>
        /// <param name="cart">Shopping cart</param>
        /// <returns>Response</returns>
        public GCheckoutResponse PostCartToGoogle(CheckoutShoppingCartRequest req,
                                                  IList <Core.Domain.Orders.ShoppingCartItem> cart)
        {
            //there's no need to round prices (Math.Round(,2)) because GCheckout library does it for us
            //items
            foreach (Core.Domain.Orders.ShoppingCartItem sci in cart)
            {
                var productVariant = sci.ProductVariant;
                if (productVariant != null)
                {
                    decimal taxRate     = decimal.Zero;
                    string  description = _productAttributeFormatter.FormatAttributes(productVariant, sci.AttributesXml, _workContext.CurrentCustomer, ", ", false);
                    string  fullName    = "";
                    if (!String.IsNullOrEmpty(sci.ProductVariant.GetLocalized(x => x.Name)))
                    {
                        fullName = string.Format("{0} ({1})", sci.ProductVariant.Product.GetLocalized(x => x.Name), sci.ProductVariant.GetLocalized(x => x.Name));
                    }
                    else
                    {
                        fullName = sci.ProductVariant.Product.GetLocalized(x => x.Name);
                    }
                    decimal unitPrice = _taxService.GetProductPrice(sci.ProductVariant, _priceCalculationService.GetUnitPrice(sci, true), out taxRate);
                    req.AddItem(fullName, description, sci.Id.ToString(), unitPrice, sci.Quantity);
                }
            }

            if (cart.RequiresShipping())
            {
                //AddMerchantCalculatedShippingMethod
                //AddCarrierCalculatedShippingOption
                var shippingOptions = _shippingService.GetShippingOptions(cart, null);
                foreach (ShippingOption shippingOption in shippingOptions.ShippingOptions)
                {
                    req.AddFlatRateShippingMethod(shippingOption.Name, _taxService.GetShippingPrice(shippingOption.Rate, _workContext.CurrentCustomer));
                }
            }

            //add only US, GB states
            //CountryCollection countries = IoC.Resolve<ICountryService>().GetAllCountries();
            //foreach (Country country in countries)
            //{
            //    foreach (StateProvince state in country.StateProvinces)
            //    {
            //        TaxByStateProvinceCollection taxByStateProvinceCollection = TaxByIoC.Resolve<IStateProvinceService>().GetAllByStateProvinceID(state.StateProvinceID);
            //        foreach (TaxByStateProvince taxByStateProvince in taxByStateProvinceCollection)
            //        {
            //            if (!String.IsNullOrEmpty(state.Abbreviation))
            //            {
            //                Req.AddStateTaxRule(state.Abbreviation, (double)taxByStateProvince.Percentage, false);
            //            }
            //        }
            //    }
            //}

            //if (subTotalDiscountBase > decimal.Zero)
            //{
            //    req.AddItem("Discount", string.Empty, string.Empty, (decimal)(-1.0) * subTotalDiscountBase, 1);
            //}

            //foreach (AppliedGiftCard agc in appliedGiftCards)
            //{
            //    req.AddItem(string.Format("Gift Card - {0}", agc.GiftCard.GiftCardCouponCode), string.Empty, string.Empty, (decimal)(-1.0) * agc.AmountCanBeUsed, 1);
            //}

            var        customerInfoDoc = new XmlDocument();
            XmlElement customerInfo    = customerInfoDoc.CreateElement("CustomerInfo");

            customerInfo.SetAttribute("CustomerID", _workContext.CurrentCustomer.Id.ToString());
            customerInfo.SetAttribute("CustomerLanguageID", _workContext.WorkingLanguage.Id.ToString());
            customerInfo.SetAttribute("CustomerCurrencyID", _workContext.WorkingCurrency.Id.ToString());
            req.AddMerchantPrivateDataNode(customerInfo);

            req.ContinueShoppingUrl = _webHelper.GetStoreLocation(false);
            req.EditCartUrl         = _webHelper.GetStoreLocation(false) + "cart";

            GCheckoutResponse resp = req.Send();

            return(resp);
        }
        protected void GCheckoutButton_Click(object sender, ImageClickEventArgs e)
        {
            if (_BasketGrid != null)
            {
                //First Save the updated Basket
                AbleCommerce.Code.BasketHelper.SaveBasket(_BasketGrid);
            }

            GCheckoutButton.Currency = AbleContext.Current.Store.BaseCurrency.ISOCode;
            CheckoutShoppingCartRequest Req = GCheckoutButton.CreateRequest();

            System.Xml.XmlDocument tempDoc = new System.Xml.XmlDocument();

            Basket basket = AbleContext.Current.User.Basket;

            // Add a "BasketId" node.
            System.Xml.XmlNode tempNode2 = tempDoc.CreateElement("BasketId");
            tempNode2.InnerText = basket.Id.ToString();
            Req.AddMerchantPrivateDataNode(tempNode2);

            tempNode2           = tempDoc.CreateElement("BasketContentHash");
            tempNode2.InnerText = GetBasketContentHash(basket);
            Req.AddMerchantPrivateDataNode(tempNode2);

            // We just created this structure on the order level:
            // <merchant-private-data>
            //   <BasketId xmlns="">xxxxxx</BasketId>
            // </merchant-private-data>

            // Now we are going to add the basket items.
            XmlNode[] itemPrivateData;
            foreach (BasketItem item in basket.Items)
            {
                switch (item.OrderItemType)
                {
                case OrderItemType.Product:
                    itemPrivateData = BuildPrivateData(item);
                    bool isDigitalContent = item.Product == null ? false : item.Product.IsDigitalGood;
                    if (isDigitalContent)
                    {
                        Req.AddItem(AcHelper.SanitizeText(item.Name), AcHelper.SanitizeText(item.Product.Description), (Decimal)item.Price, item.Quantity, isDigitalContent, AcHelper.SanitizeText(string.Format("The download will be available from your {0} order receipt once payment is processed.", AbleContext.Current.Store.Name)), itemPrivateData);
                    }
                    else
                    {
                        Req.AddItem(AcHelper.SanitizeText(item.Name), AcHelper.SanitizeText(item.Product.Description), (Decimal)item.Price, item.Quantity, itemPrivateData);
                    }
                    break;

                case OrderItemType.Charge:
                    itemPrivateData = BuildPrivateData(item);
                    Req.AddItem(AcHelper.SanitizeText(item.Name), "Charge", (Decimal)item.Price, item.Quantity, itemPrivateData);
                    break;

                case OrderItemType.Credit:
                    itemPrivateData = BuildPrivateData(item);
                    Req.AddItem(AcHelper.SanitizeText(item.Name), "Credit", (Decimal)item.Price, item.Quantity, itemPrivateData);
                    break;

                case OrderItemType.GiftWrap:
                    itemPrivateData = BuildPrivateData(item);
                    Req.AddItem(AcHelper.SanitizeText(item.Name), "Gift Wrapping", (Decimal)item.Price, item.Quantity, itemPrivateData);
                    break;

                case OrderItemType.Coupon:     //on callback as well
                    itemPrivateData = BuildPrivateData(item);
                    Req.AddItem(AcHelper.SanitizeText(item.Name), "Your coupon has been applied.", (Decimal)item.Price, item.Quantity, itemPrivateData);
                    break;

                case OrderItemType.Discount:
                    itemPrivateData = BuildPrivateData(item);
                    Req.AddItem(AcHelper.SanitizeText(item.Name), "Discount", (Decimal)item.Price, item.Quantity, itemPrivateData);
                    break;

                case OrderItemType.GiftCertificate:     //on callback
                    break;

                case OrderItemType.Handling:     //on callback
                    break;

                case OrderItemType.Shipping:     //on callback
                    break;

                case OrderItemType.Tax:     //on callback
                    break;
                }
            }

            //setup other settings
            Req.AcceptMerchantCoupons          = GCheckoutButton.GatewayInstance.CouponsEnabled;
            Req.AcceptMerchantGiftCertificates = GCheckoutButton.GatewayInstance.GiftCertificatesEnabled;
            //Req.CartExpiration = expirationDate;
            string storeDomain  = UrlHelper.GetDomainFromUrl(AbleContext.Current.Store.StoreUrl);
            string storeBaseUrl = "http://" + storeDomain;

            Req.ContinueShoppingUrl   = storeBaseUrl + this.ResolveUrl("~/Default.aspx");
            Req.EditCartUrl           = storeBaseUrl + this.ResolveUrl("~/Basket.aspx");
            Req.MerchantCalculatedTax = true;
            //add at least one tax rule
            Req.AddZipTaxRule("99999", 0F, false);
            string storeBaseSecureUrl = AbleContext.Current.Store.Settings.SSLEnabled ? storeBaseUrl.Replace("http://", "https://") : storeBaseUrl;

            Req.MerchantCalculationsUrl = storeBaseSecureUrl + this.ResolveUrl("~/Checkout/Google/MerchantCalc.ashx");
            Req.PlatformID = 769150108975916;
            Req.RequestBuyerPhoneNumber = true;
            Req.SetExpirationMinutesFromNow(GCheckoutButton.GatewayInstance.ExpirationMinutes);

            //add ship methods
            IList <ShipMethod>   shipMethods      = ShipMethodDataSource.LoadAll();
            List <string>        shipMethodsAdded = new List <string>();
            string               shipMethName;
            decimal              basketTotal      = basket.Items.TotalPrice();
            decimal              defaultRate      = GCheckoutButton.GatewayInstance.DefaultShipRate;
            ShippingRestrictions shipRestrictions = new ShippingRestrictions();

            shipRestrictions.AddAllowedWorldArea();

            foreach (ShipMethod shipMethod in shipMethods)
            {
                if (!shipMethod.Name.Equals("Unknown(GoogleCheckout)") &&
                    (shipMethod.MinPurchase <= 0 || shipMethod.MinPurchase <= basketTotal))
                {
                    //add all other shipmethods as merchant calculated irrespective of whether they
                    //are applicable or not. It will be determined on call-back
                    //GoogleCheckout does not allow to mix merchant calculated shipping methods with other methods
                    if (shipMethod.ShipMethodType == ShipMethodType.FlatRate)
                    {
                        defaultRate = GetFlatShipRate(shipMethod);
                    }
                    else
                    {
                        defaultRate = GCheckoutButton.GatewayInstance.DefaultShipRate;
                    }
                    shipMethName = BuildShipMethodName(shipMethod, shipMethodsAdded);
                    Req.AddMerchantCalculatedShippingMethod(shipMethName, defaultRate, shipRestrictions, shipRestrictions);
                    shipMethodsAdded.Add(shipMethName.ToLowerInvariant());
                }
            }

            GCheckoutResponse Resp = Req.Send();

            if (Resp.IsGood)
            {
                Response.Redirect(Resp.RedirectUrl, true);
            }
            else
            {
                DataList msgList;
                if (_WarningMessageList != null)
                {
                    msgList = _WarningMessageList;
                }
                else
                {
                    msgList            = GCWarningMessageList;
                    phWarnings.Visible = true;
                }
                if (msgList != null)
                {
                    List <string> googleMessages = new List <string>();
                    googleMessages.Add("Google Checkout Failed.");
                    googleMessages.Add("Google Checkout Response.IsGood = " + Resp.IsGood);
                    googleMessages.Add("Google Checkout Error Message = " + Resp.ErrorMessage);
                    msgList.DataSource = googleMessages;
                    msgList.DataBind();
                }
            }
        }
        public void TestAddItem()
        {
            //due to the complexity of the add items. we are going to create a known set of data points and add them to the collection.
            ShoppingCartItem si = new ShoppingCartItem();

            si.Description             = "Description";
            si.DigitalContent          = new DigitalItem("Digital Item Key", "Digital Item Description");
            si.MerchantItemID          = "Merchant Item ID";
            si.MerchantPrivateItemData = "Private Data";

            XmlDocument mpdDoc = new XmlDocument();

            mpdDoc.LoadXml("<data />");
            mpdDoc.DocumentElement.AppendChild(mpdDoc.CreateElement("node1"));
            mpdDoc.DocumentElement.AppendChild(mpdDoc.CreateElement("node2"));
            XmlNode[] mpdNodes = new XmlNode[] { mpdDoc.DocumentElement.ChildNodes[0], mpdDoc.DocumentElement.ChildNodes[1] };

            si.MerchantPrivateItemDataNodes = mpdNodes;
            si.Name     = "Name";
            si.Price    = 0.99m;
            si.Quantity = 1;

            AlternateTaxTable taxTable = new AlternateTaxTable("Example");

            taxTable.AddStateTaxRule("OH", .06);

            si.TaxTable = taxTable;
            si.Weight   = 10.5;

            si.TaxTable.AddCountryTaxRule(GCheckout.AutoGen.USAreas.ALL, 5.0);

            CheckoutShoppingCartRequest request = new CheckoutShoppingCartRequest(MERCHANT_ID, MERCHANT_KEY, EnvironmentType.Sandbox, "USD", 120);

            request.ContinueShoppingUrl            = "http://localhost/";
            request.AnalyticsData                  = "Test data";
            request.PlatformID                     = 1234567890;
            request.EditCartUrl                    = "http://localhost/editcart.aspx";
            request.RequestBuyerPhoneNumber        = true;
            request.MerchantCalculationsUrl        = "http://localhost/calculate.aspx";
            request.AcceptMerchantCoupons          = true;
            request.AcceptMerchantGiftCertificates = true;
            request.SetRoundingPolicy(RoundingMode.FLOOR, RoundingRule.TOTAL);
            request.AddShippingPackage("main", "Cleveland", "OH", "44114");

            request.MerchantPrivateData = "Test Cool Stuff";
            request.AddMerchantPrivateDataNode(mpdNodes[0]);

            XmlNode[] mpdn = request.MerchantPrivateDataNodes;

            Assert.AreSame(mpdn[0], mpdNodes[0]);

            try {
                request.AddItem(null);
                Assert.Fail("Null can't be passed to the AddItem methods");
            }
            catch {
            }

            try {
                MethodInfo mi = typeof(CheckoutShoppingCartRequest).GetMethod("AddItem", new Type[] { typeof(IShoppingCartItem) });
                mi.Invoke(request, new object[] { null });
                Assert.Fail("Null can't be passed to the AddItem methods");
            }
            catch {
            }

            request.AddItem(si);
            request.AddItem(si.Clone() as IShoppingCartItem);

            MethodInfo[] methods = typeof(CheckoutShoppingCartRequest).GetMethods();

            foreach (MethodInfo mi in methods)
            {
                bool cancel = false;
                //we are only working with AddItems
                if (mi.Name == "AddItem")
                {
                    Type             sct        = typeof(ShoppingCartItem);
                    ShoppingCartItem si2        = si.Clone() as ShoppingCartItem;
                    ParameterInfo[]  parameters = mi.GetParameters();
                    object[]         setter     = new object[parameters.Length];
                    for (int i = 0; i < parameters.Length; i++)
                    {
                        ParameterInfo pi = parameters[i];
                        if (pi.ParameterType == typeof(ShoppingCartItem) || pi.ParameterType == typeof(IShoppingCartItem))
                        {
                            cancel = true;
                            continue;
                        }
                        //get the property from the object
                        PropertyInfo source;
                        if (pi.Name != "digitalItem")
                        {
                            source = sct.GetProperty(pi.Name, BindingFlags.IgnoreCase | BindingFlags.Public | BindingFlags.Instance);
                        }
                        else
                        {
                            source = sct.GetProperty("DigitalContent");
                        }
                        setter[i] = source.GetValue(si2, null);

                        //we want to split and take the first item
                        if (!pi.ParameterType.IsArray && source.PropertyType.IsArray)
                        {
                            object[] vals = setter[i] as object[];
                            setter[i] = vals[0] as object;
                        }
                    }
                    if (!cancel)
                    {
                        //now call the method
                        ShoppingCartItem called = mi.Invoke(request, setter) as ShoppingCartItem;

                        //this is to fix a params array issue.
                        if (parameters[parameters.Length - 1].Name == "MerchantPrivateItemDataNodes")
                        {
                            called.MerchantPrivateItemDataNodes = si2.MerchantPrivateItemDataNodes;
                        }
                    }
                }
            }

            byte[] toXml = request.GetXml();

            //Make sure we can add an item to the cart.
            ShoppingCartItem item = request.AddItem("Item 1", "Cool Candy 1", "Merchant Item ID", 2.00M, 1);

            item.Weight = 2.2;
            item.MerchantPrivateItemData = null; //perform a null check

            //verify we can't set the price to fractions.

            item.Price = 1.975m;
            Assert.AreEqual(1.98m, item.Price);

            item.Price = 1.994m;
            Assert.AreEqual(1.99m, item.Price);

            Assert.AreEqual(2.2, item.Weight);
            Assert.AreEqual("Merchant Item ID", item.MerchantItemID);

            //this is a very specific test to make sure that if only one node exists, return it. it may be for a reason.

            XmlDocument doc = new XmlDocument();

            doc.LoadXml("<data />");
            doc.DocumentElement.SetAttribute("test", "cool");

            string xml = doc.OuterXml;

            item.MerchantPrivateItemDataNodes = new XmlNode[] { doc.DocumentElement };
            string xmlReturn = item.MerchantPrivateItemData;

            Assert.AreEqual(xml, xmlReturn);

            //create a new node
            XmlNode secondNode = doc.DocumentElement.AppendChild(doc.CreateElement("test"));

            item.MerchantPrivateItemDataNodes = new XmlNode[] { doc.DocumentElement, secondNode };

            xmlReturn = item.MerchantPrivateItemData;
            Assert.AreEqual(null, xmlReturn);

            item.MerchantPrivateItemDataNodes = null;
            Assert.AreEqual(new XmlNode[] { }, item.MerchantPrivateItemDataNodes);

            //this should throw an exception
            try {
                item.Weight = -1;
                Assert.Fail("Weight should not be allowed to be negative.");
            }
            catch {
            }

            //create a new instance of the cart item
            ShoppingCartItem testItem = new ShoppingCartItem();
        }
        public void TestExamples()
        {
            CheckoutShoppingCartRequest request = new CheckoutShoppingCartRequest(MERCHANT_ID, MERCHANT_KEY, EnvironmentType.Sandbox, "USD", 120);

            //Make sure we can add an item to the cart.
            request.AddItem("Item 1", "Cool Candy 1", 2.00M, 1);

            request.AddStateTaxRule("CT", .06, true);

            byte[] cart = request.GetXml();

            //Console.WriteLine(EncodeHelper.Utf8BytesToString(cart));

            //test to see if the item can desialize
            Assert.IsNotNull(GCheckout.Util.EncodeHelper.Deserialize(cart));


            //example 2

            request = new CheckoutShoppingCartRequest(MERCHANT_ID, MERCHANT_KEY, EnvironmentType.Sandbox, "USD", 120);

            //Make sure we can add an item to the cart.
            request.AddItem("Item 1", "Cool Candy 1", 2.00M, 1);

            request.AddStateTaxRule("CT", .06, true);
            request.AddStateTaxRule("MD", .05, false);

            cart = request.GetXml();

            //Console.WriteLine(EncodeHelper.Utf8BytesToString(cart));

            //test to see if the item can desialize
            Assert.IsNotNull(GCheckout.Util.EncodeHelper.Deserialize(cart));

            //example 2a

            request = new CheckoutShoppingCartRequest(MERCHANT_ID, MERCHANT_KEY, EnvironmentType.Sandbox, "USD", 120);

            //Make sure we can add an item to the cart.
            request.AddItem("Item 1", "Cool Candy 1", 2.00M, 1);

            cart = request.GetXml();

            //Console.WriteLine(EncodeHelper.Utf8BytesToString(cart));

            //test to see if the item can desialize
            Assert.IsNotNull(GCheckout.Util.EncodeHelper.Deserialize(cart));


            //example 3

            request = new CheckoutShoppingCartRequest(MERCHANT_ID, MERCHANT_KEY, EnvironmentType.Sandbox, "USD", 120);

            //Make sure we can add an item to the cart.
            request.AddItem("Item 1", "Cool Candy 1", 2.00M, 1);

            request.AddZipTaxRule("100*", 0.08375, false);
            request.AddStateTaxRule("NY", 0.0400, true);

            //this should be an invalid format
            try {
                request.AddZipTaxRule("255333", .05, true);
                Assert.Fail("255333 should not be a correct zip code format");
            }
            catch {
            }

            cart = request.GetXml();

            //Console.WriteLine(EncodeHelper.Utf8BytesToString(cart));

            //test to see if the item can desialize
            Assert.IsNotNull(GCheckout.Util.EncodeHelper.Deserialize(cart));

            request.AddMerchantCalculatedShippingMethod("Test 1", 12.11m);
            request.AddMerchantCalculatedShippingMethod("Test 2", 4.95m, new ShippingRestrictions());
            request.AddMerchantCalculatedShippingMethod("Test 3", 5.95m, new ShippingRestrictions());
            request.AddMerchantCalculatedShippingMethod("MerchantCalc", 12.95m, new ShippingRestrictions(), new ShippingRestrictions());

            //create a pickup shipping method
            request = new CheckoutShoppingCartRequest(MERCHANT_ID, MERCHANT_KEY, EnvironmentType.Sandbox, "USD", 120);
            request.AddPickupShippingMethod("Name", 4.95m);
            request.AddCountryTaxRule(GCheckout.AutoGen.USAreas.ALL, .05, true);
            request.AddWorldAreaTaxRule(.02, true);
            //Tax Canada at 5%
            request.AddPostalAreaTaxRule("CA", .05, true);

            //Tax all cities that start with L4L at 7%
            request.AddPostalAreaTaxRule("CA", "L4L*", .07, true);

            XmlDocument doc = new XmlDocument();

            doc.LoadXml("<data />");
            request.AddMerchantPrivateDataNode(doc.DocumentElement);

            //we must pass in a valid node
            try {
                request.AddMerchantPrivateDataNode(null);
                Assert.Fail("Null can't be sent to AddMerchantPrivateDataNode.");
            }
            catch {
            }
        }
Ejemplo n.º 7
0
        /// <summary>
        /// Post cart to google
        /// </summary>
        /// <param name="Req">Pre-generated request</param>
        /// <param name="Cart">Shopping cart</param>
        /// <returns>Response</returns>
        public GCheckoutResponse PostCartToGoogle(CheckoutShoppingCartRequest Req, NopSolutions.NopCommerce.BusinessLogic.Orders.ShoppingCart Cart)
        {
            foreach (NopSolutions.NopCommerce.BusinessLogic.Orders.ShoppingCartItem sci in Cart)
            {
                ProductVariant productVariant = sci.ProductVariant;
                if (productVariant != null)
                {
                    string  pvAttributeDescription = ProductAttributeHelper.FormatAttributes(productVariant, sci.AttributesXML, NopContext.Current.User, ", ", false);
                    string  fullName    = productVariant.FullProductName;
                    string  description = pvAttributeDescription;
                    decimal unitPrice   = TaxManager.GetPrice(sci.ProductVariant, PriceHelper.GetUnitPrice(sci, NopContext.Current.User, true));
                    Req.AddItem(fullName, description, sci.ShoppingCartItemID.ToString(), unitPrice, sci.Quantity);
                }
            }

            decimal shoppingCartSubTotalDiscount;
            decimal shoppingCartSubTotal = ShoppingCartManager.GetShoppingCartSubTotal(Cart, NopContext.Current.User, out shoppingCartSubTotalDiscount);

            if (shoppingCartSubTotalDiscount > decimal.Zero)
            {
                Req.AddItem("Discount", string.Empty, string.Empty, (decimal)(-1.0) * shoppingCartSubTotalDiscount, 1);
            }

            bool shoppingCartRequiresShipping = ShippingManager.ShoppingCartRequiresShipping(Cart);

            if (shoppingCartRequiresShipping)
            {
                string shippingError = string.Empty;
                //TODO AddMerchantCalculatedShippingMethod
                //TODO AddCarrierCalculatedShippingOption
                ShippingOptionCollection shippingOptions = ShippingManager.GetShippingOptions(Cart, NopContext.Current.User, null, ref shippingError);
                foreach (ShippingOption shippingOption in shippingOptions)
                {
                    Req.AddFlatRateShippingMethod(shippingOption.Name, TaxManager.GetShippingPrice(shippingOption.Rate, NopContext.Current.User));
                }
            }

            //add only US, GB states
            //CountryCollection countries = CountryManager.GetAllCountries();
            //foreach (Country country in countries)
            //{
            //    foreach (StateProvince state in country.StateProvinces)
            //    {
            //        TaxByStateProvinceCollection taxByStateProvinceCollection = TaxByStateProvinceManager.GetAllByStateProvinceID(state.StateProvinceID);
            //        foreach (TaxByStateProvince taxByStateProvince in taxByStateProvinceCollection)
            //        {
            //            if (!String.IsNullOrEmpty(state.Abbreviation))
            //            {
            //                Req.AddStateTaxRule(state.Abbreviation, (double)taxByStateProvince.Percentage, false);
            //            }
            //        }
            //    }
            //}

            XmlDocument customerInfoDoc = new XmlDocument();
            XmlElement  customerInfo    = customerInfoDoc.CreateElement("CustomerInfo");

            customerInfo.SetAttribute("CustomerID", NopContext.Current.User.CustomerID.ToString());
            customerInfo.SetAttribute("CustomerLanguageID", NopContext.Current.WorkingLanguage.LanguageID.ToString());
            customerInfo.SetAttribute("CustomerCurrencyID", NopContext.Current.WorkingCurrency.CurrencyID.ToString());
            Req.AddMerchantPrivateDataNode(customerInfo);

            Req.ContinueShoppingUrl = CommonHelper.GetStoreLocation(false);
            Req.EditCartUrl         = CommonHelper.GetStoreLocation(false) + "ShoppingCart.aspx";

            GCheckoutResponse Resp = Req.Send();

            return(Resp);
        }