Skip to content

Commit 5c4de8a

Browse files
authored
fix(payment_methods): card_network and card_scheme should be consistent (#6849)
1 parent 107098c commit 5c4de8a

File tree

3 files changed

+28
-2
lines changed

3 files changed

+28
-2
lines changed

crates/diesel_models/src/payment_method.rs

+17-1
Original file line numberDiff line numberDiff line change
@@ -219,6 +219,7 @@ pub enum PaymentMethodUpdate {
219219
},
220220
UpdatePaymentMethodDataAndLastUsed {
221221
payment_method_data: Option<Encryption>,
222+
scheme: Option<String>,
222223
last_used_at: PrimitiveDateTime,
223224
},
224225
PaymentMethodDataUpdate {
@@ -264,6 +265,7 @@ pub enum PaymentMethodUpdate {
264265
pub enum PaymentMethodUpdate {
265266
UpdatePaymentMethodDataAndLastUsed {
266267
payment_method_data: Option<Encryption>,
268+
scheme: Option<String>,
267269
last_used_at: PrimitiveDateTime,
268270
},
269271
PaymentMethodDataUpdate {
@@ -395,6 +397,7 @@ pub struct PaymentMethodUpdateInternal {
395397
last_modified: PrimitiveDateTime,
396398
network_token_locker_id: Option<String>,
397399
network_token_payment_method_data: Option<Encryption>,
400+
scheme: Option<String>,
398401
}
399402

400403
#[cfg(all(
@@ -419,14 +422,15 @@ impl PaymentMethodUpdateInternal {
419422
last_modified,
420423
network_token_locker_id,
421424
network_token_payment_method_data,
425+
scheme,
422426
} = self;
423427

424428
PaymentMethod {
425429
customer_id: source.customer_id,
426430
merchant_id: source.merchant_id,
427431
payment_method_id: source.payment_method_id,
428432
accepted_currency: source.accepted_currency,
429-
scheme: source.scheme,
433+
scheme: scheme.or(source.scheme),
430434
token: source.token,
431435
cardholder_name: source.cardholder_name,
432436
issuer_name: source.issuer_name,
@@ -489,6 +493,7 @@ impl From<PaymentMethodUpdate> for PaymentMethodUpdateInternal {
489493
last_modified: common_utils::date_time::now(),
490494
network_token_locker_id: None,
491495
network_token_payment_method_data: None,
496+
scheme: None,
492497
},
493498
PaymentMethodUpdate::PaymentMethodDataUpdate {
494499
payment_method_data,
@@ -508,6 +513,7 @@ impl From<PaymentMethodUpdate> for PaymentMethodUpdateInternal {
508513
last_modified: common_utils::date_time::now(),
509514
network_token_locker_id: None,
510515
network_token_payment_method_data: None,
516+
scheme: None,
511517
},
512518
PaymentMethodUpdate::LastUsedUpdate { last_used_at } => Self {
513519
metadata: None,
@@ -525,9 +531,11 @@ impl From<PaymentMethodUpdate> for PaymentMethodUpdateInternal {
525531
last_modified: common_utils::date_time::now(),
526532
network_token_locker_id: None,
527533
network_token_payment_method_data: None,
534+
scheme: None,
528535
},
529536
PaymentMethodUpdate::UpdatePaymentMethodDataAndLastUsed {
530537
payment_method_data,
538+
scheme,
531539
last_used_at,
532540
} => Self {
533541
metadata: None,
@@ -545,6 +553,7 @@ impl From<PaymentMethodUpdate> for PaymentMethodUpdateInternal {
545553
last_modified: common_utils::date_time::now(),
546554
network_token_locker_id: None,
547555
network_token_payment_method_data: None,
556+
scheme,
548557
},
549558
PaymentMethodUpdate::NetworkTransactionIdAndStatusUpdate {
550559
network_transaction_id,
@@ -565,6 +574,7 @@ impl From<PaymentMethodUpdate> for PaymentMethodUpdateInternal {
565574
last_modified: common_utils::date_time::now(),
566575
network_token_locker_id: None,
567576
network_token_payment_method_data: None,
577+
scheme: None,
568578
},
569579
PaymentMethodUpdate::StatusUpdate { status } => Self {
570580
metadata: None,
@@ -582,6 +592,7 @@ impl From<PaymentMethodUpdate> for PaymentMethodUpdateInternal {
582592
last_modified: common_utils::date_time::now(),
583593
network_token_locker_id: None,
584594
network_token_payment_method_data: None,
595+
scheme: None,
585596
},
586597
PaymentMethodUpdate::AdditionalDataUpdate {
587598
payment_method_data,
@@ -609,6 +620,7 @@ impl From<PaymentMethodUpdate> for PaymentMethodUpdateInternal {
609620
last_modified: common_utils::date_time::now(),
610621
network_token_locker_id,
611622
network_token_payment_method_data,
623+
scheme: None,
612624
},
613625
PaymentMethodUpdate::ConnectorMandateDetailsUpdate {
614626
connector_mandate_details,
@@ -628,6 +640,7 @@ impl From<PaymentMethodUpdate> for PaymentMethodUpdateInternal {
628640
last_modified: common_utils::date_time::now(),
629641
network_token_locker_id: None,
630642
network_token_payment_method_data: None,
643+
scheme: None,
631644
},
632645
PaymentMethodUpdate::NetworkTokenDataUpdate {
633646
network_token_requestor_reference_id,
@@ -649,6 +662,7 @@ impl From<PaymentMethodUpdate> for PaymentMethodUpdateInternal {
649662
network_token_requestor_reference_id,
650663
network_token_locker_id,
651664
network_token_payment_method_data,
665+
scheme: None,
652666
},
653667
PaymentMethodUpdate::ConnectorNetworkTransactionIdAndMandateDetailsUpdate {
654668
connector_mandate_details,
@@ -670,6 +684,7 @@ impl From<PaymentMethodUpdate> for PaymentMethodUpdateInternal {
670684
network_token_requestor_reference_id: None,
671685
network_token_locker_id: None,
672686
network_token_payment_method_data: None,
687+
scheme: None,
673688
},
674689
}
675690
}
@@ -714,6 +729,7 @@ impl From<PaymentMethodUpdate> for PaymentMethodUpdateInternal {
714729
PaymentMethodUpdate::UpdatePaymentMethodDataAndLastUsed {
715730
payment_method_data,
716731
last_used_at,
732+
..
717733
} => Self {
718734
payment_method_data,
719735
last_used_at: Some(last_used_at),

crates/router/src/core/payment_methods/cards.rs

+2
Original file line numberDiff line numberDiff line change
@@ -2800,9 +2800,11 @@ pub async fn update_payment_method_and_last_used(
28002800
pm: domain::PaymentMethod,
28012801
payment_method_update: Option<Encryption>,
28022802
storage_scheme: MerchantStorageScheme,
2803+
card_scheme: Option<String>,
28032804
) -> errors::CustomResult<(), errors::VaultError> {
28042805
let pm_update = payment_method::PaymentMethodUpdate::UpdatePaymentMethodDataAndLastUsed {
28052806
payment_method_data: payment_method_update,
2807+
scheme: card_scheme,
28062808
last_used_at: common_utils::date_time::now(),
28072809
};
28082810
db.update_payment_method(&(state.into()), key_store, pm, pm_update, storage_scheme)

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

+9-1
Original file line numberDiff line numberDiff line change
@@ -549,8 +549,15 @@ where
549549
let existing_pm_data = payment_methods::cards::get_card_details_without_locker_fallback(&existing_pm,state)
550550
.await?;
551551

552+
// scheme should be updated in case of co-badged cards
553+
let card_scheme = card
554+
.card_network
555+
.clone()
556+
.map(|card_network| card_network.to_string())
557+
.or(existing_pm_data.scheme.clone());
558+
552559
let updated_card = Some(CardDetailFromLocker {
553-
scheme: existing_pm.scheme.clone(),
560+
scheme: card_scheme.clone(),
554561
last4_digits: Some(card.card_number.get_last4()),
555562
issuer_country: card
556563
.card_issuing_country
@@ -596,6 +603,7 @@ where
596603
existing_pm,
597604
pm_data_encrypted.map(Into::into),
598605
merchant_account.storage_scheme,
606+
card_scheme,
599607
)
600608
.await
601609
.change_context(errors::ApiErrorResponse::InternalServerError)

0 commit comments

Comments
 (0)