private string ProcessElectronicCheckingTransactionResponse(ref ResponseDetails _Response)
        {
            ElectronicCheckingTransactionResponse _ECKResponse = new ElectronicCheckingTransactionResponse();
            _ECKResponse = (ElectronicCheckingTransactionResponse)_Response.Response;

            //Set the amount reference
            _Response.TxnAmount = _ECKResponse.Amount;

            string strResponseMessage = "";

            if (_ECKResponse.Status == Status.Successful)//The transaction was approved
            {//NOTE : Please reference the developers guide for a more complete explination of the return fields
                //Note Highly recommended to save
                if (_ECKResponse.TransactionId != null) strResponseMessage = strResponseMessage + "\r\nTransactionId : " + _ECKResponse.TransactionId;
                strResponseMessage = strResponseMessage + "\r\nMerchant Profile Id : " + _Response.MerchantProfileId;
                //Note Optional but recommended to save
                if (_ECKResponse.StatusCode != null) strResponseMessage = strResponseMessage + "\r\nStatus Code : " + _ECKResponse.StatusCode;
                if (_ECKResponse.StatusMessage != null) strResponseMessage = strResponseMessage + "\r\nStatus Message : " + _ECKResponse.StatusMessage;
                //Note Optional data about the batch
                if (_ECKResponse.ACHCapable != null) strResponseMessage = strResponseMessage + "\r\nACHCapable : " + _ECKResponse.ACHCapable;//Indicates if the customer's account will accept ACH transactions. Returned only on QueryAccount() transactions.
                if (_ECKResponse.Amount != null) strResponseMessage = strResponseMessage + "\r\nAmount : " + _ECKResponse.Amount;
                if (_ECKResponse.ApprovalCode != null) strResponseMessage = strResponseMessage + "\r\nApprovalCode : " + _ECKResponse.ApprovalCode; //A code provided when a transaction is approved.
                if (_ECKResponse.ModifiedAccountNumber != null) strResponseMessage = strResponseMessage + "\r\nModifiedAccountNumber : " + _ECKResponse.ModifiedAccountNumber; //Indicates the corrected account number that should be used for electronic check processing
                if (_ECKResponse.ModifiedRoutingNumber != null) strResponseMessage = strResponseMessage + "\r\nModifiedRoutingNumber : " + _ECKResponse.ModifiedRoutingNumber; //Indicates the corrected 9-digit bank routing number that should be used for electronic check processing.
                if (_ECKResponse.ReturnInformation != null)
                {
                    if (_ECKResponse.ReturnInformation.ReturnCode != null) strResponseMessage = strResponseMessage + "\r\nReturnCode : " + _ECKResponse.ReturnInformation.ReturnCode;//Code that indicates why the transaction was returned.
                    if (_ECKResponse.ReturnInformation.ReturnDate != null) strResponseMessage = strResponseMessage + "\r\nReturnDate : " + _ECKResponse.ReturnInformation.ReturnDate; //The date the transaction was returned by the bank.
                    if (_ECKResponse.ReturnInformation.ReturnReason != null) strResponseMessage = strResponseMessage + "\r\nReturnReason : " + _ECKResponse.ReturnInformation.ReturnReason; //Reason that indicates why the transaction was returned.
                }
                if (_ECKResponse.SubmitDate != null) strResponseMessage = strResponseMessage + "\r\nSubmitDate : " + _ECKResponse.SubmitDate; //The date the transaction was submitted to the bank.

                strResponseMessage = "Your transaction was APPROVED\r\n" + strResponseMessage;
            }
            if (_ECKResponse.Status == Status.Failure)//The transaction was declined
            {//NOTE : Please reference the developers guide for a more complete explination of the return fields
                //Note Highly recommended to save
                if (_ECKResponse.TransactionId != null) strResponseMessage = strResponseMessage + "\r\nTransactionId : " + _ECKResponse.TransactionId;
                strResponseMessage = strResponseMessage + "\r\nMerchant Profile Id : " + _Response.MerchantProfileId;
                //Note Optional but recommended to save
                if (_ECKResponse.StatusCode != null) strResponseMessage = strResponseMessage + "\r\nStatus Code : " + _ECKResponse.StatusCode;
                if (_ECKResponse.StatusMessage != null) strResponseMessage = strResponseMessage + "\r\nStatus Message : " + _ECKResponse.StatusMessage;
                //Note Optional
                if (_ECKResponse.ACHCapable != null) strResponseMessage = strResponseMessage + "\r\nACHCapable : " + _ECKResponse.ACHCapable;//Indicates if the customer's account will accept ACH transactions. Returned only on QueryAccount() transactions.
                if (_ECKResponse.Amount != null) strResponseMessage = strResponseMessage + "\r\nAmount : " + _ECKResponse.Amount;
                if (_ECKResponse.ApprovalCode != null) strResponseMessage = strResponseMessage + "\r\nApprovalCode : " + _ECKResponse.ApprovalCode; //A code provided when a transaction is approved.
                if (_ECKResponse.ModifiedAccountNumber != null) strResponseMessage = strResponseMessage + "\r\nModifiedAccountNumber : " + _ECKResponse.ModifiedAccountNumber; //Indicates the corrected account number that should be used for electronic check processing
                if (_ECKResponse.ModifiedRoutingNumber != null) strResponseMessage = strResponseMessage + "\r\nModifiedRoutingNumber : " + _ECKResponse.ModifiedRoutingNumber; //Indicates the corrected 9-digit bank routing number that should be used for electronic check processing.
                if (_ECKResponse.ReturnInformation != null)
                {
                    if (_ECKResponse.ReturnInformation.ReturnCode != null) strResponseMessage = strResponseMessage + "\r\nReturnCode : " + _ECKResponse.ReturnInformation.ReturnCode;//Code that indicates why the transaction was returned.
                    if (_ECKResponse.ReturnInformation.ReturnDate != null) strResponseMessage = strResponseMessage + "\r\nReturnDate : " + _ECKResponse.ReturnInformation.ReturnDate; //The date the transaction was returned by the bank.
                    if (_ECKResponse.ReturnInformation.ReturnReason != null) strResponseMessage = strResponseMessage + "\r\nReturnReason : " + _ECKResponse.ReturnInformation.ReturnReason; //Reason that indicates why the transaction was returned.
                }
                if (_ECKResponse.SubmitDate != null) strResponseMessage = strResponseMessage + "\r\nSubmitDate : " + _ECKResponse.SubmitDate; //The date the transaction was submitted to the bank.

                strResponseMessage = "Your transaction was DECLINED\r\n" + strResponseMessage;
            }
            if (_ECKResponse.Status == Status.NotSet)//The transaction was declined
            {
                strResponseMessage = "No Transactions found for settlement";
            }
            return strResponseMessage;
        }
        public List<ResponseDetails> ProcessECKTransaction(
                        TransactionType _TT //Required
                        , ElectronicCheckingTransaction _ECKtransaction
                        , List<String> _BatchIds //Conditional : A list of one or more batch Ids to capture.
                        , List<Capture> _CaptureDifferenceData
                        , Undo _UDifferenceData //Conditional : Only used for an Undo. Otherwise null
                        , bool _SendAcknowledge
                        , bool _ForceClose)
        {
            List<Response> _Response = new List<Response>();
            try
            {
                CheckTokenExpire();//Make sure the current token is valid

                //if (_TT == TransactionType.AuthorizeAndCapture)
                if (_TT == TransactionType.Authorize)
                {
                    if (CredentialRequired())
                        _ECKtransaction.Addendum = CredentialsRequired(_serviceId, _credUserName, _credPassword);
                    _Response.Add(Cwsbc.Authorize(_sessionToken, _ECKtransaction, _applicationProfileId, _merchantProfileId, _serviceId));
                    //Always Verify that the requested amount and approved amount are the same.

                    ElectronicCheckingTransactionResponse ECKR = new ElectronicCheckingTransactionResponse();
                    ECKR = (ElectronicCheckingTransactionResponse)_Response[0];
                    if (_ECKtransaction.TransactionData.Amount != ECKR.Amount)
                        _message +="The transaction was approved for " + ECKR.Amount
                            + " which is an amount not equal to than the requested amount of " + _ECKtransaction.TransactionData.Amount
                            + ". Please provide alternate payment to complete transaction";
                }
                //if (_TT == TransactionType.Capture)
                if (_TT == TransactionType.CaptureAll)
                {
                    _CaptureDifferenceData = new List<Capture>();
                    Capture cap = new Capture();
                    if (CredentialRequired())
                        cap.Addendum = CredentialsRequired(_serviceId, _credUserName, _credPassword);
                    cap.TransactionId = "-1";
                    _CaptureDifferenceData.Add(cap);
                    _Response = Cwsbc.CaptureAll(_sessionToken, _CaptureDifferenceData, _BatchIds, _applicationProfileId,
                                                 _merchantProfileId, _serviceId, _ForceClose);
                }
                if (_TT == TransactionType.CaptureAllAsync)
                {
                    _CaptureDifferenceData = new List<Capture>();
                    Capture cap = new Capture();
                    if (CredentialRequired())
                        cap.Addendum = CredentialsRequired(_serviceId, _credUserName, _credPassword);
                    cap.TransactionId = "-1";
                    _CaptureDifferenceData.Add(cap);
                    _Response.Add(Cwsbc.CaptureAllAsync(_sessionToken, _CaptureDifferenceData, _BatchIds, _applicationProfileId, _merchantProfileId, _serviceId, _ForceClose));
                }

                //if (_TT == TransactionType.CaptureSelective)
                //if (_TT == TransactionType.CaptureSelectiveAsync)
                //if (_TT == TransactionType.ReturnById)
                //if (_TT == TransactionType.Return)
                //if (_TT == TransactionType.Adjust)
                if (_TT == TransactionType.Undo)
                {
                    if (CredentialRequired())
                        _UDifferenceData.Addendum = CredentialsRequired(_serviceId, _credUserName, _credPassword);
                    _Response.Add(Cwsbc.Undo(_sessionToken, _UDifferenceData, _applicationProfileId, _serviceId));
                }
                if (_TT == TransactionType.QueryAccount)
                {
                    if (CredentialRequired())
                        _ECKtransaction.Addendum = CredentialsRequired(_serviceId, _credUserName, _credPassword);
                    _Response.Add(Cwsbc.QueryAccount(_sessionToken, _ECKtransaction, _applicationProfileId, _merchantProfileId, _serviceId));
                }

                //if (_TT == TransactionType.Verify)

                List<ResponseDetails> RD = new List<ResponseDetails>();//Convert the response to response details so that we can report on the UI
                if (_Response != null)
                {
                    foreach (Response r in _Response)
                    {
                        if (_SendAcknowledge && r.TransactionId.Length > 0)
                            Cwsbc.Acknowledge(_sessionToken, r.TransactionId, _applicationProfileId, _serviceId);

                        ResponseDetails RDN = new ResponseDetails(0.00M, r, _TT.ToString(), _serviceId, _merchantProfileId, true, TypeCardType.NotSet, "");
                        _message +=ProcessResponse(ref RDN);//Pass as reference so we can extract more values from the response
                        RD.Add(RDN);
                    }
                }

                return RD;
            }
            catch (EndpointNotFoundException)
            {
                //In this case the SvcEndpoint was not available. Try the same logic again with the alternate Endpoint
                try
                {
                    SetTxnEndpoint();//Change the endpoint to use the backup.

                    //TODO : Add a copy of the code above once fully tested out.

                    return null;

                }
                catch (EndpointNotFoundException)
                {
                    _message += "Neither the primary or secondary endpoints are available. Unable to process.";
                }
                catch (Exception ex)
                {
                    _message += "Unable to AuthorizeAndCapture\r\nError Message : " + ex.Message;
                }
            }
            catch (System.TimeoutException te)
            {
                //A timeout has occured. Prompt the user if they'd like to query for the last transaction submitted
                if (_ECKtransaction != null)
                {
                    _message += "A timeout has occured. A call to 'RequestTransaction' was made to obtain the transactions that should have been returned. Your code will need to reconcile transactions.";
                    RequestTransaction(_ECKtransaction.TenderData);
                }
                else { throw te; }
            }
            catch (Exception ex)
            {
                string strErrorId;
                string strErrorMessage;
                if (_FaultHandler.handleTxnFault(ex, out strErrorId, out strErrorMessage))
                { _message += strErrorId + " : " + strErrorMessage; }
                else { _message += ex.Message; }
            }

            return null;
        }