fix(payment_methods): support last used for off session token payments (#5039)

This commit is contained in:
Amisha Prabhat
2024-06-20 19:13:57 +05:30
committed by GitHub
parent 19a605e7c1
commit d98293ae9a
3 changed files with 21 additions and 10 deletions

View File

@ -4058,21 +4058,17 @@ pub async fn set_default_payment_method(
}
pub async fn update_last_used_at(
pm_id: &str,
payment_method: &diesel_models::PaymentMethod,
state: &routes::SessionState,
storage_scheme: MerchantStorageScheme,
) -> errors::RouterResult<()> {
let update_last_used = storage::PaymentMethodUpdate::LastUsedUpdate {
last_used_at: common_utils::date_time::now(),
};
let payment_method = state
.store
.find_payment_method(pm_id, storage_scheme)
.await
.to_not_found_response(errors::ApiErrorResponse::PaymentMethodNotFound)?;
state
.store
.update_payment_method(payment_method, update_last_used, storage_scheme)
.update_payment_method(payment_method.clone(), update_last_used, storage_scheme)
.await
.change_context(errors::ApiErrorResponse::InternalServerError)
.attach_printable("Failed to update the last_used_at in db")?;

View File

@ -1769,11 +1769,11 @@ pub async fn retrieve_payment_method_with_temporary_token(
pub async fn retrieve_card_with_permanent_token(
state: &SessionState,
locker_id: &str,
payment_method_id: &str,
_payment_method_id: &str,
payment_intent: &PaymentIntent,
card_token_data: Option<&CardToken>,
_merchant_key_store: &domain::MerchantKeyStore,
storage_scheme: enums::MerchantStorageScheme,
_storage_scheme: enums::MerchantStorageScheme,
) -> RouterResult<api::PaymentMethodData> {
let customer_id = payment_intent
.customer_id
@ -1827,7 +1827,7 @@ pub async fn retrieve_card_with_permanent_token(
card_issuing_country: None,
bank_code: None,
};
cards::update_last_used_at(payment_method_id, state, storage_scheme).await?;
Ok(api::PaymentMethodData::Card(api_card))
}

View File

@ -115,6 +115,21 @@ impl<F: Send + Clone> PostUpdateTracker<F, PaymentData<F>, types::PaymentsAuthor
.and_then(|billing_details| billing_details.address.as_ref())
.and_then(|address| address.get_optional_full_name());
if let Some(payment_method_info) = &payment_data.payment_method_info {
if payment_data.payment_intent.off_session.is_none() && resp.response.is_ok() {
payment_methods::cards::update_last_used_at(
payment_method_info,
state,
merchant_account.storage_scheme,
)
.await
.map_err(|e| {
logger::error!("Failed to update last used at: {:?}", e);
})
.ok();
}
};
let save_payment_call_future = Box::pin(tokenization::save_payment_method(
state,
connector_name.clone(),