mirror of
https://github.com/juspay/hyperswitch.git
synced 2026-03-13 09:02:06 +08:00
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:
@@ -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?;
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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>(
|
||||
|
||||
@@ -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();
|
||||
|
||||
Reference in New Issue
Block a user