Пример #1
0
        /// <summary>
        /// Process the Xml Message
        /// </summary>
        /// <param name="CallbackXML">The Callback message to process</param>
        /// <returns>The <see cref="AutoGen.MerchantCalculationResults"/>
        /// that is returned to Google Checkout</returns>
        public byte[] Process(string CallbackXML)
        {
            // Deserialize the callback request.
            AutoGen.MerchantCalculationCallback Callback =
                (AutoGen.MerchantCalculationCallback)
                EncodeHelper.Deserialize
                    (CallbackXML, typeof(AutoGen.MerchantCalculationCallback));
            // Create the callback response.
            AutoGen.MerchantCalculationResults RetVal =
                new AutoGen.MerchantCalculationResults();
            // Create the order.
            Order ThisOrder = new Order(Callback);

            // Are there shipping methods?
            string[] ShippingMethods = new string[1] {
                ""
            };
            if (Callback.calculate.shipping != null &&
                Callback.calculate.shipping.Length > 0)
            {
                ShippingMethods = new string[Callback.calculate.shipping.Length];
                for (int s = 0; s < ShippingMethods.Length; s++)
                {
                    ShippingMethods[s] = Callback.calculate.shipping[s].name;
                }
            }

            RetVal.results =
                new AutoGen.Result
                [Callback.calculate.addresses.Length * ShippingMethods.Length];
            int ResultIndex = 0;

            for (int a = 0; a < Callback.calculate.addresses.Length; a++)
            {
                for (int s = 0; s < ShippingMethods.Length; s++)
                {
                    AutoGen.Result ThisResult = new AutoGen.Result();
                    ThisResult.addressid = Callback.calculate.addresses[a].id;
                    AnonymousAddress ThisAddress =
                        new AnonymousAddress(Callback.calculate.addresses[a]);
                    // Check shipping, if requested.
                    if (ShippingMethods[s] != string.Empty)
                    {
                        ThisResult.shippingname = ShippingMethods[s];
                        ShippingResult SResult =
                            _Rules.GetShippingResult
                                (ShippingMethods[s], ThisOrder, ThisAddress);
                        ThisResult.shippableSpecified    = true;
                        ThisResult.shippable             = SResult.Shippable;
                        ThisResult.shippingrate          = new AutoGen.ResultShippingrate();
                        ThisResult.shippingrate.currency = _currency;
                        ThisResult.shippingrate.Value    = SResult.ShippingRate;
                    }
                    // Check tax, if requested.
                    if (Callback.calculate.tax)
                    {
                        ThisResult.totaltax          = new AutoGen.ResultTotaltax();
                        ThisResult.totaltax.currency = _currency;
                        ThisResult.totaltax.Value    =
                            _Rules.GetTaxResult
                                (ThisOrder, ThisAddress,
                                (ThisResult.shippingrate != null ?
                                 ThisResult.shippingrate.Value : 0));
                    }
                    // Check merchant codes.
                    if (Callback.calculate.merchantcodestrings != null)
                    {
                        ThisResult.merchantcoderesults =
                            new AutoGen.ResultMerchantcoderesults();
                        ThisResult.merchantcoderesults.Items =
                            new object[Callback.calculate.merchantcodestrings.Length];
                        ArrayList UsedMerchantCodes = new ArrayList();
                        for (int c = 0; c < Callback.calculate.merchantcodestrings.Length;
                             c++)
                        {
                            MerchantCodeResult MCR;
                            string             CurrentMerchantCode =
                                Callback.calculate.merchantcodestrings[c].code;
                            if (UsedMerchantCodes.Contains(CurrentMerchantCode.ToUpper()))
                            {
                                AutoGen.CouponResult CouponResult = new AutoGen.CouponResult();
                                CouponResult.calculatedamount
                                    = new AutoGen.CouponResultCalculatedamount();
                                CouponResult.calculatedamount.currency = _currency;
                                CouponResult.calculatedamount.Value    = 0;
                                CouponResult.code    = CurrentMerchantCode;
                                CouponResult.message = "Code already used.";
                                CouponResult.valid   = false;
                                ThisResult.merchantcoderesults.Items[c] = CouponResult;
                            }
                            else
                            {
                                MCR =
                                    _Rules.GetMerchantCodeResult
                                        (ThisOrder, ThisAddress, CurrentMerchantCode, (ThisResult.shippingrate != null ?
                                                                                       ThisResult.shippingrate.Value : 0));
                                if (MCR.Type == MerchantCodeType.GiftCertificate)
                                {
                                    AutoGen.GiftCertificateResult GCResult =
                                        new AutoGen.GiftCertificateResult();
                                    GCResult.calculatedamount
                                        = new AutoGen.GiftCertificateResultCalculatedamount();
                                    GCResult.calculatedamount.currency = _currency;
                                    GCResult.calculatedamount.Value    = MCR.Amount;
                                    GCResult.code    = CurrentMerchantCode;
                                    GCResult.message = MCR.Message;
                                    GCResult.valid   = MCR.Valid;
                                    ThisResult.merchantcoderesults.Items[c] = GCResult;
                                    UsedMerchantCodes.Add(CurrentMerchantCode.ToUpper());
                                }
                                else
                                {
                                    AutoGen.CouponResult CouponResult =
                                        new AutoGen.CouponResult();
                                    CouponResult.calculatedamount
                                        = new AutoGen.CouponResultCalculatedamount();
                                    CouponResult.calculatedamount.currency = _currency;
                                    CouponResult.calculatedamount.Value    = MCR.Amount;
                                    CouponResult.code    = CurrentMerchantCode;
                                    CouponResult.message = MCR.Message;
                                    CouponResult.valid   = MCR.Valid;
                                    ThisResult.merchantcoderesults.Items[c] = CouponResult;
                                    UsedMerchantCodes.Add(CurrentMerchantCode.ToUpper());
                                }
                            }
                        }
                    }
                    RetVal.results[ResultIndex] = ThisResult;
                    ResultIndex++;
                }
            }

            return(EncodeHelper.Serialize(RetVal));
        }