feat(router): add merchant_configuration_id in netcetera metadata and make other merchant configurations optional (#7347)

This commit is contained in:
Sai Harsha Vardhan
2025-02-22 00:26:54 +05:30
committed by GitHub
parent 049fcdb3fb
commit 57ab8693e2
8 changed files with 70 additions and 39 deletions

View File

@ -107,6 +107,7 @@ pub struct ApiModelMetaData {
pub locale: Option<String>, pub locale: Option<String>,
pub card_brands: Option<Vec<String>>, pub card_brands: Option<Vec<String>>,
pub merchant_category_code: Option<String>, pub merchant_category_code: Option<String>,
pub merchant_configuration_id: Option<String>,
} }
#[serde_with::skip_serializing_none] #[serde_with::skip_serializing_none]

View File

@ -118,6 +118,7 @@ pub struct ConfigMetadata {
pub locale: Option<InputData>, pub locale: Option<InputData>,
pub card_brands: Option<InputData>, pub card_brands: Option<InputData>,
pub merchant_category_code: Option<InputData>, pub merchant_category_code: Option<InputData>,
pub merchant_configuration_id: Option<InputData>,
} }
#[serde_with::skip_serializing_none] #[serde_with::skip_serializing_none]

View File

@ -4103,7 +4103,7 @@ private_key="Base64 encoded PEM formatted private key"
name="mcc" name="mcc"
label="MCC" label="MCC"
placeholder="Enter MCC" placeholder="Enter MCC"
required=true required=false
type="Text" type="Text"
[netcetera.metadata.endpoint_prefix] [netcetera.metadata.endpoint_prefix]
name="endpoint_prefix" name="endpoint_prefix"
@ -4115,25 +4115,31 @@ type="Text"
name="merchant_country_code" name="merchant_country_code"
label="3 digit numeric country code" label="3 digit numeric country code"
placeholder="Enter 3 digit numeric country code" placeholder="Enter 3 digit numeric country code"
required=true required=false
type="Text" type="Text"
[netcetera.metadata.merchant_name] [netcetera.metadata.merchant_name]
name="merchant_name" name="merchant_name"
label="Name of the merchant" label="Name of the merchant"
placeholder="Enter Name of the merchant" placeholder="Enter Name of the merchant"
required=true required=false
type="Text" type="Text"
[netcetera.metadata.three_ds_requestor_name] [netcetera.metadata.three_ds_requestor_name]
name="three_ds_requestor_name" name="three_ds_requestor_name"
label="ThreeDS requestor name" label="ThreeDS requestor name"
placeholder="Enter ThreeDS requestor name" placeholder="Enter ThreeDS requestor name"
required=true required=false
type="Text" type="Text"
[netcetera.metadata.three_ds_requestor_id] [netcetera.metadata.three_ds_requestor_id]
name="three_ds_requestor_id" name="three_ds_requestor_id"
label="ThreeDS request id" label="ThreeDS request id"
placeholder="Enter ThreeDS request id" placeholder="Enter ThreeDS request id"
required=true required=false
type="Text"
[netcetera.metadata.merchant_configuration_id]
name="merchant_configuration_id"
label="Merchant Configuration ID"
placeholder="Enter Merchant Configuration ID"
required=false
type="Text" type="Text"
[taxjar] [taxjar]

View File

@ -3041,31 +3041,37 @@ type="Text"
name="mcc" name="mcc"
label="MCC" label="MCC"
placeholder="Enter MCC" placeholder="Enter MCC"
required=true required=false
type="Text" type="Text"
[netcetera.metadata.merchant_country_code] [netcetera.metadata.merchant_country_code]
name="merchant_country_code" name="merchant_country_code"
label="3 digit numeric country code" label="3 digit numeric country code"
placeholder="Enter 3 digit numeric country code" placeholder="Enter 3 digit numeric country code"
required=true required=false
type="Text" type="Text"
[netcetera.metadata.merchant_name] [netcetera.metadata.merchant_name]
name="merchant_name" name="merchant_name"
label="Name of the merchant" label="Name of the merchant"
placeholder="Enter Name of the merchant" placeholder="Enter Name of the merchant"
required=true required=false
type="Text" type="Text"
[netcetera.metadata.three_ds_requestor_name] [netcetera.metadata.three_ds_requestor_name]
name="three_ds_requestor_name" name="three_ds_requestor_name"
label="ThreeDS requestor name" label="ThreeDS requestor name"
placeholder="Enter ThreeDS requestor name" placeholder="Enter ThreeDS requestor name"
required=true required=false
type="Text" type="Text"
[netcetera.metadata.three_ds_requestor_id] [netcetera.metadata.three_ds_requestor_id]
name="three_ds_requestor_id" name="three_ds_requestor_id"
label="ThreeDS request id" label="ThreeDS request id"
placeholder="Enter ThreeDS request id" placeholder="Enter ThreeDS request id"
required=true required=false
type="Text"
[netcetera.metadata.merchant_configuration_id]
name="merchant_configuration_id"
label="Merchant Configuration ID"
placeholder="Enter Merchant Configuration ID"
required=false
type="Text" type="Text"
[taxjar] [taxjar]

