/// <summary>
        /// Popula o objeto RequestBase em comum a todos.
        /// </summary>
        private void FillRequestBase(String operation, String merchantId, String merchantKey, String referenceNum, decimal chargeTotal, String creditCardNumber
                , String expMonth, String expYear, String cvvInd, String cvvNumber, String authentication, String processorId
                , String numberOfInstallments, String chargeInterest, String ipAddress, String customerIdExt, String currencyCode
                , String fraudCheck, String softDescriptor, decimal? iataFee) {

            this.request = new TransactionRequest(merchantId, merchantKey);

            Order order = this.request.Order;
            RequestBase rBase = new RequestBase();

            if (operation.Equals("sale"))
                order.Sale = rBase;
            else if (operation.Equals("auth"))
                order.Auth = rBase;

            rBase.ReferenceNum = referenceNum;
            rBase.ProcessorId = processorId;
            rBase.Authentication = authentication;
            rBase.IpAddress = ipAddress;
            rBase.CustomerIdExt = customerIdExt;
            rBase.FraudCheck = fraudCheck;

            Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo("en-US");
            Payment payment = new Payment();
            rBase.Payment = payment;
            payment.ChargeTotal = chargeTotal;
            payment.CurrencyCode = currencyCode;
            payment.SoftDescriptor = softDescriptor;
            payment.IataFee = iataFee;

            if (String.IsNullOrEmpty(numberOfInstallments))
                numberOfInstallments = "0";

            int tranInstallments = int.Parse(numberOfInstallments);

            //Verifica se vai precisar criar o nó de parcelas e juros.
            if (!String.IsNullOrEmpty(chargeInterest) && tranInstallments > 1) {
                payment.CreditInstallment = new CreditInstallment();
                payment.CreditInstallment.ChargeInterest = chargeInterest.ToUpper();
                payment.CreditInstallment.NumberOfInstallments = numberOfInstallments;
            }

            TransactionDetail detail = rBase.TransactionDetail;
            PayType payType = detail.PayType;

            CreditCard creditCard = new CreditCard();
            payType.CreditCard = creditCard;

            creditCard.CvvInd = cvvInd;
            creditCard.CvvNumber = cvvNumber;
            creditCard.ExpMonth = expMonth;
            creditCard.ExpYear = expYear;
            creditCard.Number = creditCardNumber;

        }
        /// <summary>
        /// Passa uma transação salvando o número de cartão automaticamente.
        /// </summary>
        private ResponseBase PaySavingCreditCardAutomatically(String operation, String merchantId, String merchantKey, String referenceNum, decimal chargeTotal
            , String creditCardNumber, String expMonth, String expYear, String cvvInd, String cvvNumber
            , String processorId, String numberOfInstallments, String chargeInterest, String ipAddress
            , String customerToken, String onFileEndDate, String onFilePermission, String onFileComment
            , String onFileMaxChargeAmount, String billingName, String billingAddress, String billingAddress2
            , String billingCity, String billingState, String billingPostalCode, String billingCountry
            , String billingPhone, String billingEmail, String currencyCode, String fraudCheck)
        {
            this.request = new TransactionRequest(merchantId, merchantKey);

            Order order = this.request.Order;
            RequestBase rBase = new RequestBase();

            if (operation.Equals("sale"))
                order.Sale = rBase;
            else if (operation.Equals("auth"))
                order.Auth = rBase;

            rBase.ReferenceNum = referenceNum;
            rBase.ProcessorId = processorId;
            rBase.IpAddress = ipAddress;
            rBase.FraudCheck = fraudCheck;

            Billing billing = new Billing();
            rBase.Billing = billing;

            billing.Address1 = billingAddress;
            billing.Address2 = billingAddress2;
            billing.City = billingCity;
            billing.Country = billingCountry;
            billing.Email = billingEmail;
            billing.Name = billingName;
            billing.Phone = billingPhone;
            billing.Postalcode = billingPostalCode;
            billing.State = billingState;

            Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo("en-US");
            Payment payment = new Payment();
            rBase.Payment = payment;
            payment.ChargeTotal = chargeTotal;
            payment.CurrencyCode = currencyCode;

            if (String.IsNullOrEmpty(numberOfInstallments))
                numberOfInstallments = "0";

            int tranInstallments = int.Parse(numberOfInstallments);

            //Verifica se vai precisar criar o nó de parcelas e juros.
            if (!String.IsNullOrEmpty(chargeInterest) && tranInstallments > 1)
            {
                payment.CreditInstallment = new CreditInstallment();
                payment.CreditInstallment.ChargeInterest = chargeInterest.ToUpper();
                payment.CreditInstallment.NumberOfInstallments = numberOfInstallments;
            }

            TransactionDetail detail = rBase.TransactionDetail;
            PayType payType = detail.PayType;

            CreditCard creditCard = new CreditCard();
            payType.CreditCard = creditCard;

            creditCard.CvvInd = cvvInd;
            creditCard.CvvNumber = cvvNumber;
            creditCard.ExpMonth = expMonth;
            creditCard.ExpYear = expYear;
            creditCard.Number = creditCardNumber;

            rBase.SaveOnFile = new SaveOnFile();
            rBase.SaveOnFile.CustomerToken = customerToken;
            rBase.SaveOnFile.OnFileComment = onFileComment;
            rBase.SaveOnFile.OnFileEndDate = onFileEndDate;
            rBase.SaveOnFile.OnFileMaxChargeAmount = onFileMaxChargeAmount;
            rBase.SaveOnFile.OnFilePermission = onFilePermission;

            return new Utils().SendRequest<TransactionRequest>(this.request, this.Environment);
        }
        /// <summary>
        /// Faz uma recorrência.
        /// </summary>
        public ResponseBase Recurring(String merchantId, String merchantKey, String referenceNum, decimal chargeTotal
            , String creditCardNumber, String expMonth, String expYear, String cvvInd, String cvvNumber, String processorId
            , String numberOfInstallments, String chargeInterest, String ipAddress, String action
            , String startDate, String frequency, String period, String installments, String failureThreshold
            , String currencyCode)
        {
            FillRecurringBase(merchantId, merchantKey, referenceNum, chargeTotal, processorId, numberOfInstallments
                , chargeInterest, ipAddress, action, startDate, frequency, period, installments
                , failureThreshold, currencyCode);

            TransactionDetail detail = this.request.Order.RecurringPayment.TransactionDetail;

            PayType payType = detail.PayType;

            CreditCard creditCard = new CreditCard();
            payType.CreditCard = creditCard;

            creditCard.CvvInd = cvvInd;
            creditCard.CvvNumber = cvvNumber;
            creditCard.ExpMonth = expMonth;
            creditCard.ExpYear = expYear;
            creditCard.Number = creditCardNumber;

            return new Utils().SendRequest<TransactionRequest>(this.request, this.Environment);
        }