diff --git a/crates/hyperswitch_domain_models/src/payment_address.rs b/crates/hyperswitch_domain_models/src/payment_address.rs index d4f2cf9f350f..548dd0c54166 100644 --- a/crates/hyperswitch_domain_models/src/payment_address.rs +++ b/crates/hyperswitch_domain_models/src/payment_address.rs @@ -53,6 +53,7 @@ impl PaymentAddress { } /// Unify the billing details from `payment_method_data.[payment_method_data].billing details`. + /// Here the fields passed in payment_method_data_billing takes precedence pub fn unify_with_payment_method_data_billing( self, payment_method_data_billing: Option
, @@ -72,6 +73,29 @@ impl PaymentAddress { } } + /// Unify the billing details from `payment_method_data.[payment_method_data].billing details`. + /// Here the `self` takes precedence + pub fn unify_with_payment_data_billing( + self, + other_payment_method_billing: Option
, + ) -> Self { + let unified_payment_method_billing = self + .get_payment_method_billing() + .map(|payment_method_billing| { + payment_method_billing + .clone() + .unify_address(other_payment_method_billing.as_ref()) + }) + .or(other_payment_method_billing); + + Self { + shipping: self.shipping, + billing: self.billing, + unified_payment_method_billing, + payment_method_billing: self.payment_method_billing, + } + } + pub fn get_request_payment_method_billing(&self) -> Option<&Address> { self.payment_method_billing.as_ref() } diff --git a/crates/router/src/core/payments/transformers.rs b/crates/router/src/core/payments/transformers.rs index 9182bf936068..24f5ffdca9a7 100644 --- a/crates/router/src/core/payments/transformers.rs +++ b/crates/router/src/core/payments/transformers.rs @@ -42,7 +42,7 @@ pub async fn construct_payment_router_data<'a, F, T>( payment_data: PaymentData, connector_id: &str, merchant_account: &domain::MerchantAccount, - _key_store: &domain::MerchantKeyStore, + key_store: &domain::MerchantKeyStore, customer: &'a Option, merchant_connector_account: &helpers::MerchantConnectorAccountType, merchant_recipient_data: Option, @@ -135,6 +135,26 @@ where Some(merchant_connector_account), ); + let unified_address = + if let Some(payment_method_info) = payment_data.payment_method_info.clone() { + let payment_method_billing = + crate::core::payment_methods::cards::decrypt_generic_data::
( + state, + payment_method_info.payment_method_billing_address, + key_store, + ) + .await + .attach_printable("unable to decrypt payment method billing address details")?; + payment_data + .address + .clone() + .unify_with_payment_data_billing(payment_method_billing) + } else { + payment_data.address + }; + + crate::logger::debug!("unified address details {:?}", unified_address); + router_data = types::RouterData { flow: PhantomData, merchant_id: merchant_account.get_id().clone(), @@ -147,7 +167,7 @@ where connector_auth_type: auth_type, description: payment_data.payment_intent.description.clone(), return_url: payment_data.payment_intent.return_url.clone(), - address: payment_data.address.clone(), + address: unified_address, auth_type: payment_data .payment_attempt .authentication_type