diff --git a/crates/connector_configs/toml/development.toml b/crates/connector_configs/toml/development.toml index cc2ad85e56..6f16d4f5c1 100644 --- a/crates/connector_configs/toml/development.toml +++ b/crates/connector_configs/toml/development.toml @@ -1217,6 +1217,9 @@ key1="Merchant ID" api_secret="Shared Secret" [cybersource.connector_webhook_details] merchant_secret="Source verification key" +[cybersource.metadata] +disable_avs = "Disable AVS check" +disable_cvn = "Disable CVN check" [[cybersource.metadata.apple_pay]] name="certificate" diff --git a/crates/connector_configs/toml/production.toml b/crates/connector_configs/toml/production.toml index a61911b9da..966becc195 100644 --- a/crates/connector_configs/toml/production.toml +++ b/crates/connector_configs/toml/production.toml @@ -1032,6 +1032,9 @@ key1="Merchant ID" api_secret="Shared Secret" [cybersource.connector_webhook_details] merchant_secret="Source verification key" +[cybersource.metadata] +disable_avs = "Disable AVS check" +disable_cvn = "Disable CVN check" [[cybersource.metadata.apple_pay]] name="certificate" diff --git a/crates/connector_configs/toml/sandbox.toml b/crates/connector_configs/toml/sandbox.toml index b61187def7..a2f01b0b45 100644 --- a/crates/connector_configs/toml/sandbox.toml +++ b/crates/connector_configs/toml/sandbox.toml @@ -1217,6 +1217,9 @@ key1="Merchant ID" api_secret="Shared Secret" [cybersource.connector_webhook_details] merchant_secret="Source verification key" +[cybersource.metadata] +disable_avs = "Disable AVS check" +disable_cvn = "Disable CVN check" [[cybersource.metadata.apple_pay]] name="certificate" diff --git a/crates/router/src/connector/cybersource/transformers.rs b/crates/router/src/connector/cybersource/transformers.rs index 67f88e24ab..2375dd578b 100644 --- a/crates/router/src/connector/cybersource/transformers.rs +++ b/crates/router/src/connector/cybersource/transformers.rs @@ -54,6 +54,23 @@ impl TryFrom<(&api::CurrencyUnit, enums::Currency, i64, T)> for CybersourceRo } } +#[derive(Debug, Default, Serialize, Deserialize)] +pub struct CybersourceConnectorMetadataObject { + pub disable_avs: Option, + pub disable_cvn: Option, +} + +impl TryFrom<&Option> for CybersourceConnectorMetadataObject { + type Error = error_stack::Report; + fn try_from(meta_data: &Option) -> Result { + let metadata = utils::to_connector_meta_from_secret::(meta_data.clone()) + .change_context(errors::ConnectorError::InvalidConnectorConfig { + config: "metadata", + })?; + Ok(metadata) + } +} + #[derive(Debug, Serialize)] #[serde(rename_all = "camelCase")] pub struct CybersourceZeroMandateRequest { @@ -76,6 +93,9 @@ impl TryFrom<&types::SetupMandateRouterData> for CybersourceZeroMandateRequest { }, bill_to: Some(bill_to), }; + let connector_merchant_config = + CybersourceConnectorMetadataObject::try_from(&item.connector_meta_data)?; + let (action_list, action_token_types, authorization_options) = ( Some(vec![CybersourceActionsList::TokenCreate]), Some(vec![ @@ -89,6 +109,8 @@ impl TryFrom<&types::SetupMandateRouterData> for CybersourceZeroMandateRequest { stored_credential_used: None, }), merchant_intitiated_transaction: None, + ignore_avs_result: connector_merchant_config.disable_avs, + ignore_cv_result: connector_merchant_config.disable_cvn, }), ); @@ -310,6 +332,8 @@ pub enum CybersourceActionsTokenType { pub struct CybersourceAuthorizationOptions { initiator: Option, merchant_intitiated_transaction: Option, + ignore_avs_result: Option, + ignore_cv_result: Option, } #[derive(Debug, Serialize)] @@ -548,6 +572,9 @@ impl .unwrap_or("internet") .to_string(); + let connector_merchant_config = + CybersourceConnectorMetadataObject::try_from(&item.router_data.connector_meta_data)?; + let (action_list, action_token_types, authorization_options) = if item .router_data .request @@ -576,6 +603,8 @@ impl credential_stored_on_file: Some(true), stored_credential_used: None, }), + ignore_avs_result: connector_merchant_config.disable_avs, + ignore_cv_result: connector_merchant_config.disable_cvn, merchant_intitiated_transaction: None, }), ) @@ -624,6 +653,8 @@ impl original_authorized_amount, previous_transaction_id: None, }), + ignore_avs_result: connector_merchant_config.disable_avs, + ignore_cv_result: connector_merchant_config.disable_cvn, }), ) } @@ -690,13 +721,24 @@ impl original_authorized_amount, previous_transaction_id: Some(Secret::new(network_transaction_id)), }), + ignore_avs_result: connector_merchant_config.disable_avs, + ignore_cv_result: connector_merchant_config.disable_cvn, }), ) } None => (None, None, None), } } else { - (None, None, None) + ( + None, + None, + Some(CybersourceAuthorizationOptions { + initiator: None, + merchant_intitiated_transaction: None, + ignore_avs_result: connector_merchant_config.disable_avs, + ignore_cv_result: connector_merchant_config.disable_cvn, + }), + ) }; // this logic is for external authenticated card let commerce_indicator_for_external_authentication = item @@ -778,19 +820,23 @@ fn get_commerce_indicator_for_external_authentication( } impl - From<( + TryFrom<( &CybersourceRouterData<&types::PaymentsCompleteAuthorizeRouterData>, Option, &CybersourceConsumerAuthValidateResponse, )> for ProcessingInformation { - fn from( + type Error = error_stack::Report; + fn try_from( (item, solution, three_ds_data): ( &CybersourceRouterData<&types::PaymentsCompleteAuthorizeRouterData>, Option, &CybersourceConsumerAuthValidateResponse, ), - ) -> Self { + ) -> Result { + let connector_merchant_config = + CybersourceConnectorMetadataObject::try_from(&item.router_data.connector_meta_data)?; + let (action_list, action_token_types, authorization_options) = if item .router_data .request @@ -813,12 +859,14 @@ impl stored_credential_used: None, }), merchant_intitiated_transaction: None, + ignore_avs_result: connector_merchant_config.disable_avs, + ignore_cv_result: connector_merchant_config.disable_cvn, }), ) } else { (None, None, None) }; - Self { + Ok(Self { capture: Some(matches!( item.router_data.request.capture_method, Some(enums::CaptureMethod::Automatic) | None @@ -832,7 +880,7 @@ impl .indicator .to_owned() .unwrap_or(String::from("internet")), - } + }) } } @@ -1100,7 +1148,7 @@ impl })?; let processing_information = - ProcessingInformation::from((item, None, &three_ds_info.three_ds_data)); + ProcessingInformation::try_from((item, None, &three_ds_info.three_ds_data))?; let consumer_authentication_information = Some(CybersourceConsumerAuthInformation { ucaf_collection_indicator: three_ds_info.three_ds_data.ucaf_collection_indicator, @@ -1585,6 +1633,9 @@ impl TryFrom<&CybersourceRouterData<&types::PaymentsIncrementalAuthorizationRout fn try_from( item: &CybersourceRouterData<&types::PaymentsIncrementalAuthorizationRouterData>, ) -> Result { + let connector_merchant_config = + CybersourceConnectorMetadataObject::try_from(&item.router_data.connector_meta_data)?; + Ok(Self { processing_information: ProcessingInformation { action_list: None, @@ -1600,6 +1651,8 @@ impl TryFrom<&CybersourceRouterData<&types::PaymentsIncrementalAuthorizationRout previous_transaction_id: None, original_authorized_amount: None, }), + ignore_avs_result: connector_merchant_config.disable_avs, + ignore_cv_result: connector_merchant_config.disable_cvn, }), commerce_indicator: String::from("internet"), capture: None, diff --git a/crates/router/src/core/admin.rs b/crates/router/src/core/admin.rs index e68b31ea43..3f2d2142d3 100644 --- a/crates/router/src/core/admin.rs +++ b/crates/router/src/core/admin.rs @@ -1329,6 +1329,9 @@ impl<'a> ConnectorAuthTypeAndMetadataValidation<'a> { } api_enums::Connector::Cybersource => { cybersource::transformers::CybersourceAuthType::try_from(self.auth_type)?; + cybersource::transformers::CybersourceConnectorMetadataObject::try_from( + self.connector_meta_data, + )?; Ok(()) } api_enums::Connector::Datatrans => {