/// <summary> /// Sends a CyberSource transaction request. /// </summary> /// <param name="config">Configuration object to use.</param> /// <param name="requestMessage">RequestMessage object containing the request.</param> /// <returns>ReplyMessage containing the reply.</returns> public static ReplyMessage RunTransaction( Configuration config, RequestMessage requestMessage) { Logger logger = null; TransactionProcessorClient proc = null; try { DetermineEffectiveMerchantID(ref config, requestMessage); SetVersionInformation(requestMessage); logger = PrepareLog(config); SetConnectionLimit(config); CustomBinding currentBinding = getWCFCustomBinding(config); //Setup endpoint Address with dns identity AddressHeaderCollection headers = new AddressHeaderCollection(); EndpointAddress endpointAddress = new EndpointAddress(new Uri(config.EffectiveServerURL), EndpointIdentity.CreateDnsIdentity(config.EffectivePassword), headers); //Get instance of service using (proc = new TransactionProcessorClient(currentBinding, endpointAddress)) { // set the timeout TimeSpan timeOut = new TimeSpan(0, 0, 0, config.Timeout, 0); currentBinding.SendTimeout = timeOut; //add certificate credentials string keyFilePath = Path.Combine(config.KeysDirectory, config.EffectiveKeyFilename); X509Certificate2 merchantCert = null; X509Certificate2 cybsCert = null; DateTime dateFile = File.GetLastWriteTime(keyFilePath); if (config.CertificateCacheEnabled) { if (!merchantIdentities.ContainsKey(config.MerchantID) || IsMerchantCertExpired(logger, config.MerchantID, dateFile, merchantIdentities)) { if (logger != null) { logger.LogInfo("Loading certificate for merchantID " + config.MerchantID); } X509Certificate2Collection collection = new X509Certificate2Collection(); collection.Import(keyFilePath, config.EffectivePassword, X509KeyStorageFlags.MachineKeySet | X509KeyStorageFlags.Exportable | X509KeyStorageFlags.PersistKeySet); X509Certificate2 newMerchantCert = null; X509Certificate2 newCybsCert = null; foreach (X509Certificate2 cert1 in collection) { if (cert1.Subject.Contains(config.MerchantID)) { newMerchantCert = cert1; } if (cert1.Subject.Contains(CYBS_SUBJECT_NAME)) { newCybsCert = cert1; } } CertificateEntry newCert = new CertificateEntry { ModifiedTime = dateFile, CybsCert = newCybsCert, MerchantCert = newMerchantCert }; merchantIdentities.AddOrUpdate(config.MerchantID, newCert, (x, y) => newCert); } merchantCert = GetOrFindValidMerchantCertFromStore(config.MerchantID, merchantIdentities); if (config.UseSignedAndEncrypted) { cybsCert = GetOrFindValidCybsCertFromStore(config.MerchantID, merchantIdentities); } } else { // Changes for SHA2 certificates support X509Certificate2Collection collection = new X509Certificate2Collection(); collection.Import(keyFilePath, config.EffectivePassword, X509KeyStorageFlags.MachineKeySet | X509KeyStorageFlags.Exportable | X509KeyStorageFlags.PersistKeySet); foreach (X509Certificate2 cert1 in collection) { if (cert1.Subject.Contains(config.MerchantID)) { merchantCert = cert1; break; } } if (config.UseSignedAndEncrypted) { foreach (X509Certificate2 cert2 in collection) { //Console.WriteLine(cert1.Subject); if (cert2.Subject.Contains(CYBERSOURCE_PUBLIC_KEY)) { cybsCert = cert2; break; } } } } if (merchantCert == null) { throw new ApplicationException( "CONFIGURATION OR CODE BUG: merchant certificate is missing, check the p12 file"); } //Set protection level to sign only proc.Endpoint.Contract.ProtectionLevel = System.Net.Security.ProtectionLevel.Sign; proc.ClientCredentials.ServiceCertificate.Authentication.CertificateValidationMode = System.ServiceModel.Security.X509CertificateValidationMode.None; proc.ClientCredentials.ClientCertificate.Certificate = merchantCert; proc.ClientCredentials.ServiceCertificate.DefaultCertificate = merchantCert; if (config.UseSignedAndEncrypted) { if (cybsCert == null) { throw new ApplicationException( "CONFIGURATION OR CODE BUG: cybs certificate is missing, check the p12 file"); } //Set protection level to sign & encrypt only proc.Endpoint.Contract.ProtectionLevel = System.Net.Security.ProtectionLevel.EncryptAndSign; proc.ClientCredentials.ServiceCertificate.DefaultCertificate = cybsCert; } // Changes for NGT-3035 XmlNode req = SerializeObjectToXmlNode(requestMessage); if (logger != null) { logger.LogRequest(req, config.Demo); } ReplyMessage reply = proc.runTransaction(requestMessage); XmlNode rep = SerializeObjectToXmlNode(reply); if (logger != null) { logger.LogReply(rep, config.Demo); } return(reply); } } catch (Exception e) { if (logger != null) { logger.LogException(e); } if (proc != null) { proc.Abort(); } throw; } finally { if (proc != null) { proc.Close(); } } }
/// <summary> /// Sends a CyberSource transaction request. /// </summary> /// <param name="config">Configuration object to use.</param> /// <param name="requestMessage">RequestMessage object containing the request.</param> /// <returns>ReplyMessage containing the reply.</returns> public static ReplyMessage RunTransaction( Configuration config, RequestMessage requestMessage) { Logger logger = null; TransactionProcessorClient proc = null; try { DetermineEffectiveMerchantID(ref config, requestMessage); SetVersionInformation(requestMessage); logger = PrepareLog(config); SetConnectionLimit(config); CustomBinding currentBinding = getWCFCustomBinding(); //Setup endpoint Address with dns identity AddressHeaderCollection headers = new AddressHeaderCollection(); EndpointAddress endpointAddress = new EndpointAddress( new Uri(config.EffectiveServerURL), EndpointIdentity.CreateDnsIdentity(config.EffectivePassword), headers ); //Get instance of service using( proc = new TransactionProcessorClient(currentBinding, endpointAddress)){ //Set protection level to sign only proc.Endpoint.Contract.ProtectionLevel = System.Net.Security.ProtectionLevel.Sign; // set the timeout TimeSpan timeOut = new TimeSpan(0, 0, 0, config.Timeout, 0); currentBinding.SendTimeout = timeOut; //add certificate credentials string keyFilePath = Path.Combine(config.KeysDirectory,config.EffectiveKeyFilename); proc.ClientCredentials.ClientCertificate.Certificate = new X509Certificate2(keyFilePath,config.EffectivePassword, X509KeyStorageFlags.Exportable | X509KeyStorageFlags.PersistKeySet); proc.ClientCredentials.ServiceCertificate.Authentication.CertificateValidationMode = System.ServiceModel.Security.X509CertificateValidationMode.None; // Changes for SHA2 certificates support X509Certificate2Collection collection = new X509Certificate2Collection(); collection.Import(keyFilePath, config.EffectivePassword, X509KeyStorageFlags.Exportable | X509KeyStorageFlags.PersistKeySet); foreach (X509Certificate2 cert1 in collection) { if (cert1.Subject.Contains(config.MerchantID)) { proc.ClientCredentials.ClientCertificate.Certificate = cert1; proc.ClientCredentials.ServiceCertificate.DefaultCertificate = cert1; break; } } // send request now // Changes for NGT-3035 XmlNode req = SerializeObjectToXmlNode(requestMessage); if (logger != null) { logger.LogRequest(req, config.Demo); } ReplyMessage reply = proc.runTransaction(requestMessage); XmlNode rep = SerializeObjectToXmlNode(reply); if (logger != null) { logger.LogReply(rep, config.Demo); } return (reply); } } catch (Exception e) { if (logger != null) { logger.LogException(e); } if (proc != null) { proc.Abort(); } throw; } finally { if (proc != null) { proc.Close(); } } }
/// <summary> /// Sends a CyberSource transaction request. /// </summary> /// <param name="config">Configuration object to use.</param> /// <param name="requestMessage">RequestMessage object containing the request.</param> /// <returns>ReplyMessage containing the reply.</returns> public static ReplyMessage RunTransaction( Configuration config, RequestMessage requestMessage) { Logger logger = null; TransactionProcessorClient proc = null; try { DetermineEffectiveMerchantID(ref config, requestMessage); SetVersionInformation(requestMessage); logger = PrepareLog(config); SetConnectionLimit(config); CustomBinding currentBinding = getWCFCustomBinding(config); //Setup endpoint Address with dns identity AddressHeaderCollection headers = new AddressHeaderCollection(); EndpointAddress endpointAddress = new EndpointAddress(new Uri(config.EffectiveServerURL), EndpointIdentity.CreateDnsIdentity(config.EffectivePassword), headers); //Get instance of service using (proc = new TransactionProcessorClient(currentBinding, endpointAddress)){ //Set protection level to sign & encrypt only proc.Endpoint.Contract.ProtectionLevel = System.Net.Security.ProtectionLevel.Sign; // set the timeout TimeSpan timeOut = new TimeSpan(0, 0, 0, config.Timeout, 0); currentBinding.SendTimeout = timeOut; //add certificate credentials string keyFilePath = Path.Combine(config.KeysDirectory, config.EffectiveKeyFilename); proc.ClientCredentials.ClientCertificate.Certificate = new X509Certificate2(keyFilePath, config.EffectivePassword, X509KeyStorageFlags.MachineKeySet | X509KeyStorageFlags.Exportable | X509KeyStorageFlags.PersistKeySet); proc.ClientCredentials.ServiceCertificate.Authentication.CertificateValidationMode = System.ServiceModel.Security.X509CertificateValidationMode.None; // Changes for SHA2 certificates support X509Certificate2Collection collection = new X509Certificate2Collection(); collection.Import(keyFilePath, config.EffectivePassword, X509KeyStorageFlags.MachineKeySet | X509KeyStorageFlags.Exportable | X509KeyStorageFlags.PersistKeySet); foreach (X509Certificate2 cert1 in collection) { if (cert1.Subject.Contains(config.MerchantID)) { proc.ClientCredentials.ClientCertificate.Certificate = cert1; proc.ClientCredentials.ServiceCertificate.DefaultCertificate = cert1; break; } } if (config.UseSignedAndEncrypted) { foreach (X509Certificate2 cert2 in collection) { //Console.WriteLine(cert1.Subject); if (cert2.Subject.Contains(CYBERSOURCE_PUBLIC_KEY)) { //Set protection level to sign & encrypt only proc.Endpoint.Contract.ProtectionLevel = System.Net.Security.ProtectionLevel.EncryptAndSign; proc.ClientCredentials.ServiceCertificate.DefaultCertificate = cert2; break; } } } // send request now // Changes for NGT-3035 XmlNode req = SerializeObjectToXmlNode(requestMessage); if (logger != null) { logger.LogRequest(req, config.Demo); } ReplyMessage reply = proc.runTransaction(requestMessage); XmlNode rep = SerializeObjectToXmlNode(reply); if (logger != null) { logger.LogReply(rep, config.Demo); } return(reply); } } catch (Exception e) { if (logger != null) { logger.LogException(e); } if (proc != null) { proc.Abort(); } throw; } finally { if (proc != null) { proc.Close(); } } }
/// <summary> /// Sends a CyberSource transaction request. /// </summary> /// <param name="config">Configuration object to use.</param> /// <param name="requestMessage">RequestMessage object containing the request.</param> /// <returns>ReplyMessage containing the reply.</returns> public static ReplyMessage RunTransaction( Configuration config, RequestMessage requestMessage) { Logger logger = null; TransactionProcessorClient proc = null; try { DetermineEffectiveMerchantID(ref config, requestMessage); SetVersionInformation(requestMessage); logger = PrepareLog(config); SetConnectionLimit(config); CustomBinding currentBinding = getWCFCustomBinding(); //Setup endpoint Address with dns identity AddressHeaderCollection headers = new AddressHeaderCollection(); EndpointAddress endpointAddress = new EndpointAddress(new Uri(config.EffectiveServerURL), EndpointIdentity.CreateDnsIdentity(config.EffectivePassword), headers); //Get instance of service using (proc = new TransactionProcessorClient(currentBinding, endpointAddress)){ //Set protection level to sign only proc.Endpoint.Contract.ProtectionLevel = System.Net.Security.ProtectionLevel.Sign; // set the timeout TimeSpan timeOut = new TimeSpan(0, 0, 0, config.Timeout, 0); currentBinding.SendTimeout = timeOut; //add certificate credentials string keyFilePath = Path.Combine(config.KeysDirectory, config.EffectiveKeyFilename); proc.ClientCredentials.ClientCertificate.Certificate = new X509Certificate2(keyFilePath, config.EffectivePassword, X509KeyStorageFlags.Exportable | X509KeyStorageFlags.PersistKeySet); proc.ClientCredentials.ServiceCertificate.Authentication.CertificateValidationMode = System.ServiceModel.Security.X509CertificateValidationMode.None; proc.ClientCredentials.ServiceCertificate.DefaultCertificate = proc.ClientCredentials.ClientCertificate.Certificate; // send request now return(proc.runTransaction(requestMessage)); } } catch (Exception e) { if (logger != null) { logger.LogException(e); } if (proc != null) { proc.Abort(); } throw; } finally { if (proc != null) { proc.Close(); } } }