From 5fa7b147aa81832dcda767efa5c02f2e82131f73 Mon Sep 17 00:00:00 2001 From: Shankar Singh C <83439957+ShankarSinghC@users.noreply.github.com> Date: Wed, 14 Aug 2024 20:49:52 +0530 Subject: [PATCH] refactor(router): use the saved billing details in the recurring payments (#5631) --- .../src/payment_address.rs | 24 +++++++++++++++++++ .../router/src/core/payments/transformers.rs | 24 +++++++++++++++++-- 2 files changed, 46 insertions(+), 2 deletions(-) diff --git a/crates/hyperswitch_domain_models/src/payment_address.rs b/crates/hyperswitch_domain_models/src/payment_address.rs index d4f2cf9f350..548dd0c5416 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 9182bf93606..24f5ffdca9a 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