diff --git a/crates/router/src/core/payments/operations/payment_response.rs b/crates/router/src/core/payments/operations/payment_response.rs index 748b71469b..70d5f79845 100644 --- a/crates/router/src/core/payments/operations/payment_response.rs +++ b/crates/router/src/core/payments/operations/payment_response.rs @@ -576,7 +576,7 @@ impl PostUpdateTracker, types::PaymentsSyncData> for merchant_account: &domain::MerchantAccount, key_store: &domain::MerchantKeyStore, payment_data: &mut PaymentData, - business_profile: &domain::Profile, + _business_profile: &domain::Profile, ) -> CustomResult<(), errors::ApiErrorResponse> where F: 'b + Clone + Send + Sync, @@ -617,7 +617,6 @@ impl PostUpdateTracker, types::PaymentsSyncData> for resp.status, resp.response.clone(), merchant_account.storage_scheme, - business_profile.is_connector_agnostic_mit_enabled, ) .await?; Ok(()) @@ -1201,7 +1200,7 @@ impl PostUpdateTracker, types::CompleteAuthorizeData merchant_account: &domain::MerchantAccount, key_store: &domain::MerchantKeyStore, payment_data: &mut PaymentData, - business_profile: &domain::Profile, + _business_profile: &domain::Profile, ) -> CustomResult<(), errors::ApiErrorResponse> where F: 'b + Clone + Send + Sync, @@ -1241,7 +1240,6 @@ impl PostUpdateTracker, types::CompleteAuthorizeData resp.status, resp.response.clone(), merchant_account.storage_scheme, - business_profile.is_connector_agnostic_mit_enabled, ) .await?; Ok(()) @@ -2068,7 +2066,6 @@ async fn update_payment_method_status_and_ntid( attempt_status: common_enums::AttemptStatus, payment_response: Result, storage_scheme: enums::MerchantStorageScheme, - is_connector_agnostic_mit_enabled: Option, ) -> RouterResult<()> { todo!() } @@ -2084,7 +2081,6 @@ async fn update_payment_method_status_and_ntid( attempt_status: common_enums::AttemptStatus, payment_response: Result, storage_scheme: enums::MerchantStorageScheme, - is_connector_agnostic_mit_enabled: Option, ) -> RouterResult<()> { // If the payment_method is deleted then ignore the error related to retrieving payment method // This should be handled when the payment method is soft deleted @@ -2119,20 +2115,18 @@ async fn update_payment_method_status_and_ntid( }) .ok() .flatten(); - let network_transaction_id = - if let Some(network_transaction_id) = pm_resp_network_transaction_id { - if is_connector_agnostic_mit_enabled == Some(true) - && payment_data.payment_intent.setup_future_usage - == Some(diesel_models::enums::FutureUsage::OffSession) - { - Some(network_transaction_id) - } else { - logger::info!("Skip storing network transaction id"); - None - } + let network_transaction_id = if payment_data.payment_intent.setup_future_usage + == Some(diesel_models::enums::FutureUsage::OffSession) + { + if pm_resp_network_transaction_id.is_some() { + pm_resp_network_transaction_id } else { + logger::info!("Skip storing network transaction id"); None - }; + } + } else { + None + }; let pm_update = if payment_method.status != common_enums::PaymentMethodStatus::Active && payment_method.status != attempt_status.into() diff --git a/crates/router/src/core/payments/tokenization.rs b/crates/router/src/core/payments/tokenization.rs index 597831231a..d46977d8c9 100644 --- a/crates/router/src/core/payments/tokenization.rs +++ b/crates/router/src/core/payments/tokenization.rs @@ -111,12 +111,11 @@ where }; let network_transaction_id = - if let Some(network_transaction_id) = network_transaction_id { - if business_profile.is_connector_agnostic_mit_enabled == Some(true) - && save_payment_method_data.request.get_setup_future_usage() - == Some(storage_enums::FutureUsage::OffSession) - { - Some(network_transaction_id) + if save_payment_method_data.request.get_setup_future_usage() + == Some(storage_enums::FutureUsage::OffSession) + { + if network_transaction_id.is_some() { + network_transaction_id } else { logger::info!("Skip storing network transaction id"); None diff --git a/cypress-tests/cypress/e2e/spec/Payment/00024-ConnectorAgnosticNTID.cy.js b/cypress-tests/cypress/e2e/spec/Payment/00024-ConnectorAgnosticNTID.cy.js index 308a8c036c..8491cb0b8c 100644 --- a/cypress-tests/cypress/e2e/spec/Payment/00024-ConnectorAgnosticNTID.cy.js +++ b/cypress-tests/cypress/e2e/spec/Payment/00024-ConnectorAgnosticNTID.cy.js @@ -13,13 +13,38 @@ Flow: - Make a Payment - List Payment Method for Customer using Client Secret (will get PMID) -- Create Business Profile with connector agnostic feature enabled +- Create Business Profile with connector agnostic feature disabled - Create Merchant Connector Account - Create Payment Intent - List Payment Method for Customer -- Empty list; i.e., no payment method should be listed - Confirm Payment with PMID from previous step (should fail as Connector Mandate ID is not present in the newly created Profile) +- Create Business Profile with connector agnostic feature enabled +- Create Merchant Connector Account and Customer +- Make a Payment +- List Payment Method for Customer using Client Secret (will get PMID) + +- Create Business Profile with connector agnostic feature disabled +- Create Merchant Connector Account +- Create Payment Intent +- List Payment Method for Customer -- Empty list; i.e., no payment method should be listed +- Confirm Payment with PMID from previous step (should fail as Connector Mandate ID is not present in the newly created Profile) + + +- Create Business Profile with connector agnostic feature disabled +- Create Merchant Connector Account and Customer +- Make a Payment +- List Payment Method for Customer using Client Secret (will get PMID) + +- Create Business Profile with connector agnostic feature enabled +- Create Merchant Connector Account +- Create Payment Intent +- List Payment Method for Customer using Client Secret (will get PMID which is same as the one from previous step along with Payment Token) +- Confirm Payment with PMID from previous step (should pass as NTID is present in the DB) + + + - Create Business Profile with connector agnostic feature enabled - Create Merchant Connector Account and Customer - Make a Payment @@ -62,6 +87,371 @@ describe("Connector Agnostic Tests", () => { after("flush global state", () => { cy.task("setGlobalState", globalState.data); }); + + context( + "Connector Agnostic Disabled for both Profile 1 and Profile 2", + () => { + let shouldContinue = true; + + beforeEach(function () { + if (!shouldContinue) { + this.skip(); + } + }); + + it("Create business profile", () => { + utils.createBusinessProfile( + fixtures.businessProfile.bpCreate, + globalState + ); + }); + + it("Create merchant connector account", () => { + utils.createMerchantConnectorAccount( + "payment_processor", + fixtures.createConnectorBody, + globalState, + payment_methods_enabled + ); + }); + + it("Create Customer", () => { + cy.createCustomerCallTest(fixtures.customerCreateBody, globalState); + }); + + it("Create Payment Intent", () => { + const data = getConnectorDetails(globalState.get("connectorId"))[ + "card_pm" + ]["PaymentIntentOffSession"]; + + cy.createPaymentIntentTest( + fixtures.createPaymentBody, + data, + "no_three_ds", + "automatic", + globalState + ); + + if (shouldContinue) + shouldContinue = utils.should_continue_further(data); + }); + + it("Confirm Payment", () => { + const data = getConnectorDetails(globalState.get("connectorId"))[ + "card_pm" + ]["SaveCardUseNo3DSAutoCaptureOffSession"]; + + cy.confirmCallTest(fixtures.confirmBody, data, true, globalState); + + if (shouldContinue) + shouldContinue = utils.should_continue_further(data); + }); + + it("List Payment Method for Customer using Client Secret", () => { + cy.listCustomerPMByClientSecret(globalState); + }); + + it("Create business profile", () => { + utils.createBusinessProfile( + fixtures.businessProfile.bpCreate, + globalState + ); + }); + + it("Create merchant connector account", () => { + utils.createMerchantConnectorAccount( + "payment_processor", + fixtures.createConnectorBody, + globalState, + payment_methods_enabled + ); + }); + + it("Create Payment Intent", () => { + const data = getConnectorDetails(globalState.get("connectorId"))[ + "card_pm" + ]["PaymentIntentOffSession"]; + + cy.createPaymentIntentTest( + fixtures.createPaymentBody, + data, + "no_three_ds", + "automatic", + globalState + ); + + if (shouldContinue) + shouldContinue = utils.should_continue_further(data); + }); + + it("List Payment Method for Customer", () => { + cy.listCustomerPMByClientSecret(globalState); + }); + + it("Confirm No 3DS MIT (PMID)", () => { + const data = getConnectorDetails(globalState.get("connectorId"))[ + "card_pm" + ]["MITAutoCapture"]; + const commonData = getConnectorDetails(globalState.get("commons"))[ + "card_pm" + ]["MITAutoCapture"]; + + const newData = { + ...data, + Response: utils.getConnectorFlowDetails( + data, + commonData, + "ResponseCustom" + ), + }; + + cy.mitUsingPMId( + fixtures.pmIdConfirmBody, + newData, + 7000, + true, + "automatic", + globalState + ); + }); + + it("Create Payment Intent", () => { + const data = getConnectorDetails(globalState.get("connectorId"))[ + "card_pm" + ]["PaymentIntentOffSession"]; + + cy.createPaymentIntentTest( + fixtures.createPaymentBody, + data, + "no_three_ds", + "automatic", + globalState + ); + + if (shouldContinue) + shouldContinue = utils.should_continue_further(data); + }); + + it("List Payment Method for Customer", () => { + cy.listCustomerPMByClientSecret(globalState); + }); + + it("Confirm No 3DS MIT (Token)", () => { + const data = getConnectorDetails(globalState.get("connectorId"))[ + "card_pm" + ]["SaveCardConfirmAutoCaptureOffSession"]; + const commonData = getConnectorDetails(globalState.get("commons"))[ + "card_pm" + ]["SaveCardConfirmAutoCaptureOffSession"]; + + const newData = { + ...data, + Response: utils.getConnectorFlowDetails( + data, + commonData, + "ResponseCustom" + ), + }; + cy.saveCardConfirmCallTest( + fixtures.saveCardConfirmBody, + newData, + globalState + ); + + if (shouldContinue) + shouldContinue = utils.should_continue_further(data); + }); + } + ); + + context( + "Connector Agnostic Enabled for Profile 1 and Disabled for Profile 2", + () => { + let shouldContinue = true; + + beforeEach(function () { + if (!shouldContinue) { + this.skip(); + } + }); + + it("Create business profile", () => { + utils.createBusinessProfile( + fixtures.businessProfile.bpCreate, + globalState + ); + }); + + it("Enable Connector Agnostic for Business Profile", () => { + utils.updateBusinessProfile( + fixtures.businessProfile.bpUpdate, + true, // is_connector_agnostic_enabled + false, // collect_billing_address_from_wallet_connector + false, // collect_shipping_address_from_wallet_connector + false, // always_collect_billing_address_from_wallet_connector + false, // always_collect_shipping_address_from_wallet_connector + globalState + ); + }); + + it("Create merchant connector account", () => { + utils.createMerchantConnectorAccount( + "payment_processor", + fixtures.createConnectorBody, + globalState, + payment_methods_enabled + ); + }); + + it("Create Customer", () => { + cy.createCustomerCallTest(fixtures.customerCreateBody, globalState); + }); + + it("Create Payment Intent", () => { + const data = getConnectorDetails(globalState.get("connectorId"))[ + "card_pm" + ]["PaymentIntentOffSession"]; + + cy.createPaymentIntentTest( + fixtures.createPaymentBody, + data, + "no_three_ds", + "automatic", + globalState + ); + + if (shouldContinue) + shouldContinue = utils.should_continue_further(data); + }); + + it("Confirm Payment", () => { + const data = getConnectorDetails(globalState.get("connectorId"))[ + "card_pm" + ]["SaveCardUseNo3DSAutoCaptureOffSession"]; + + cy.confirmCallTest(fixtures.confirmBody, data, true, globalState); + + if (shouldContinue) + shouldContinue = utils.should_continue_further(data); + }); + + it("List Payment Method for Customer using Client Secret", () => { + cy.listCustomerPMByClientSecret(globalState); + }); + + it("Create business profile", () => { + utils.createBusinessProfile( + fixtures.businessProfile.bpCreate, + globalState + ); + }); + + it("Create merchant connector account", () => { + utils.createMerchantConnectorAccount( + "payment_processor", + fixtures.createConnectorBody, + globalState, + payment_methods_enabled + ); + }); + + it("Create Payment Intent", () => { + const data = getConnectorDetails(globalState.get("connectorId"))[ + "card_pm" + ]["PaymentIntentOffSession"]; + + cy.createPaymentIntentTest( + fixtures.createPaymentBody, + data, + "no_three_ds", + "automatic", + globalState + ); + + if (shouldContinue) + shouldContinue = utils.should_continue_further(data); + }); + + it("List Payment Method for Customer", () => { + cy.listCustomerPMByClientSecret(globalState); + }); + + it("Confirm No 3DS MIT (PMID)", () => { + const data = getConnectorDetails(globalState.get("connectorId"))[ + "card_pm" + ]["MITAutoCapture"]; + const commonData = getConnectorDetails(globalState.get("commons"))[ + "card_pm" + ]["MITAutoCapture"]; + + const newData = { + ...data, + Response: utils.getConnectorFlowDetails( + data, + commonData, + "ResponseCustom" + ), + }; + + cy.mitUsingPMId( + fixtures.pmIdConfirmBody, + newData, + 7000, + true, + "automatic", + globalState + ); + }); + + it("Create Payment Intent", () => { + const data = getConnectorDetails(globalState.get("connectorId"))[ + "card_pm" + ]["PaymentIntentOffSession"]; + + cy.createPaymentIntentTest( + fixtures.createPaymentBody, + data, + "no_three_ds", + "automatic", + globalState + ); + + if (shouldContinue) + shouldContinue = utils.should_continue_further(data); + }); + + it("List Payment Method for Customer", () => { + cy.listCustomerPMByClientSecret(globalState); + }); + + it("Confirm No 3DS MIT (Token)", () => { + const data = getConnectorDetails(globalState.get("connectorId"))[ + "card_pm" + ]["SaveCardConfirmAutoCaptureOffSession"]; + const commonData = getConnectorDetails(globalState.get("commons"))[ + "card_pm" + ]["SaveCardConfirmAutoCaptureOffSession"]; + + const newData = { + ...data, + Response: utils.getConnectorFlowDetails( + data, + commonData, + "ResponseCustom" + ), + }; + cy.saveCardConfirmCallTest( + fixtures.saveCardConfirmBody, + newData, + globalState + ); + + if (shouldContinue) + shouldContinue = utils.should_continue_further(data); + }); + } + ); + context( "Connector Agnostic Disabled for Profile 1 and Enabled for Profile 2", () => { @@ -178,22 +568,10 @@ describe("Connector Agnostic Tests", () => { const data = getConnectorDetails(globalState.get("connectorId"))[ "card_pm" ]["MITAutoCapture"]; - const commonData = getConnectorDetails(globalState.get("commons"))[ - "card_pm" - ]["MITAutoCapture"]; - - const newData = { - ...data, - Response: utils.getConnectorFlowDetails( - data, - commonData, - "ResponseCustom" - ), - }; cy.mitUsingPMId( fixtures.pmIdConfirmBody, - newData, + data, 7000, true, "automatic", @@ -226,21 +604,10 @@ describe("Connector Agnostic Tests", () => { const data = getConnectorDetails(globalState.get("connectorId"))[ "card_pm" ]["SaveCardConfirmAutoCaptureOffSession"]; - const commonData = getConnectorDetails(globalState.get("commons"))[ - "card_pm" - ]["SaveCardConfirmAutoCaptureOffSession"]; - const newData = { - ...data, - Response: utils.getConnectorFlowDetails( - data, - commonData, - "ResponseCustom" - ), - }; cy.saveCardConfirmCallTest( fixtures.saveCardConfirmBody, - newData, + data, globalState );