internal static StatusResponse Parse(string xml, ILogger logger) { try { var dirRes = AcquirerStatusRes.Deserialize(xml); return(new StatusResponse(dirRes, xml)); } catch (ApplicationException e) { return(new StatusResponse(e) { RawMessage = xml }); } catch (Exception e1) { logger.LogError(e1, e1.Message); try { var errRes = AcquirerErrorRes.Deserialize(xml); return(new StatusResponse(errRes, xml)); } catch (Exception e2) { logger.LogError(e2, e2.Message); return(new StatusResponse(e1) { RawMessage = xml }); } } }
internal static StatusResponse Parse(string xml, IConfiguration configuration) { try { if (xml.Contains("AcquirerStatusRes")) { var statusRes = AcquirerStatusRes.Deserialize(xml); return(new StatusResponse(statusRes, xml, configuration)); } var errRes = AcquirerErrorRes.Deserialize(xml); return(new StatusResponse(errRes, xml)); } catch (Exception e) { return(new StatusResponse(e, xml)); } }
private StatusResponse(AcquirerStatusRes statusRes, string xml) { Error = null; IsError = false; TransactionId = statusRes.Transaction.transactionID; StatusDateTimestamp = statusRes.Transaction.statusDateTimestampSpecified? statusRes.Transaction.statusDateTimestamp : (DateTime?)null; Status = statusRes.Transaction.status; RawMessage = xml; if (Status == StatusResponse.Success) { if (statusRes.Transaction.container == null) { throw new ApplicationException("No mandate present for the transaction with status 'Success'."); } var mandateXml = statusRes.Transaction.container.Any[0].OuterXml; if (!string.IsNullOrWhiteSpace(mandateXml)) { AcceptanceReport = AcceptanceReport.Parse(mandateXml); } } }
private StatusResponse(AcquirerStatusRes statusRes, string xml, IConfiguration configuration) : base(xml) { TransactionId = statusRes.Transaction.transactionID; StatusDateTimestamp = statusRes.Transaction.statusDateTimestampSpecified ? statusRes.Transaction.statusDateTimestamp : (DateTime?)null; Status = statusRes.Transaction.status; if (Status != Success) { return; } if (statusRes.Transaction.container == null) { throw new Exception("No SAML message present for the transaction with status 'Success'."); } var samlXml = statusRes.Transaction.container.Any[0].OuterXml; if (string.IsNullOrWhiteSpace(samlXml)) { return; } SamlResponse = SamlResponse.Parse(samlXml, configuration); // check for invalid SAML status if (SamlResponse.Status?.StatusCodeFirstLevel == SamlStatus.Success) { return; } Error = new ErrorResponse(SamlResponse.Status); IsError = true; }
/// <summary> /// Requests the status of a transaction. /// </summary> /// <param name="transactionId">Id of the <see cref="Transaction" /> to check status for.</param> /// <returns><see cref="Transaction" /> holding status for the transaction.</returns> /// <exception cref="XmlSchemaValidationException">Request Xml does not comply with schema.</exception> /// <exception cref="IDealException">Respons from iDEAL contains an error.</exception> /// <exception cref="ConfigurationErrorsException">Errors in configuration file.</exception> /// <exception cref="WebException">Error getting reply from acquirer.</exception> /// <exception cref="CryptographicException">Error using client certificate.</exception> public Transaction RequestTransactionStatus(string transactionId) { if (traceSwitch.TraceInfo) { TraceLine("Start of RequestTransactionStatus()"); } if (traceSwitch.TraceVerbose) { TraceLine(Format("Parameters: transactionId: {0}", transactionId == null ? "NULL" : transactionId)); } // Check input CheckMandatory("transactionId", transactionId); AcquirerStatusReq request = CreateRequest <AcquirerStatusReq>(); request.Merchant = CreateMerchant <AcquirerStatusReqMerchant>(); request.Transaction = new AcquirerStatusReqTransaction(); request.Transaction.transactionID = transactionId; // Serialize the request to an XML string string xmlRequest = SerializationHelper.SerializeObject <AcquirerStatusReq>(request); var xmlDoc = new XmlDocument(); xmlDoc.LoadXml(xmlRequest); var signatureElement = XmlSignature.XmlSignature.Sign(ref xmlDoc, GetMerchantRSACryptoServiceProvider(), merchantConfig.ClientCertificate.Thumbprint); xmlRequest = xmlDoc.OuterXml; // Validate the request before sending it to the service ValidateXML(xmlRequest); // Send request / get respons string xmlResponse = GetReplyFromAcquirer(xmlRequest, merchantConfig.acquirerUrlSTA); // Validate respons ValidateXML(xmlResponse); if (!XmlSignature.XmlSignature.CheckSignature(xmlResponse, (RSA)merchantConfig.aquirerCertificate.PublicKey.Key)) { Trace.WriteLine("Xml response was not well signed " + xmlResponse); throw new ArgumentException("Response from server is not well signed"); } if (traceSwitch.TraceInfo) { TraceLine("Response from RequestTransactionStatus() was : " + xmlResponse); } // Check respons for errors CheckError(xmlResponse, Resources.iDealStatusCheckFailed); AcquirerStatusRes response = (AcquirerStatusRes)SerializationHelper.DeserializeObject <AcquirerStatusRes>(xmlResponse); Transaction transaction = new Transaction(); transaction.Id = response.Transaction.transactionID; transaction.AcquirerId = response.Acquirer.acquirerID; transaction.Status = (Transaction.TransactionStatus)Enum.Parse(typeof(Transaction.TransactionStatus), response.Transaction.status); transaction.ConsumerIBAN = response.Transaction.consumerIBAN; transaction.ConsumerBIC = response.Transaction.consumerBIC; transaction.StatusDateTimestamp = response.Transaction.statusDateTimestamp; transaction.ConsumerName = response.Transaction.consumerName; transaction.SignatureValue = response.Signature.SignatureValue.Value; transaction.Amount = response.Transaction.amount; transaction.Currency = response.Transaction.currency; if (traceSwitch.TraceInfo) { TraceLine("End of RequestTransactionStatus()"); } if (traceSwitch.TraceVerbose) { TraceLine(Format("Returnvalue: {0}", transaction.ToString())); } return(transaction); }