diff --git a/crates/router/src/core/payments.rs b/crates/router/src/core/payments.rs index ad103d14e6..c9f8515f09 100644 --- a/crates/router/src/core/payments.rs +++ b/crates/router/src/core/payments.rs @@ -100,7 +100,12 @@ where let connector_details = operation .to_domain()? - .get_connector(&merchant_account, state, &req) + .get_connector( + &merchant_account, + state, + &req, + payment_data.payment_attempt.connector.as_ref(), + ) .await?; let connector_details = route_connector( diff --git a/crates/router/src/core/payments/helpers.rs b/crates/router/src/core/payments/helpers.rs index 89ea61078e..0b64d80afb 100644 --- a/crates/router/src/core/payments/helpers.rs +++ b/crates/router/src/core/payments/helpers.rs @@ -596,13 +596,13 @@ pub async fn get_customer_from_details( pub async fn get_connector_default( state: &AppState, - request_connector: Option, + request_connector: Option<&String>, ) -> CustomResult { let connectors = &state.conf.connectors; - if let Some(connector) = request_connector { + if let Some(connector_name) = request_connector { let connector_data = api::ConnectorData::get_connector_by_name( connectors, - &connector.to_string(), + connector_name, api::GetToken::Connector, )?; Ok(api::ConnectorCallType::Single(connector_data)) diff --git a/crates/router/src/core/payments/operations.rs b/crates/router/src/core/payments/operations.rs index 1b8130d1e6..062fa91e2b 100644 --- a/crates/router/src/core/payments/operations.rs +++ b/crates/router/src/core/payments/operations.rs @@ -125,6 +125,7 @@ pub trait Domain: Send + Sync { merchant_account: &storage::MerchantAccount, state: &AppState, request: &R, + previously_used_connector: Option<&String>, ) -> CustomResult; } @@ -192,8 +193,9 @@ where _merchant_account: &storage::MerchantAccount, state: &AppState, _request: &api::PaymentsRetrieveRequest, + previously_used_connector: Option<&String>, ) -> CustomResult { - helpers::get_connector_default(state, None).await + helpers::get_connector_default(state, previously_used_connector).await } #[instrument(skip_all)] @@ -258,8 +260,9 @@ where _merchant_account: &storage::MerchantAccount, state: &AppState, _request: &api::PaymentsCaptureRequest, + previously_used_connector: Option<&String>, ) -> CustomResult { - helpers::get_connector_default(state, None).await + helpers::get_connector_default(state, previously_used_connector).await } } @@ -312,7 +315,8 @@ where _merchant_account: &storage::MerchantAccount, state: &AppState, _request: &api::PaymentsCancelRequest, + previously_used_connector: Option<&String>, ) -> CustomResult { - helpers::get_connector_default(state, None).await + helpers::get_connector_default(state, previously_used_connector).await } } diff --git a/crates/router/src/core/payments/operations/payment_confirm.rs b/crates/router/src/core/payments/operations/payment_confirm.rs index 3d233a4af5..86f7b9c803 100644 --- a/crates/router/src/core/payments/operations/payment_confirm.rs +++ b/crates/router/src/core/payments/operations/payment_confirm.rs @@ -253,8 +253,16 @@ impl Domain for PaymentConfirm { _merchant_account: &storage::MerchantAccount, state: &AppState, request: &api::PaymentsRequest, + previously_used_connector: Option<&String>, ) -> CustomResult { - helpers::get_connector_default(state, request.connector).await + // Use a new connector in the confirm call or use the same one which was passed when + // creating the payment or if none is passed then use the routing algorithm + let request_connector = request.connector.map(|connector| connector.to_string()); + helpers::get_connector_default( + state, + request_connector.as_ref().or(previously_used_connector), + ) + .await } } diff --git a/crates/router/src/core/payments/operations/payment_create.rs b/crates/router/src/core/payments/operations/payment_create.rs index e8fe5e6730..b2c7dffd3c 100644 --- a/crates/router/src/core/payments/operations/payment_create.rs +++ b/crates/router/src/core/payments/operations/payment_create.rs @@ -257,8 +257,10 @@ impl Domain for PaymentCreate { _merchant_account: &storage::MerchantAccount, state: &AppState, request: &api::PaymentsRequest, + _previously_used_connector: Option<&String>, ) -> CustomResult { - helpers::get_connector_default(state, request.connector).await + let request_connector = request.connector.map(|connector| connector.to_string()); + helpers::get_connector_default(state, request_connector.as_ref()).await } } diff --git a/crates/router/src/core/payments/operations/payment_method_validate.rs b/crates/router/src/core/payments/operations/payment_method_validate.rs index d6fc4b6adc..ce508471e2 100644 --- a/crates/router/src/core/payments/operations/payment_method_validate.rs +++ b/crates/router/src/core/payments/operations/payment_method_validate.rs @@ -254,8 +254,9 @@ where _merchant_account: &storage::MerchantAccount, state: &AppState, _request: &api::VerifyRequest, + previously_used_connector: Option<&String>, ) -> CustomResult { - helpers::get_connector_default(state, None).await + helpers::get_connector_default(state, previously_used_connector).await } } diff --git a/crates/router/src/core/payments/operations/payment_session.rs b/crates/router/src/core/payments/operations/payment_session.rs index 95fc06246a..29a1b27433 100644 --- a/crates/router/src/core/payments/operations/payment_session.rs +++ b/crates/router/src/core/payments/operations/payment_session.rs @@ -269,6 +269,7 @@ where merchant_account: &storage::MerchantAccount, state: &AppState, request: &api::PaymentsSessionRequest, + _previously_used_connector: Option<&String>, ) -> RouterResult { let connectors = &state.conf.connectors; let db = &state.store; diff --git a/crates/router/src/core/payments/operations/payment_start.rs b/crates/router/src/core/payments/operations/payment_start.rs index 505c57c87f..ffbfb6c585 100644 --- a/crates/router/src/core/payments/operations/payment_start.rs +++ b/crates/router/src/core/payments/operations/payment_start.rs @@ -249,7 +249,8 @@ where _merchant_account: &storage::MerchantAccount, state: &AppState, _request: &api::PaymentsStartRequest, + previously_used_connector: Option<&String>, ) -> CustomResult { - helpers::get_connector_default(state, None).await + helpers::get_connector_default(state, previously_used_connector).await } } diff --git a/crates/router/src/core/payments/operations/payment_status.rs b/crates/router/src/core/payments/operations/payment_status.rs index 218bf3799f..a75bf62293 100644 --- a/crates/router/src/core/payments/operations/payment_status.rs +++ b/crates/router/src/core/payments/operations/payment_status.rs @@ -101,8 +101,9 @@ impl Domain for PaymentStatus { _merchant_account: &storage::MerchantAccount, state: &AppState, _request: &api::PaymentsRequest, + previously_used_connector: Option<&String>, ) -> CustomResult { - helpers::get_connector_default(state, None).await + helpers::get_connector_default(state, previously_used_connector).await } } diff --git a/crates/router/src/core/payments/operations/payment_update.rs b/crates/router/src/core/payments/operations/payment_update.rs index 2bf5f3b3b3..98b2cfe007 100644 --- a/crates/router/src/core/payments/operations/payment_update.rs +++ b/crates/router/src/core/payments/operations/payment_update.rs @@ -273,8 +273,9 @@ impl Domain for PaymentUpdate { _merchant_account: &storage::MerchantAccount, state: &AppState, _request: &api::PaymentsRequest, + previously_used_connector: Option<&String>, ) -> CustomResult { - helpers::get_connector_default(state, None).await + helpers::get_connector_default(state, previously_used_connector).await } }