feat(router): Add support for passing the domain dynamically in the session call (#5347)

This commit is contained in:
Shankar Singh C
2024-07-17 22:43:51 +05:30
committed by GitHub
parent 2d204c9f73
commit 67bfb1cfec
4 changed files with 58 additions and 11 deletions

View File

@ -210,6 +210,7 @@ async fn create_applepay_session_token(
apple_pay_merchant_cert_key,
apple_pay_merchant_identifier,
merchant_business_country,
merchant_configured_domain_optional,
) = match apple_pay_metadata {
payment_types::ApplepaySessionTokenMetadata::ApplePayCombined(
apple_pay_combined_metadata,
@ -232,7 +233,7 @@ async fn create_applepay_session_token(
let apple_pay_session_request = get_session_request_for_simplified_apple_pay(
merchant_identifier.clone(),
session_token_data,
session_token_data.clone(),
);
let apple_pay_merchant_cert = state
@ -256,6 +257,7 @@ async fn create_applepay_session_token(
apple_pay_merchant_cert_key,
merchant_identifier,
merchant_business_country,
Some(session_token_data.initiative_context),
)
}
payment_types::ApplePayCombinedMetadata::Manual {
@ -264,8 +266,10 @@ async fn create_applepay_session_token(
} => {
logger::info!("Apple pay manual flow");
let apple_pay_session_request =
get_session_request_for_manual_apple_pay(session_token_data.clone());
let apple_pay_session_request = get_session_request_for_manual_apple_pay(
session_token_data.clone(),
header_payload.x_merchant_domain.clone(),
);
let merchant_business_country = session_token_data.merchant_business_country;
@ -276,6 +280,7 @@ async fn create_applepay_session_token(
session_token_data.certificate_keys,
session_token_data.merchant_identifier,
merchant_business_country,
session_token_data.initiative_context,
)
}
},
@ -284,6 +289,7 @@ async fn create_applepay_session_token(
let apple_pay_session_request = get_session_request_for_manual_apple_pay(
apple_pay_metadata.session_token_data.clone(),
header_payload.x_merchant_domain.clone(),
);
let merchant_business_country = apple_pay_metadata
@ -299,6 +305,7 @@ async fn create_applepay_session_token(
.clone(),
apple_pay_metadata.session_token_data.merchant_identifier,
merchant_business_country,
apple_pay_metadata.session_token_data.initiative_context,
)
}
};
@ -383,9 +390,9 @@ async fn create_applepay_session_token(
.attach_printable("Failed to obtain apple pay session request")?;
let applepay_session_request = build_apple_pay_session_request(
state,
apple_pay_session_request,
apple_pay_merchant_cert,
apple_pay_merchant_cert_key,
apple_pay_session_request.clone(),
apple_pay_merchant_cert.clone(),
apple_pay_merchant_cert_key.clone(),
)?;
let response = services::call_connector_api(
@ -395,10 +402,43 @@ async fn create_applepay_session_token(
)
.await;
// logging the error if present in session call response
log_session_response_if_error(&response);
let updated_response = match (
response.as_ref().ok(),
header_payload.x_merchant_domain.clone(),
) {
(Some(Err(error)), Some(_)) => {
logger::error!(
"Retry apple pay session call with the merchant configured domain {error:?}"
);
let merchant_configured_domain = merchant_configured_domain_optional
.ok_or(errors::ApiErrorResponse::InternalServerError)
.attach_printable(
"Failed to get initiative_context for apple pay session call retry",
)?;
let apple_pay_retry_session_request =
payment_types::ApplepaySessionRequest {
initiative_context: merchant_configured_domain,
..apple_pay_session_request
};
let applepay_retry_session_request = build_apple_pay_session_request(
state,
apple_pay_retry_session_request,
apple_pay_merchant_cert,
apple_pay_merchant_cert_key,
)?;
services::call_connector_api(
state,
applepay_retry_session_request,
"create_apple_pay_session_token",
)
.await
}
_ => response,
};
response
// logging the error if present in session call response
log_session_response_if_error(&updated_response);
updated_response
.ok()
.and_then(|apple_pay_res| {
apple_pay_res
@ -454,6 +494,7 @@ fn get_session_request_for_simplified_apple_pay(
fn get_session_request_for_manual_apple_pay(
session_token_data: payment_types::SessionTokenInfo,
merchant_domain: Option<String>,
) -> RouterResult<payment_types::ApplepaySessionRequest> {
let initiative_context = session_token_data
.initiative_context
@ -463,7 +504,7 @@ fn get_session_request_for_manual_apple_pay(
merchant_identifier: session_token_data.merchant_identifier.clone(),
display_name: session_token_data.display_name.clone(),
initiative: session_token_data.initiative.to_string(),
initiative_context,
initiative_context: merchant_domain.unwrap_or(initiative_context),
})
}

View File

@ -79,6 +79,7 @@ pub mod headers {
pub const CONTENT_LENGTH: &str = "Content-Length";
pub const BROWSER_NAME: &str = "x-browser-name";
pub const X_CLIENT_PLATFORM: &str = "x-client-platform";
pub const X_MERCHANT_DOMAIN: &str = "x-merchant-domain";
}
pub mod pii {

View File

@ -21,7 +21,7 @@ use super::domain;
use crate::{
core::errors,
headers::{
BROWSER_NAME, X_CLIENT_PLATFORM, X_CLIENT_SOURCE, X_CLIENT_VERSION,
BROWSER_NAME, X_CLIENT_PLATFORM, X_CLIENT_SOURCE, X_CLIENT_VERSION, X_MERCHANT_DOMAIN,
X_PAYMENT_CONFIRM_SOURCE,
},
services::authentication::get_header_value_by_key,
@ -1157,6 +1157,9 @@ impl ForeignTryFrom<&HeaderMap> for payments::HeaderPayload {
.unwrap_or(api_enums::ClientPlatform::Unknown)
});
let x_merchant_domain =
get_header_value_by_key(X_MERCHANT_DOMAIN.into(), headers)?.map(|val| val.to_string());
Ok(Self {
payment_confirm_source,
client_source,
@ -1164,6 +1167,7 @@ impl ForeignTryFrom<&HeaderMap> for payments::HeaderPayload {
x_hs_latency: Some(x_hs_latency),
browser_name,
x_client_platform,
x_merchant_domain,
})
}
}