// helper method for all update + change state recurring methods
        private CreditCardReceipt updateRecurringPurchaseHelper(PeriodicPurchaseInfo periodicPurchaseInfo, Object creditCardSpecifier, VerificationRequest verificationRequest, bool isActualCreditCard)
        {
            if (periodicPurchaseInfo.getPeriodicTransactionId() < 0) {
                return new CreditCardReceipt(REQ_INVALID_REQUEST, "recurringPurchaseId is required", null);
            }

            // create the request string
            StringBuilder req = new StringBuilder();
            try {
                this.appendHeader(req, "recurringPurchase");
                this.appendOperationType(req, "update");
                this.appendTransactionId(req, periodicPurchaseInfo.getPeriodicTransactionId());
                if (creditCardSpecifier != null) {
                    if (isActualCreditCard) {
                        this.appendCreditCard(req, (CreditCard) creditCardSpecifier);
                    } else {
                        this.appendStorageTokenId(req, creditCardSpecifier.ToString());
                    }
                }
                if (periodicPurchaseInfo.getPerPaymentAmount() > 0) {
                    this.appendAmount(req, periodicPurchaseInfo.getPerPaymentAmount());
                }
                if (verificationRequest != null) {
                    this.appendVerificationRequest(req, verificationRequest);
                }
                if (periodicPurchaseInfo.getState() != PeriodicPurchaseInfo.State.NULL) {
                    this.appendPeriodicPurchaseState(req, periodicPurchaseInfo.getState());
                }
            } catch (Exception e) {
                return new CreditCardReceipt(REQ_INVALID_REQUEST, e.ToString(), null);
            }
            return this.send(req);
        }
 private void appendPeriodicPurchaseInfo(StringBuilder req, PeriodicPurchaseInfo periodicPurchaseInfo)
 {
     if (periodicPurchaseInfo.getPerPaymentAmount() >= 0) {
         this.appendAmount(req,periodicPurchaseInfo.getPerPaymentAmount());
     }
     if (periodicPurchaseInfo.getState() != null) {
         this.appendPeriodicPurchaseState(req, periodicPurchaseInfo.getState());
     }
     if (periodicPurchaseInfo.getSchedule() != null) {
         this.appendPeriodicPurchaseSchedule(req, periodicPurchaseInfo.getSchedule());
     }
     if (periodicPurchaseInfo.getOrderId() != null) {
         this.appendOrderId(req, periodicPurchaseInfo.getOrderId());
     }
     if (periodicPurchaseInfo.getCustomerId() != null) {
         this.appendParam(req, "customerId", periodicPurchaseInfo.getCustomerId());
     }
     if (periodicPurchaseInfo.getStartDate() != DateTime.MinValue) {
         this.appendStartDate(req, periodicPurchaseInfo.getStartDate());
     }
     if (periodicPurchaseInfo.getEndDate() != DateTime.MinValue) {
         this.appendEndDate(req, periodicPurchaseInfo.getEndDate());
     }
     if (periodicPurchaseInfo.getNextPaymentDate() != DateTime.MinValue) {
         this.appendNextPaymentDate(req, periodicPurchaseInfo.getNextPaymentDate());
     }
     if (periodicPurchaseInfo.getExecutionType() != null)
     {
         this.appendParam(req, "periodicPurchaseExecutionType", periodicPurchaseInfo.getExecutionType());
     }
 }