View File

@ -4045,31 +4045,37 @@ type="Text"
name="mcc" name="mcc"
label="MCC" label="MCC"
placeholder="Enter MCC" placeholder="Enter MCC"
required=true required=false
type="Text" type="Text"
[netcetera.metadata.merchant_country_code] [netcetera.metadata.merchant_country_code]
name="merchant_country_code" name="merchant_country_code"
label="3 digit numeric country code" label="3 digit numeric country code"
placeholder="Enter 3 digit numeric country code" placeholder="Enter 3 digit numeric country code"
required=true required=false
type="Text" type="Text"
[netcetera.metadata.merchant_name] [netcetera.metadata.merchant_name]
name="merchant_name" name="merchant_name"
label="Name of the merchant" label="Name of the merchant"
placeholder="Enter Name of the merchant" placeholder="Enter Name of the merchant"
required=true required=false
type="Text" type="Text"
[netcetera.metadata.three_ds_requestor_name] [netcetera.metadata.three_ds_requestor_name]
name="three_ds_requestor_name" name="three_ds_requestor_name"
label="ThreeDS requestor name" label="ThreeDS requestor name"
placeholder="Enter ThreeDS requestor name" placeholder="Enter ThreeDS requestor name"
required=true required=false
type="Text" type="Text"
[netcetera.metadata.three_ds_requestor_id] [netcetera.metadata.three_ds_requestor_id]
name="three_ds_requestor_id" name="three_ds_requestor_id"
label="ThreeDS request id" label="ThreeDS request id"
placeholder="Enter ThreeDS request id" placeholder="Enter ThreeDS request id"
required=true required=false
type="Text"
[netcetera.metadata.merchant_configuration_id]
name="merchant_configuration_id"
label="Merchant Configuration ID"
placeholder="Enter Merchant Configuration ID"
required=false
type="Text" type="Text"

View File

