mirror of
https://github.com/juspay/hyperswitch.git
synced 2025-11-01 19:42:27 +08:00
fix(payment_methos): prioritized apple_pay_combined deserialization over apple_pay (#2393)
This commit is contained in:
@ -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)]
|
||||||
|
|||||||
@ -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(),
|
||||||
|
|||||||
@ -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 {
|
||||||
|
|||||||
@ -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 {
|
||||||
|
|||||||
Reference in New Issue
Block a user