mirror of
https://github.com/juspay/hyperswitch.git
synced 2025-11-02 04:04:43 +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)]
|
||||
pub struct ApplepaySessionTokenData {
|
||||
#[serde(flatten)]
|
||||
pub data: ApplepaySessionTokenMetadata,
|
||||
pub apple_pay: ApplePayMetadata,
|
||||
}
|
||||
|
||||
#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)]
|
||||
pub struct ApplepayCombinedSessionTokenData {
|
||||
pub apple_pay_combined: ApplePayCombinedMetadata,
|
||||
}
|
||||
|
||||
#[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> {
|
||||
let apple_pay_metadata = item.get_connector_meta()?.expose();
|
||||
let applepay_metadata = apple_pay_metadata
|
||||
.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,
|
||||
)
|
||||
})
|
||||
})
|
||||
.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) => {
|
||||
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 applepay_metadata = metadata
|
||||
.clone()
|
||||
.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)?;
|
||||
|
||||
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) => {
|
||||
Err(errors::ConnectorError::FlowNotSupported {
|
||||
flow: "apple pay combined".to_string(),
|
||||
|
||||
@ -1127,10 +1127,32 @@ fn check_apple_pay_metadata(
|
||||
merchant_connector_account.clone().and_then(|mca| {
|
||||
let metadata = mca.get_metadata();
|
||||
metadata.and_then(|apple_pay_metadata| {
|
||||
let parsed_metadata: Result<api_models::payments::ApplepaySessionTokenData, _> =
|
||||
apple_pay_metadata.parse_value("ApplepaySessionTokenData").map_err(|error| logger::error!(%error, "Failed to Parse Value to ApplepaySessionTokenData"));
|
||||
let parsed_metadata = apple_pay_metadata
|
||||
.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(
|
||||
apple_pay_combined,
|
||||
) => match apple_pay_combined {
|
||||
|
||||
@ -87,9 +87,28 @@ impl Feature<api::Session, types::PaymentsSessionData> for types::PaymentsSessio
|
||||
|
||||
fn get_applepay_metadata(
|
||||
connector_metadata: Option<common_utils::pii::SecretSerdeValue>,
|
||||
) -> RouterResult<payment_types::ApplepaySessionTokenData> {
|
||||
) -> RouterResult<payment_types::ApplepaySessionTokenMetadata> {
|
||||
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 {
|
||||
field_name: "connector_metadata".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_merchant_cert,
|
||||
apple_pay_merchant_cert_key,
|
||||
) = match apple_pay_metadata.data {
|
||||
) = match apple_pay_metadata {
|
||||
payment_types::ApplepaySessionTokenMetadata::ApplePayCombined(
|
||||
apple_pay_combined_metadata,
|
||||
) => match apple_pay_combined_metadata {
|
||||
|
||||
Reference in New Issue
Block a user