public CapitaInvokeResponse InvokeRequest(CapitaInvokeRequest request)
        {
            scpSimpleInvokeRequest scpInvokeRequest = CreateCapitaInvokeRequest(request);
            CapitaInvokeResponse   response         = new CapitaInvokeResponse();

            using (scpClient capitaClient = new scpClient("CapitaScpSoap", Shared.Capita.Default.CapitaWebServiceUrl))
            {
                try
                {
                    scpInvokeResponse scpResponse  = capitaClient.scpSimpleInvoke(scpInvokeRequest);
                    string            errorMessage = string.Empty;
                    if (scpResponse?.invokeResult != null)
                    {
                        if (scpResponse.requestId == request.UniqueReference)
                        {
                            if (scpResponse.transactionState == transactionState.INVALID_REFERENCE)
                            {
                                errorMessage = "Transaction aborted! It may be because of session time out or some other technical glitch from Capita";
                            }
                            else
                            {
                                response.ScpReference = scpResponse.scpReference;
                                if (scpResponse.invokeResult.status == status.SUCCESS)
                                {
                                    response.RedirectUrl = (string)scpResponse.invokeResult.Item;
                                }
                                else
                                {
                                    errorDetails item = scpResponse.invokeResult.Item as errorDetails;
                                    errorMessage = item != null ? $"ErrorId: {item.errorId}, Message: {item.errorMessage}" : "Transaction failed for some unknown reason.";
                                }
                            }
                        }
                        else
                        {
                            errorMessage = "Transaction is being invalidated b/c the unique reference returned from Capita is wrong.";
                        }
                    }

                    if (!string.IsNullOrEmpty(errorMessage))
                    {
                        response.Error        = true;
                        response.ErrorMessage = errorMessage;
                    }
                }
                catch (Exception ex)
                {
                    response.Error        = true;
                    response.ErrorMessage = "Fatal error";
                }

                return(response);
            }
        }
        public ActionResult SendToPaymentProvider(
            PaymentProviderConfiguration configuration,
            GeneralisedPaymentTransfer transferObject,
            Action <PaymentProviderConfiguration, GeneralisedPaymentTransfer, string> saveProviderReference)
        {
            int siteId;

            int.TryParse(configuration.AccountIdentifer, out siteId);

            int scpId;

            int.TryParse(transferObject.Account, out scpId);

            int    hmacKeyId;
            string hmacSecretKey;

            CapitaApiHelpers.GetHmacIdAndSecretKey(configuration.SharedSecret, out hmacKeyId, out hmacSecretKey);

            string returnUrl = $"{transferObject.ReturnUrl}?{RoundTripTokenKey}={transferObject.TransactionId}";

            CapitaInvokeRequest request = new CapitaInvokeRequest()
            {
                SiteId              = siteId,
                ScpId               = scpId,
                HmacKeyId           = hmacKeyId,
                HmacKey             = hmacSecretKey,
                UniqueReference     = transferObject.TransactionId,
                PurchaseId          = transferObject.ProductId,
                BookingRef          = transferObject.Comment2,
                PurchaseDescription = transferObject.Comment1,
                PaymentTotal        = (int)(transferObject.Amount * 100),
                ReturnUrl           = returnUrl,
                IntegraCode         = transferObject.GeneralLedgerCode,
                IsMediated          = transferObject.IsMediated,
                FundCode            = Shared.Capita.Default.FundCode,
                VatCode             = transferObject.VatCode,
                VatRate             = transferObject.VatRate
            };

            if (transferObject.SaveCard != null)
            {
                request.SaveCard     = true;
                request.CardHolderId = MessageContentUtility.TruncateAndStripDisallowed(transferObject.SaveCard.PayerReference, 50, null);
            }

            //Call Capita web service to set up the payment
            CapitaInvokeResponse response = InvokeRequest(request);

            if (response != null && !response.Error)
            {
                //call this action method to save scpReference into PendingPayment table
                saveProviderReference(configuration, transferObject, response.ScpReference);
                RedirectResult resultView = new RedirectResult(response.RedirectUrl, true);
                var            sendToPaymentLogMessage = PaymentFrameworkUtility.DescribeActionResultForLogging(resultView, true);
                this.Logger.CreateEntry(typeof(CapitaPaymentProvider), LogLevel.Info, sendToPaymentLogMessage);
                return(resultView);
            }
            else
            {
                string errorMessage = "Capita Server returns null response.";
                if (response != null)
                {
                    errorMessage += " " + response.ErrorMessage;
                }

                this.Logger.CreateEntry(typeof(CapitaPaymentProvider), LogLevel.Error, errorMessage);
                return(new HttpStatusCodeResult(HttpStatusCode.InternalServerError));
            }
        }