feat: add support for card extended bin in payment attempt (#3312)

This commit is contained in:
Chethan Rao
2024-01-11 20:38:25 +05:30
committed by GitHub
parent 6fb3b00e82
commit cc3eefd317
3 changed files with 13 additions and 3 deletions

View File

@ -1129,6 +1129,7 @@ pub struct AdditionalCardInfo {
pub bank_code: Option<String>, pub bank_code: Option<String>,
pub last4: Option<String>, pub last4: Option<String>,
pub card_isin: Option<String>, pub card_isin: Option<String>,
pub card_extended_bin: Option<String>,
pub card_exp_month: Option<Secret<String>>, pub card_exp_month: Option<Secret<String>>,
pub card_exp_year: Option<Secret<String>>, pub card_exp_year: Option<Secret<String>>,
pub card_holder_name: Option<Secret<String>>, pub card_holder_name: Option<Secret<String>>,
@ -1665,6 +1666,7 @@ pub struct CardResponse {
pub card_issuer: Option<String>, pub card_issuer: Option<String>,
pub card_issuing_country: Option<String>, pub card_issuing_country: Option<String>,
pub card_isin: Option<String>, pub card_isin: Option<String>,
pub card_extended_bin: Option<String>,
pub card_exp_month: Option<Secret<String>>, pub card_exp_month: Option<Secret<String>>,
pub card_exp_year: Option<Secret<String>>, pub card_exp_year: Option<Secret<String>>,
pub card_holder_name: Option<Secret<String>>, pub card_holder_name: Option<Secret<String>>,
@ -1707,7 +1709,7 @@ pub enum VoucherData {
#[serde(rename_all = "snake_case")] #[serde(rename_all = "snake_case")]
pub enum PaymentMethodDataResponse { pub enum PaymentMethodDataResponse {
#[serde(rename = "card")] #[serde(rename = "card")]
Card(CardResponse), Card(Box<CardResponse>),
BankTransfer, BankTransfer,
Wallet, Wallet,
PayLater, PayLater,
@ -2037,7 +2039,7 @@ pub struct PaymentsResponse {
#[schema(example = 100)] #[schema(example = 100)]
pub amount: i64, pub amount: i64,
/// The payment net amount. net_amount = amount + surcharge_details.surcharge_amount + surcharge_details.tax_amount, /// The payment net amount. net_amount = amount + surcharge_details.surcharge_amount + surcharge_details.tax_amount,
/// If no surcharge_details, net_amount = amount /// If no surcharge_details, net_amount = amount
#[schema(example = 110)] #[schema(example = 110)]
pub net_amount: i64, pub net_amount: i64,
@ -2531,6 +2533,7 @@ impl From<AdditionalCardInfo> for CardResponse {
card_issuer: card.card_issuer, card_issuer: card.card_issuer,
card_issuing_country: card.card_issuing_country, card_issuing_country: card.card_issuing_country,
card_isin: card.card_isin, card_isin: card.card_isin,
card_extended_bin: card.card_extended_bin,
card_exp_month: card.card_exp_month, card_exp_month: card.card_exp_month,
card_exp_year: card.card_exp_year, card_exp_year: card.card_exp_year,
card_holder_name: card.card_holder_name, card_holder_name: card.card_holder_name,
@ -2541,7 +2544,7 @@ impl From<AdditionalCardInfo> for CardResponse {
impl From<AdditionalPaymentData> for PaymentMethodDataResponse { impl From<AdditionalPaymentData> for PaymentMethodDataResponse {
fn from(payment_method_data: AdditionalPaymentData) -> Self { fn from(payment_method_data: AdditionalPaymentData) -> Self {
match payment_method_data { match payment_method_data {
AdditionalPaymentData::Card(card) => Self::Card(CardResponse::from(*card)), AdditionalPaymentData::Card(card) => Self::Card(Box::new(CardResponse::from(*card))),
AdditionalPaymentData::PayLater {} => Self::PayLater, AdditionalPaymentData::PayLater {} => Self::PayLater,
AdditionalPaymentData::Wallet {} => Self::Wallet, AdditionalPaymentData::Wallet {} => Self::Wallet,
AdditionalPaymentData::BankRedirect { .. } => Self::BankRedirect, AdditionalPaymentData::BankRedirect { .. } => Self::BankRedirect,

View File

@ -42,6 +42,9 @@ impl CardNumber {
.rev() .rev()
.collect::<String>() .collect::<String>()
} }
pub fn get_card_extended_bin(self) -> String {
self.0.peek().chars().take(8).collect::<String>()
}
} }
impl FromStr for CardNumber { impl FromStr for CardNumber {

View File

@ -3290,6 +3290,7 @@ pub async fn get_additional_payment_data(
match pm_data { match pm_data {
api_models::payments::PaymentMethodData::Card(card_data) => { api_models::payments::PaymentMethodData::Card(card_data) => {
let card_isin = Some(card_data.card_number.clone().get_card_isin()); let card_isin = Some(card_data.card_number.clone().get_card_isin());
let card_extended_bin = Some(card_data.card_number.clone().get_card_extended_bin());
let last4 = Some(card_data.card_number.clone().get_last4()); let last4 = Some(card_data.card_number.clone().get_last4());
if card_data.card_issuer.is_some() if card_data.card_issuer.is_some()
&& card_data.card_network.is_some() && card_data.card_network.is_some()
@ -3309,6 +3310,7 @@ pub async fn get_additional_payment_data(
card_holder_name: card_data.card_holder_name.clone(), card_holder_name: card_data.card_holder_name.clone(),
last4: last4.clone(), last4: last4.clone(),
card_isin: card_isin.clone(), card_isin: card_isin.clone(),
card_extended_bin: card_extended_bin.clone(),
}, },
)) ))
} else { } else {
@ -3332,6 +3334,7 @@ pub async fn get_additional_payment_data(
card_issuing_country: card_info.card_issuing_country, card_issuing_country: card_info.card_issuing_country,
last4: last4.clone(), last4: last4.clone(),
card_isin: card_isin.clone(), card_isin: card_isin.clone(),
card_extended_bin: card_extended_bin.clone(),
card_exp_month: Some(card_data.card_exp_month.clone()), card_exp_month: Some(card_data.card_exp_month.clone()),
card_exp_year: Some(card_data.card_exp_year.clone()), card_exp_year: Some(card_data.card_exp_year.clone()),
card_holder_name: card_data.card_holder_name.clone(), card_holder_name: card_data.card_holder_name.clone(),
@ -3347,6 +3350,7 @@ pub async fn get_additional_payment_data(
card_issuing_country: None, card_issuing_country: None,
last4, last4,
card_isin, card_isin,
card_extended_bin,
card_exp_month: Some(card_data.card_exp_month.clone()), card_exp_month: Some(card_data.card_exp_month.clone()),
card_exp_year: Some(card_data.card_exp_year.clone()), card_exp_year: Some(card_data.card_exp_year.clone()),
card_holder_name: card_data.card_holder_name.clone(), card_holder_name: card_data.card_holder_name.clone(),