mirror of
https://github.com/juspay/hyperswitch.git
synced 2025-11-02 04:04:43 +08:00
feat(router): Add support for passing the domain dynamically in the session call (#5347)
This commit is contained in:
@ -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),
|
||||
})
|
||||
}
|
||||
|
||||
|
||||
@ -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 {
|
||||
|
||||
@ -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,
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user