@@ -1709,6 +1709,7 @@ pub async fn retrieve_payment_method_with_temporary_token(
1709
1709
state : & SessionState ,
1710
1710
token : & str ,
1711
1711
payment_intent : & PaymentIntent ,
1712
+ payment_attempt : & PaymentAttempt ,
1712
1713
merchant_key_store : & domain:: MerchantKeyStore ,
1713
1714
card_token_data : Option < & domain:: CardToken > ,
1714
1715
) -> RouterResult < Option < ( domain:: PaymentMethodData , enums:: PaymentMethod ) > > {
@@ -1735,12 +1736,15 @@ pub async fn retrieve_payment_method_with_temporary_token(
1735
1736
1736
1737
// The card_holder_name from locker retrieved card is considered if it is a non-empty string or else card_holder_name is picked
1737
1738
// 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 ( ) ) ;
1742
1741
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
+ }
1744
1748
1745
1749
if let Some ( token_data) = card_token_data {
1746
1750
if let Some ( cvc) = token_data. card_cvc . clone ( ) {
@@ -1749,6 +1753,38 @@ pub async fn retrieve_payment_method_with_temporary_token(
1749
1753
}
1750
1754
}
1751
1755
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
+
1752
1788
if is_card_updated {
1753
1789
let updated_pm = domain:: PaymentMethodData :: Card ( updated_card) ;
1754
1790
vault:: Vault :: store_payment_method_data_in_locker (
@@ -2278,6 +2314,7 @@ pub async fn make_pm_data<'a, F: Clone, R, D>(
2278
2314
merchant_key_store,
2279
2315
hyperswitch_token,
2280
2316
& payment_data. payment_intent ,
2317
+ & payment_data. payment_attempt ,
2281
2318
card_token_data. as_ref ( ) ,
2282
2319
customer,
2283
2320
storage_scheme,
@@ -4296,7 +4333,7 @@ pub async fn get_additional_payment_data(
4296
4333
api_models:: payments:: AdditionalPaymentData :: Card ( Box :: new (
4297
4334
api_models:: payments:: AdditionalCardInfo {
4298
4335
card_issuer : card_info. card_issuer ,
4299
- card_network,
4336
+ card_network : card_info . card_network ,
4300
4337
bank_code : card_info. bank_code ,
4301
4338
card_type : card_info. card_type ,
4302
4339
card_issuing_country : card_info. card_issuing_country ,
@@ -5637,6 +5674,7 @@ pub async fn get_payment_method_details_from_payment_token(
5637
5674
state,
5638
5675
& generic_token. token ,
5639
5676
payment_intent,
5677
+ payment_attempt,
5640
5678
key_store,
5641
5679
None ,
5642
5680
)
@@ -5648,6 +5686,7 @@ pub async fn get_payment_method_details_from_payment_token(
5648
5686
state,
5649
5687
& generic_token. token ,
5650
5688
payment_intent,
5689
+ payment_attempt,
5651
5690
key_store,
5652
5691
None ,
5653
5692
)
0 commit comments