Exemplo n.º 1
0
 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));
            }
        }
Exemplo n.º 3
0
        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);
        }