Skip to content

Commit 9da9c5e

Browse files
fix(router): update nick_name only if card_token.card_holder_name is non empty and populate additional card_details from payment_attempt if not present in the locker (#6308)
1 parent fe62b1f commit 9da9c5e

File tree

2 files changed

+48
-6
lines changed

2 files changed

+48
-6
lines changed

crates/router/src/core/payment_methods.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -523,6 +523,7 @@ pub async fn retrieve_payment_method_with_token(
523523
merchant_key_store: &domain::MerchantKeyStore,
524524
token_data: &storage::PaymentTokenData,
525525
payment_intent: &PaymentIntent,
526+
payment_attempt: &PaymentAttempt,
526527
card_token_data: Option<&domain::CardToken>,
527528
customer: &Option<domain::Customer>,
528529
storage_scheme: common_enums::enums::MerchantStorageScheme,
@@ -536,6 +537,7 @@ pub async fn retrieve_payment_method_with_token(
536537
state,
537538
&generic_token.token,
538539
payment_intent,
540+
payment_attempt,
539541
merchant_key_store,
540542
card_token_data,
541543
)
@@ -555,6 +557,7 @@ pub async fn retrieve_payment_method_with_token(
555557
state,
556558
&generic_token.token,
557559
payment_intent,
560+
payment_attempt,
558561
merchant_key_store,
559562
card_token_data,
560563
)

crates/router/src/core/payments/helpers.rs

Lines changed: 45 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1709,6 +1709,7 @@ pub async fn retrieve_payment_method_with_temporary_token(
17091709
state: &SessionState,
17101710
token: &str,
17111711
payment_intent: &PaymentIntent,
1712+
payment_attempt: &PaymentAttempt,
17121713
merchant_key_store: &domain::MerchantKeyStore,
17131714
card_token_data: Option<&domain::CardToken>,
17141715
) -> RouterResult<Option<(domain::PaymentMethodData, enums::PaymentMethod)>> {
@@ -1735,12 +1736,15 @@ pub async fn retrieve_payment_method_with_temporary_token(
17351736

17361737
// The card_holder_name from locker retrieved card is considered if it is a non-empty string or else card_holder_name is picked
17371738
// from payment_method_data.card_token object
1738-
let name_on_card = card_token_data.and_then(|token_data| {
1739-
is_card_updated = true;
1740-
token_data.card_holder_name.clone()
1741-
});
1739+
let name_on_card =
1740+
card_token_data.and_then(|token_data| token_data.card_holder_name.clone());
17421741

1743-
updated_card.nick_name = name_on_card;
1742+
if let Some(name) = name_on_card.clone() {
1743+
if !name.peek().is_empty() {
1744+
is_card_updated = true;
1745+
updated_card.nick_name = name_on_card;
1746+
}
1747+
}
17441748

17451749
if let Some(token_data) = card_token_data {
17461750
if let Some(cvc) = token_data.card_cvc.clone() {
@@ -1749,6 +1753,38 @@ pub async fn retrieve_payment_method_with_temporary_token(
17491753
}
17501754
}
17511755

1756+
// populate additional card details from payment_attempt.payment_method_data (additional_payment_data) if not present in the locker
1757+
if updated_card.card_issuer.is_none()
1758+
|| updated_card.card_network.is_none()
1759+
|| updated_card.card_type.is_none()
1760+
|| updated_card.card_issuing_country.is_none()
1761+
{
1762+
let additional_payment_method_data: Option<
1763+
api_models::payments::AdditionalPaymentData,
1764+
> = payment_attempt
1765+
.payment_method_data
1766+
.clone()
1767+
.and_then(|data| match data {
1768+
serde_json::Value::Null => None, // This is to handle the case when the payment_method_data is null
1769+
_ => Some(data.parse_value("AdditionalPaymentData")),
1770+
})
1771+
.transpose()
1772+
.map_err(|err| logger::error!("Failed to parse AdditionalPaymentData {err:?}"))
1773+
.ok()
1774+
.flatten();
1775+
if let Some(api_models::payments::AdditionalPaymentData::Card(card)) =
1776+
additional_payment_method_data
1777+
{
1778+
is_card_updated = true;
1779+
updated_card.card_issuer = updated_card.card_issuer.or(card.card_issuer);
1780+
updated_card.card_network = updated_card.card_network.or(card.card_network);
1781+
updated_card.card_type = updated_card.card_type.or(card.card_type);
1782+
updated_card.card_issuing_country = updated_card
1783+
.card_issuing_country
1784+
.or(card.card_issuing_country);
1785+
};
1786+
};
1787+
17521788
if is_card_updated {
17531789
let updated_pm = domain::PaymentMethodData::Card(updated_card);
17541790
vault::Vault::store_payment_method_data_in_locker(
@@ -2278,6 +2314,7 @@ pub async fn make_pm_data<'a, F: Clone, R, D>(
22782314
merchant_key_store,
22792315
hyperswitch_token,
22802316
&payment_data.payment_intent,
2317+
&payment_data.payment_attempt,
22812318
card_token_data.as_ref(),
22822319
customer,
22832320
storage_scheme,
@@ -4296,7 +4333,7 @@ pub async fn get_additional_payment_data(
42964333
api_models::payments::AdditionalPaymentData::Card(Box::new(
42974334
api_models::payments::AdditionalCardInfo {
42984335
card_issuer: card_info.card_issuer,
4299-
card_network,
4336+
card_network: card_info.card_network,
43004337
bank_code: card_info.bank_code,
43014338
card_type: card_info.card_type,
43024339
card_issuing_country: card_info.card_issuing_country,
@@ -5637,6 +5674,7 @@ pub async fn get_payment_method_details_from_payment_token(
56375674
state,
56385675
&generic_token.token,
56395676
payment_intent,
5677+
payment_attempt,
56405678
key_store,
56415679
None,
56425680
)
@@ -5648,6 +5686,7 @@ pub async fn get_payment_method_details_from_payment_token(
56485686
state,
56495687
&generic_token.token,
56505688
payment_intent,
5689+
payment_attempt,
56515690
key_store,
56525691
None,
56535692
)

0 commit comments

Comments
 (0)