Skip to content

Commit 1f38e18

Browse files
committed
feat: add support for card extended bin in payment attempt
1 parent 612f8d9 commit 1f38e18

File tree

3 files changed

+13
-3
lines changed

3 files changed

+13
-3
lines changed

crates/api_models/src/payments.rs

+6-3
Original file line numberDiff line numberDiff line change
@@ -1129,6 +1129,7 @@ pub struct AdditionalCardInfo {
11291129
pub bank_code: Option<String>,
11301130
pub last4: Option<String>,
11311131
pub card_isin: Option<String>,
1132+
pub card_extended_bin: Option<String>,
11321133
pub card_exp_month: Option<Secret<String>>,
11331134
pub card_exp_year: Option<Secret<String>>,
11341135
pub card_holder_name: Option<Secret<String>>,
@@ -1665,6 +1666,7 @@ pub struct CardResponse {
16651666
pub card_issuer: Option<String>,
16661667
pub card_issuing_country: Option<String>,
16671668
pub card_isin: Option<String>,
1669+
pub card_extended_bin: Option<String>,
16681670
pub card_exp_month: Option<Secret<String>>,
16691671
pub card_exp_year: Option<Secret<String>>,
16701672
pub card_holder_name: Option<Secret<String>>,
@@ -1707,7 +1709,7 @@ pub enum VoucherData {
17071709
#[serde(rename_all = "snake_case")]
17081710
pub enum PaymentMethodDataResponse {
17091711
#[serde(rename = "card")]
1710-
Card(CardResponse),
1712+
Card(Box<CardResponse>),
17111713
BankTransfer,
17121714
Wallet,
17131715
PayLater,
@@ -2037,7 +2039,7 @@ pub struct PaymentsResponse {
20372039
#[schema(example = 100)]
20382040
pub amount: i64,
20392041

2040-
/// The payment net amount. net_amount = amount + surcharge_details.surcharge_amount + surcharge_details.tax_amount,
2042+
/// The payment net amount. net_amount = amount + surcharge_details.surcharge_amount + surcharge_details.tax_amount,
20412043
/// If no surcharge_details, net_amount = amount
20422044
#[schema(example = 110)]
20432045
pub net_amount: i64,
@@ -2528,6 +2530,7 @@ impl From<AdditionalCardInfo> for CardResponse {
25282530
card_issuer: card.card_issuer,
25292531
card_issuing_country: card.card_issuing_country,
25302532
card_isin: card.card_isin,
2533+
card_extended_bin: card.card_extended_bin,
25312534
card_exp_month: card.card_exp_month,
25322535
card_exp_year: card.card_exp_year,
25332536
card_holder_name: card.card_holder_name,
@@ -2538,7 +2541,7 @@ impl From<AdditionalCardInfo> for CardResponse {
25382541
impl From<AdditionalPaymentData> for PaymentMethodDataResponse {
25392542
fn from(payment_method_data: AdditionalPaymentData) -> Self {
25402543
match payment_method_data {
2541-
AdditionalPaymentData::Card(card) => Self::Card(CardResponse::from(*card)),
2544+
AdditionalPaymentData::Card(card) => Self::Card(Box::new(CardResponse::from(*card))),
25422545
AdditionalPaymentData::PayLater {} => Self::PayLater,
25432546
AdditionalPaymentData::Wallet {} => Self::Wallet,
25442547
AdditionalPaymentData::BankRedirect { .. } => Self::BankRedirect,

crates/cards/src/validate.rs

+3
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,9 @@ impl CardNumber {
3535
.rev()
3636
.collect::<String>()
3737
}
38+
pub fn get_card_extended_bin(self) -> String {
39+
self.0.peek().chars().take(8).collect::<String>()
40+
}
3841
}
3942

4043
impl FromStr for CardNumber {

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

+4
Original file line numberDiff line numberDiff line change
@@ -3287,6 +3287,7 @@ pub async fn get_additional_payment_data(
32873287
match pm_data {
32883288
api_models::payments::PaymentMethodData::Card(card_data) => {
32893289
let card_isin = Some(card_data.card_number.clone().get_card_isin());
3290+
let card_extended_bin = Some(card_data.card_number.clone().get_card_extended_bin());
32903291
let last4 = Some(card_data.card_number.clone().get_last4());
32913292
if card_data.card_issuer.is_some()
32923293
&& card_data.card_network.is_some()
@@ -3306,6 +3307,7 @@ pub async fn get_additional_payment_data(
33063307
card_holder_name: card_data.card_holder_name.clone(),
33073308
last4: last4.clone(),
33083309
card_isin: card_isin.clone(),
3310+
card_extended_bin: card_extended_bin.clone(),
33093311
},
33103312
))
33113313
} else {
@@ -3329,6 +3331,7 @@ pub async fn get_additional_payment_data(
33293331
card_issuing_country: card_info.card_issuing_country,
33303332
last4: last4.clone(),
33313333
card_isin: card_isin.clone(),
3334+
card_extended_bin: card_extended_bin.clone(),
33323335
card_exp_month: Some(card_data.card_exp_month.clone()),
33333336
card_exp_year: Some(card_data.card_exp_year.clone()),
33343337
card_holder_name: card_data.card_holder_name.clone(),
@@ -3344,6 +3347,7 @@ pub async fn get_additional_payment_data(
33443347
card_issuing_country: None,
33453348
last4,
33463349
card_isin,
3350+
card_extended_bin,
33473351
card_exp_month: Some(card_data.card_exp_month.clone()),
33483352
card_exp_year: Some(card_data.card_exp_year.clone()),
33493353
card_holder_name: card_data.card_holder_name.clone(),

0 commit comments

Comments
 (0)