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)); } }