diff --git a/crates/router/src/core/payments/operations/payment_confirm.rs b/crates/router/src/core/payments/operations/payment_confirm.rs index 635b3c24cf21..9bbe7cca3912 100644 --- a/crates/router/src/core/payments/operations/payment_confirm.rs +++ b/crates/router/src/core/payments/operations/payment_confirm.rs @@ -576,12 +576,6 @@ impl GetTracker, api::PaymentsRequest> for Pa payment_method_info, } = mandate_details; - payment_attempt.payment_method_type = payment_method_type - .or(payment_attempt.payment_method_type) - .or(payment_method_info - .as_ref() - .and_then(|pm_info| pm_info.payment_method_type)); - let token = token.or_else(|| payment_attempt.payment_token.clone()); helpers::validate_pm_or_token_given( @@ -650,6 +644,17 @@ impl GetTracker, api::PaymentsRequest> for Pa payment_attempt.payment_method = payment_method.or(payment_attempt.payment_method); + let payment_method_type = Option::::foreign_from(( + payment_method_type, + additional_pm_data.as_ref(), + )); + + payment_attempt.payment_method_type = payment_method_type + .or(payment_attempt.payment_method_type) + .or(payment_method_info + .as_ref() + .and_then(|pm_info| pm_info.payment_method_type)); + // The operation merges mandate data from both request and payment_attempt let setup_mandate = mandate_data.map(|mut sm| { sm.mandate_type = payment_attempt.mandate_details.clone().or(sm.mandate_type); diff --git a/crates/router/src/core/payments/operations/payment_create.rs b/crates/router/src/core/payments/operations/payment_create.rs index c65e58ea2d48..1f0884fe3849 100644 --- a/crates/router/src/core/payments/operations/payment_create.rs +++ b/crates/router/src/core/payments/operations/payment_create.rs @@ -1195,6 +1195,11 @@ impl PaymentCreate { None }; + let payment_method_type = Option::::foreign_from(( + payment_method_type, + additional_pm_data.as_ref(), + )); + Ok(( storage::PaymentAttemptNew { payment_id: payment_id.to_owned(), diff --git a/crates/router/src/core/payments/transformers.rs b/crates/router/src/core/payments/transformers.rs index d37b249cd8a9..ba77ee5ae8b7 100644 --- a/crates/router/src/core/payments/transformers.rs +++ b/crates/router/src/core/payments/transformers.rs @@ -3357,3 +3357,38 @@ impl ForeignFrom for DieselConnectorMandateReferenc } } } + +impl ForeignFrom<(Self, Option<&api_models::payments::AdditionalPaymentData>)> + for Option +{ + fn foreign_from(req: (Self, Option<&api_models::payments::AdditionalPaymentData>)) -> Self { + let (payment_method_type, additional_pm_data) = req; + additional_pm_data + .and_then(|pm_data| { + if let api_models::payments::AdditionalPaymentData::Card(card_info) = pm_data { + card_info.card_type.as_ref().and_then(|card_type_str| { + api_models::enums::PaymentMethodType::from_str(&card_type_str.to_lowercase()).map_err(|err| { + crate::logger::error!( + "Err - {:?}\nInvalid card_type value found in BIN DB - {:?}", + err, + card_type_str, + ); + }).ok() + }) + } else { + None + } + }) + .map_or(payment_method_type, |card_type_in_bin_store| { + if let Some(card_type_in_req) = payment_method_type { + if card_type_in_req != card_type_in_bin_store { + crate::logger::info!( + "Mismatch in card_type\nAPI request - {}; BIN lookup - {}\nOverriding with {}", + card_type_in_req, card_type_in_bin_store, card_type_in_bin_store, + ); + } + } + Some(card_type_in_bin_store) + }) + } +}