internal void SetSecure3dProvider(Secure3dVersion version, ISecure3dProvider provider) { if (_secure3dProviders.ContainsKey(version)) { _secure3dProviders[version] = provider; } else { _secure3dProviders.Add(version, provider); } }
public ThreeDSecure Execute(Secure3dVersion version, string configName = "default") { Validations.Validate(this); // setup return object ThreeDSecure rvalue = ThreeDSecure; if (rvalue == null) { rvalue = new ThreeDSecure(); rvalue.Version = version; } // working version if (rvalue.Version != null) { version = rvalue.Version.Value; } // get the provider ISecure3dProvider provider = ServicesContainer.Instance.GetSecure3d(configName, version); if (provider != null) { bool canDowngrade = false; if (provider.Version.Equals(Secure3dVersion.Two) && version.Equals(Secure3dVersion.Any)) { try { var oneProvider = ServicesContainer.Instance.GetSecure3d(configName, Secure3dVersion.One); canDowngrade = (oneProvider != null); } catch (ConfigurationException) { /* NOT CONFIGURED */ } } /* process the request, capture any exceptions which might have been thrown */ Transaction response = null; try { response = provider.ProcessSecure3d(this); if (response == null && canDowngrade) { return(Execute(Secure3dVersion.One, configName)); } } catch (GatewayException exc) { // check for not enrolled if ("110".Equals(exc.ResponseCode) && provider.Version.Equals(Secure3dVersion.One)) { return(rvalue); } // check if we can downgrade else if (canDowngrade && TransactionType.Equals(TransactionType.VerifyEnrolled)) { return(Execute(Secure3dVersion.One, configName)); } // throw exception else { throw exc; } } // check the response if (response != null) { switch (TransactionType) { case TransactionType.VerifyEnrolled: { if (response.ThreeDSecure != null) { rvalue = response.ThreeDSecure; if (new List <string>() { "True", "Y" }.Contains(rvalue.Enrolled)) { rvalue.Amount = Amount; rvalue.Currency = Currency; rvalue.OrderId = response.OrderId; rvalue.Version = provider.Version; } else if (canDowngrade) { return(Execute(Secure3dVersion.One, configName)); } } else if (canDowngrade) { return(Execute(Secure3dVersion.One, configName)); } } break; case TransactionType.InitiateAuthentication: case TransactionType.VerifySignature: { rvalue.Merge(response.ThreeDSecure); } break; } } } return(rvalue); }