fix(payment_methos): prioritized apple_pay_combined deserialization over apple_pay (#2393)

This commit is contained in:
Shankar Singh C
2023-10-03 12:53:40 +05:30
committed by GitHub
parent 6bf0e75b69
commit f12ce9c72d
4 changed files with 93 additions and 14 deletions

View File

@ -2375,8 +2375,12 @@ pub struct ApplepayConnectorMetadataRequest {
#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] #[derive(Debug, Clone, serde::Serialize, serde::Deserialize)]
pub struct ApplepaySessionTokenData { pub struct ApplepaySessionTokenData {
#[serde(flatten)] pub apple_pay: ApplePayMetadata,
pub data: ApplepaySessionTokenMetadata, }
#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)]
pub struct ApplepayCombinedSessionTokenData {
pub apple_pay_combined: ApplePayCombinedMetadata,
} }
#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] #[derive(Debug, Clone, serde::Serialize, serde::Deserialize)]

View File

@ -423,11 +423,28 @@ impl TryFrom<&types::PaymentsSessionRouterData> for BluesnapCreateWalletToken {
fn try_from(item: &types::PaymentsSessionRouterData) -> Result<Self, Self::Error> { fn try_from(item: &types::PaymentsSessionRouterData) -> Result<Self, Self::Error> {
let apple_pay_metadata = item.get_connector_meta()?.expose(); let apple_pay_metadata = item.get_connector_meta()?.expose();
let applepay_metadata = apple_pay_metadata let applepay_metadata = apple_pay_metadata
.parse_value::<api_models::payments::ApplepaySessionTokenData>( .clone()
"ApplepaySessionTokenData", .parse_value::<api_models::payments::ApplepayCombinedSessionTokenData>(
"ApplepayCombinedSessionTokenData",
) )
.map(|combined_metadata| {
api_models::payments::ApplepaySessionTokenMetadata::ApplePayCombined(
combined_metadata.apple_pay_combined,
)
})
.or_else(|_| {
apple_pay_metadata
.parse_value::<api_models::payments::ApplepaySessionTokenData>(
"ApplepaySessionTokenData",
)
.map(|old_metadata| {
api_models::payments::ApplepaySessionTokenMetadata::ApplePay(
old_metadata.apple_pay,
)
})
})
.change_context(errors::ConnectorError::ParsingFailed)?; .change_context(errors::ConnectorError::ParsingFailed)?;
let session_token_data = match applepay_metadata.data { let session_token_data = match applepay_metadata {
payments::ApplepaySessionTokenMetadata::ApplePay(apple_pay_data) => { payments::ApplepaySessionTokenMetadata::ApplePay(apple_pay_data) => {
Ok(apple_pay_data.session_token_data) Ok(apple_pay_data.session_token_data)
} }
@ -468,12 +485,29 @@ impl TryFrom<types::PaymentsSessionResponseRouterData<BluesnapWalletTokenRespons
let metadata = item.data.get_connector_meta()?.expose(); let metadata = item.data.get_connector_meta()?.expose();
let applepay_metadata = metadata let applepay_metadata = metadata
.parse_value::<api_models::payments::ApplepaySessionTokenData>( .clone()
"ApplepaySessionTokenData", .parse_value::<api_models::payments::ApplepayCombinedSessionTokenData>(
"ApplepayCombinedSessionTokenData",
) )
.map(|combined_metadata| {
api_models::payments::ApplepaySessionTokenMetadata::ApplePayCombined(
combined_metadata.apple_pay_combined,
)
})
.or_else(|_| {
metadata
.parse_value::<api_models::payments::ApplepaySessionTokenData>(
"ApplepaySessionTokenData",
)
.map(|old_metadata| {
api_models::payments::ApplepaySessionTokenMetadata::ApplePay(
old_metadata.apple_pay,
)
})
})
.change_context(errors::ConnectorError::ParsingFailed)?; .change_context(errors::ConnectorError::ParsingFailed)?;
let (payment_request_data, session_token_data) = match applepay_metadata.data { let (payment_request_data, session_token_data) = match applepay_metadata {
payments::ApplepaySessionTokenMetadata::ApplePayCombined(_apple_pay_combined) => { payments::ApplepaySessionTokenMetadata::ApplePayCombined(_apple_pay_combined) => {
Err(errors::ConnectorError::FlowNotSupported { Err(errors::ConnectorError::FlowNotSupported {
flow: "apple pay combined".to_string(), flow: "apple pay combined".to_string(),

View File

@ -1127,10 +1127,32 @@ fn check_apple_pay_metadata(
merchant_connector_account.clone().and_then(|mca| { merchant_connector_account.clone().and_then(|mca| {
let metadata = mca.get_metadata(); let metadata = mca.get_metadata();
metadata.and_then(|apple_pay_metadata| { metadata.and_then(|apple_pay_metadata| {
let parsed_metadata: Result<api_models::payments::ApplepaySessionTokenData, _> = let parsed_metadata = apple_pay_metadata
apple_pay_metadata.parse_value("ApplepaySessionTokenData").map_err(|error| logger::error!(%error, "Failed to Parse Value to ApplepaySessionTokenData")); .clone()
.parse_value::<api_models::payments::ApplepayCombinedSessionTokenData>(
"ApplepayCombinedSessionTokenData",
)
.map(|combined_metadata| {
api_models::payments::ApplepaySessionTokenMetadata::ApplePayCombined(
combined_metadata.apple_pay_combined,
)
})
.or_else(|_| {
apple_pay_metadata
.parse_value::<api_models::payments::ApplepaySessionTokenData>(
"ApplepaySessionTokenData",
)
.map(|old_metadata| {
api_models::payments::ApplepaySessionTokenMetadata::ApplePay(
old_metadata.apple_pay,
)
})
})
.map_err(
|error| logger::error!(%error, "Failed to Parse Value to ApplepaySessionTokenData"),
);
parsed_metadata.ok().map(|metadata| match metadata.data { parsed_metadata.ok().map(|metadata| match metadata {
api_models::payments::ApplepaySessionTokenMetadata::ApplePayCombined( api_models::payments::ApplepaySessionTokenMetadata::ApplePayCombined(
apple_pay_combined, apple_pay_combined,
) => match apple_pay_combined { ) => match apple_pay_combined {

View File

@ -87,9 +87,28 @@ impl Feature<api::Session, types::PaymentsSessionData> for types::PaymentsSessio
fn get_applepay_metadata( fn get_applepay_metadata(
connector_metadata: Option<common_utils::pii::SecretSerdeValue>, connector_metadata: Option<common_utils::pii::SecretSerdeValue>,
) -> RouterResult<payment_types::ApplepaySessionTokenData> { ) -> RouterResult<payment_types::ApplepaySessionTokenMetadata> {
connector_metadata connector_metadata
.parse_value::<payment_types::ApplepaySessionTokenData>("ApplepaySessionTokenData") .clone()
.parse_value::<api_models::payments::ApplepayCombinedSessionTokenData>(
"ApplepayCombinedSessionTokenData",
)
.map(|combined_metadata| {
api_models::payments::ApplepaySessionTokenMetadata::ApplePayCombined(
combined_metadata.apple_pay_combined,
)
})
.or_else(|_| {
connector_metadata
.parse_value::<api_models::payments::ApplepaySessionTokenData>(
"ApplepaySessionTokenData",
)
.map(|old_metadata| {
api_models::payments::ApplepaySessionTokenMetadata::ApplePay(
old_metadata.apple_pay,
)
})
})
.change_context(errors::ApiErrorResponse::InvalidDataFormat { .change_context(errors::ApiErrorResponse::InvalidDataFormat {
field_name: "connector_metadata".to_string(), field_name: "connector_metadata".to_string(),
expected_format: "applepay_metadata_format".to_string(), expected_format: "applepay_metadata_format".to_string(),
@ -154,7 +173,7 @@ async fn create_applepay_session_token(
apple_pay_session_request, apple_pay_session_request,
apple_pay_merchant_cert, apple_pay_merchant_cert,
apple_pay_merchant_cert_key, apple_pay_merchant_cert_key,
) = match apple_pay_metadata.data { ) = match apple_pay_metadata {
payment_types::ApplepaySessionTokenMetadata::ApplePayCombined( payment_types::ApplepaySessionTokenMetadata::ApplePayCombined(
apple_pay_combined_metadata, apple_pay_combined_metadata,
) => match apple_pay_combined_metadata { ) => match apple_pay_combined_metadata {