/// <summary> /// Sends a CyberSource transaction request. /// </summary> /// <param name="config">Configuration object to use.</param> /// <param name="request">Hashtable containing the request fields and their values.</param> /// <returns>Hashtable containing the reply fields and their values.</returns> public static Hashtable RunTransaction( Configuration config, Hashtable request) { Logger logger = null; NVPTransactionProcessorClient proc = null; try { DetermineEffectiveMerchantID(ref config, request); SetVersionInformation(request); logger = PrepareLog(config); SetConnectionLimit(config); //Setup custom binding with HTTPS + Body Signing 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 NVPTransactionProcessorClient(currentBinding, endpointAddress)) { // set the timeout TimeSpan timeOut = new TimeSpan(0, 0, 0, config.Timeout, 0); currentBinding.SendTimeout = timeOut; 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.KeyAlias) || IsMerchantCertExpired(logger, config.KeyAlias, dateFile, merchantIdentities)) { if (logger != null) { logger.LogInfo("Loading certificate for " + config.KeyAlias); } 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.KeyAlias)) { newMerchantCert = cert1; } if (cert1.Subject.Contains(CYBS_SUBJECT_NAME)) { newCybsCert = cert1; } } CertificateEntry newCert = new CertificateEntry { ModifiedTime = dateFile, CybsCert = newCybsCert, MerchantCert = newMerchantCert }; merchantIdentities.AddOrUpdate(config.KeyAlias, newCert, (x, y) => newCert); } merchantCert = GetOrFindValidMerchantCertFromStore(config.KeyAlias, merchantIdentities); if (config.UseSignedAndEncrypted) { cybsCert = GetOrFindValidCybsCertFromStore(config.KeyAlias, 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.KeyAlias)) { merchantCert = cert1; break; } } if (config.UseSignedAndEncrypted) { foreach (X509Certificate2 cert2 in collection) { 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 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; } if (logger != null) { logger.LogRequest(request, config.Demo); } // send request now, converting the hashtable request into // a string, and the string reply back into a hashtable. string resp = proc.runTransaction(Hash2String(request)); Hashtable reply = String2Hash(resp); if (logger != null) { logger.LogReply(reply, 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="request">Hashtable containing the request fields and their values.</param> /// <returns>Hashtable containing the reply fields and their values.</returns> public static Hashtable RunTransaction( Configuration config, Hashtable request) { Logger logger=null; NVPTransactionProcessorClient proc=null; try { DetermineEffectiveMerchantID(ref config, request); SetVersionInformation(request); logger = PrepareLog(config); SetConnectionLimit(config); //Setup custom binding with HTTPS + Body Signing 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 NVPTransactionProcessorClient(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; 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; if (logger != null) { logger.LogRequest(request, config.Demo); } // send request now, converting the hashtable request into // a string, and the string reply back into a hashtable. string resp = proc.runTransaction(Hash2String(request)); Hashtable reply = String2Hash(resp); if (logger != null) { logger.LogReply(reply, 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="request">Hashtable containing the request fields and their values.</param> /// <returns>Hashtable containing the reply fields and their values.</returns> public static Hashtable RunTransaction( Configuration config, Hashtable request) { Logger logger = null; NVPTransactionProcessorClient proc = null; try { DetermineEffectiveMerchantID(ref config, request); SetVersionInformation(request); logger = PrepareLog(config); SetConnectionLimit(config); //Setup custom binding with HTTPS + Body Signing 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 NVPTransactionProcessorClient(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; 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; if (logger != null) { logger.LogRequest(request, config.Demo); } // send request now, converting the hashtable request into // a string, and the string reply back into a hashtable. string resp = proc.runTransaction(Hash2String(request)); Hashtable reply = String2Hash(resp); if (logger != null) { logger.LogReply(reply, 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="request">Hashtable containing the request fields and their values.</param> /// <returns>Hashtable containing the reply fields and their values.</returns> public static Hashtable RunTransaction( Configuration config, Hashtable request) { Logger logger = null; NVPTransactionProcessorClient proc = null; try { DetermineEffectiveMerchantID(ref config, request); SetVersionInformation(request); logger = PrepareLog(config); SetConnectionLimit(config); //Setup custom binding with HTTPS + Body Signing 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 NVPTransactionProcessorClient(currentBinding, endpointAddress)) { //Set protection level to sign 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; proc.ClientCredentials.ClientCertificate.Certificate = GetCertificate(config); proc.ClientCredentials.ServiceCertificate.Authentication.CertificateValidationMode = System.ServiceModel.Security.X509CertificateValidationMode.None; // Changes for SHA2 certificates support X509Certificate2Collection collection = GetCertificateCollection(config); 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; } } } if (logger != null) { logger.LogRequest(request, config.Demo); } // send request now, converting the hashtable request into // a string, and the string reply back into a hashtable. string resp = proc.runTransaction(Hash2String(request)); Hashtable reply = String2Hash(resp); if (logger != null) { logger.LogReply(reply, 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(); } } }