@ -253,12 +253,13 @@ pub struct NetceteraErrorDetails {
#[derive(Debug, Serialize, Deserialize)] #[derive(Debug, Serialize, Deserialize)]
pub struct NetceteraMetaData { pub struct NetceteraMetaData {
pub mcc: String, pub mcc: Option<String>,
pub merchant_country_code: String, pub merchant_country_code: Option<String>,
pub merchant_name: String, pub merchant_name: Option<String>,
pub endpoint_prefix: String, pub endpoint_prefix: String,
pub three_ds_requestor_name: String, pub three_ds_requestor_name: Option<String>,
pub three_ds_requestor_id: String, pub three_ds_requestor_id: Option<String>,
pub merchant_configuration_id: Option<String>,
} }
impl TryFrom<&Option<common_utils::pii::SecretSerdeValue>> for NetceteraMetaData { impl TryFrom<&Option<common_utils::pii::SecretSerdeValue>> for NetceteraMetaData {
@ -515,13 +516,13 @@ impl TryFrom<&NetceteraRouterData<&types::authentication::ConnectorAuthenticatio
.parse_value("NetceteraMetaData") .parse_value("NetceteraMetaData")
.change_context(errors::ConnectorError::RequestEncodingFailed)?; .change_context(errors::ConnectorError::RequestEncodingFailed)?;
let merchant_data = netcetera_types::MerchantData { let merchant_data = netcetera_types::MerchantData {
merchant_configuration_id: None, merchant_configuration_id: connector_meta_data.merchant_configuration_id,
mcc: Some(connector_meta_data.mcc), mcc: connector_meta_data.mcc,
merchant_country_code: Some(connector_meta_data.merchant_country_code), merchant_country_code: connector_meta_data.merchant_country_code,
merchant_name: Some(connector_meta_data.merchant_name), merchant_name: connector_meta_data.merchant_name,
notification_url: request.return_url.clone(), notification_url: request.return_url.clone(),
three_ds_requestor_id: Some(connector_meta_data.three_ds_requestor_id), three_ds_requestor_id: connector_meta_data.three_ds_requestor_id,
three_ds_requestor_name: Some(connector_meta_data.three_ds_requestor_name), three_ds_requestor_name: connector_meta_data.three_ds_requestor_name,
white_list_status: None, white_list_status: None,
trust_list_status: None, trust_list_status: None,
seller_info: None, seller_info: None,

View File

@ -6539,7 +6539,7 @@ pub fn validate_mandate_data_and_future_usage(
pub enum UnifiedAuthenticationServiceFlow { pub enum UnifiedAuthenticationServiceFlow {
ClickToPayInitiate, ClickToPayInitiate,
ExternalAuthenticationInitiate { ExternalAuthenticationInitiate {
acquirer_details: authentication::types::AcquirerDetails, acquirer_details: Option<authentication::types::AcquirerDetails>,
card_number: ::cards::CardNumber, card_number: ::cards::CardNumber,
token: String, token: String,
}, },
@ -6613,7 +6613,7 @@ pub async fn decide_action_for_unified_authentication_service<F: Clone>(
pub enum PaymentExternalAuthenticationFlow { pub enum PaymentExternalAuthenticationFlow {
PreAuthenticationFlow { PreAuthenticationFlow {
acquirer_details: authentication::types::AcquirerDetails, acquirer_details: Option<authentication::types::AcquirerDetails>,
card_number: ::cards::CardNumber, card_number: ::cards::CardNumber,
token: String, token: String,
}, },
@ -6690,17 +6690,27 @@ pub async fn get_payment_external_authentication_flow_during_confirm<F: Clone>(
connector_data.merchant_connector_id.as_ref(), connector_data.merchant_connector_id.as_ref(),
) )
.await?; .await?;
let acquirer_details: authentication::types::AcquirerDetails = payment_connector_mca let acquirer_details = payment_connector_mca
.get_metadata() .get_metadata()
.get_required_value("merchant_connector_account.metadata")?
.peek()
.clone() .clone()
.parse_value("AcquirerDetails") .and_then(|metadata| {
.change_context(errors::ApiErrorResponse::PreconditionFailed { metadata
message: .peek()
"acquirer_bin and acquirer_merchant_id not found in Payment Connector's Metadata" .clone()
.to_string(), .parse_value::<authentication::types::AcquirerDetails>("AcquirerDetails")
})?; .change_context(errors::ApiErrorResponse::PreconditionFailed {
message:
"acquirer_bin and acquirer_merchant_id not found in Payment Connector's Metadata"
.to_string(),
})
.inspect_err(|err| {
logger::error!(
"Failed to parse acquirer details from Payment Connector's Metadata: {:?}",
err
);
})
.ok()
});
Some(PaymentExternalAuthenticationFlow::PreAuthenticationFlow { Some(PaymentExternalAuthenticationFlow::PreAuthenticationFlow {
card_number, card_number,
token, token,

View File

@ -983,7 +983,7 @@ impl<F: Clone + Send + Sync> Domain<F, api::PaymentsRequest, PaymentData<F>> for
card_number, card_number,
token, token,
business_profile, business_profile,
Some(acquirer_details), acquirer_details,
Some(payment_data.payment_attempt.payment_id.clone()), Some(payment_data.payment_attempt.payment_id.clone()),
payment_data.payment_attempt.organization_id.clone(), payment_data.payment_attempt.organization_id.clone(),
) )
@ -1267,7 +1267,7 @@ impl<F: Clone + Send + Sync> Domain<F, api::PaymentsRequest, PaymentData<F>> for
state, state,
pre_auth_response, pre_auth_response,
authentication.clone(), authentication.clone(),
Some(acquirer_details), acquirer_details,
).await?; ).await?;
payment_data.authentication = Some(updated_authentication.clone()); payment_data.authentication = Some(updated_authentication.clone());