fix(payment-methods): Add vault access token call in external vault retrieve flow (#11488)

Co-authored-by: hyperswitch-bot[bot] <148525504+hyperswitch-bot[bot]@users.noreply.github.com>
This commit is contained in:
Prasunna Soppa
2026-03-12 18:08:45 +05:30
committed by GitHub
parent 8ad2cf459a
commit 78e40c7dd1
4 changed files with 39 additions and 30 deletions

View File

@@ -3251,7 +3251,7 @@ pub async fn vault_payment_method_external(
access_token::create_access_token(
state,
&connector_data,
merchant_account,
merchant_account.get_id(),
&mut old_router_data,
)
.await?;
@@ -3402,7 +3402,7 @@ pub async fn vault_payment_method_external_v1(
access_token::create_access_token(
state,
&connector_data,
merchant_account,
merchant_account.get_id(),
&mut old_router_data,
)
.await?;

View File

@@ -1,4 +1,4 @@
use common_utils::ext_traits::AsyncExt;
use common_utils::{ext_traits::AsyncExt, id_type};
use error_stack::ResultExt;
use hyperswitch_domain_models::types::VaultRouterData;
use hyperswitch_interfaces::consts;
@@ -13,18 +13,17 @@ use crate::{
types::{
self,
api::{self as api_types, ConnectorCommon},
domain,
},
};
pub async fn create_access_token<F: Clone + 'static>(
state: &SessionState,
connector_data: &api_types::ConnectorData,
merchant_account: &domain::MerchantAccount,
merchant_id: &id_type::MerchantId,
router_data: &mut VaultRouterData<F>,
) -> RouterResult<()> {
let connector_access_token =
add_access_token_for_external_vault(state, connector_data, merchant_account, router_data)
add_access_token_for_external_vault(state, connector_data, merchant_id, router_data)
.await?;
if connector_access_token.connector_supports_access_token {
@@ -44,14 +43,13 @@ pub async fn create_access_token<F: Clone + 'static>(
pub async fn add_access_token_for_external_vault<F: Clone + 'static>(
state: &SessionState,
connector: &api_types::ConnectorData,
merchant_account: &domain::MerchantAccount,
merchant_id: &id_type::MerchantId,
router_data: &VaultRouterData<F>,
) -> RouterResult<types::AddAccessTokenResult> {
if connector
.connector_name
.supports_access_token_for_external_vault()
{
let merchant_id = merchant_account.get_id();
let store = &*state.store;
let key = common_utils::access_token::get_default_access_token_key(
merchant_id,

View File

@@ -26,7 +26,7 @@ use crate::{
consts,
core::{
errors::{self, ConnectorErrorExt, CustomResult, RouterResult},
payment_methods::transformers as pm_transforms,
payment_methods::{access_token, transformers as pm_transforms},
payments, utils as core_utils,
},
db, headers, logger,
@@ -2328,7 +2328,7 @@ pub async fn retrieve_payment_method_from_vault_external_v1(
)
.await?;
let old_router_data = VaultConnectorFlowData::to_old_router_data(router_data)
let mut old_router_data = VaultConnectorFlowData::to_old_router_data(router_data)
.change_context(errors::ApiErrorResponse::InternalServerError)
.attach_printable(
"Cannot construct router data for making the external vault retrieve api call",
@@ -2345,24 +2345,35 @@ pub async fn retrieve_payment_method_from_vault_external_v1(
.change_context(errors::ApiErrorResponse::InternalServerError)
.attach_printable("Failed to get the connector data")?;
let connector_integration: services::BoxedVaultConnectorIntegrationInterface<
hyperswitch_domain_models::router_flow_types::ExternalVaultRetrieveFlow,
types::VaultRequestData,
types::VaultResponseData,
> = connector_data.connector.get_connector_integration();
access_token::create_access_token(state, &connector_data, merchant_id, &mut old_router_data)
.await?;
let router_data_resp = services::execute_connector_processing_step(
state,
connector_integration,
&old_router_data,
payments::CallConnectorAction::Trigger,
None,
None,
)
.await
.to_vault_failed_response()?;
if old_router_data.response.is_ok() {
let connector_integration: services::BoxedVaultConnectorIntegrationInterface<
hyperswitch_domain_models::router_flow_types::ExternalVaultRetrieveFlow,
types::VaultRequestData,
types::VaultResponseData,
> = connector_data.connector.get_connector_integration();
get_vault_response_for_retrieve_payment_method_data_v1(router_data_resp)
let router_data_resp = services::execute_connector_processing_step(
state,
connector_integration,
&old_router_data,
payments::CallConnectorAction::Trigger,
None,
None,
)
.await
.to_vault_failed_response()?;
get_vault_response_for_retrieve_payment_method_data_v1(router_data_resp)
} else {
logger::error!(
"Error vaulting payment method: {:?}",
old_router_data.response
);
Err(report!(errors::ApiErrorResponse::InternalServerError)
.attach_printable("Failed to create access token for external vault"))
}
}
pub fn get_vault_response_for_retrieve_payment_method_data_v1<F>(

View File

@@ -2814,7 +2814,7 @@ pub async fn fetch_card_details_from_locker(
domain::PaymentMethodVaultSourceDetails::ExternalVault {
ref external_vault_source,
} => {
fetch_card_details_from_external_vault(
Box::pin(fetch_card_details_from_external_vault(
state,
platform.get_processor().get_account().get_id(),
card_token_data,
@@ -2822,7 +2822,7 @@ pub async fn fetch_card_details_from_locker(
payment_method_info,
platform.get_processor().get_key_store(),
external_vault_source,
)
))
.await
}
domain::PaymentMethodVaultSourceDetails::InternalVault => {
@@ -2920,12 +2920,12 @@ pub async fn fetch_card_details_from_external_vault(
id: external_vault_mca_id.get_string_repr().to_string(),
})?;
let vault_resp = vault::retrieve_payment_method_from_vault_external_v1(
let vault_resp = Box::pin(vault::retrieve_payment_method_from_vault_external_v1(
state,
merchant_id,
&payment_method_info,
merchant_connector_account_details,
)
))
.await?;
let payment_methods_data = payment_method_info.get_payment_methods_data();