Skip to content

Commit f624eb5

Browse files
feat(core): [Stripe] add bank debits payment method to stripe (#906)
1 parent c1a25b3 commit f624eb5

File tree

8 files changed

+345
-43
lines changed

8 files changed

+345
-43
lines changed

crates/api_models/src/enums.rs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -409,11 +409,14 @@ pub enum PaymentExperience {
409409
#[serde(rename_all = "snake_case")]
410410
#[strum(serialize_all = "snake_case")]
411411
pub enum PaymentMethodType {
412+
Ach,
412413
Affirm,
413414
AfterpayClearpay,
414415
AliPay,
415416
ApplePay,
417+
Bacs,
416418
BancontactCard,
419+
Becs,
417420
Blik,
418421
Credit,
419422
CryptoCurrency,
@@ -432,6 +435,7 @@ pub enum PaymentMethodType {
432435
PayBright,
433436
Paypal,
434437
Przelewy24,
438+
Sepa,
435439
Sofort,
436440
Swish,
437441
Trustly,
@@ -463,6 +467,7 @@ pub enum PaymentMethod {
463467
Wallet,
464468
BankRedirect,
465469
Crypto,
470+
BankDebit,
466471
}
467472

468473
#[derive(

crates/api_models/src/payments.rs

Lines changed: 62 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -462,13 +462,57 @@ pub enum PayLaterData {
462462
Walley {},
463463
}
464464

465-
#[derive(Debug, Clone, Eq, PartialEq, serde::Deserialize, serde::Serialize, ToSchema)]
465+
#[derive(serde::Deserialize, serde::Serialize, Debug, Clone, ToSchema, Eq, PartialEq)]
466+
#[serde(rename_all = "snake_case")]
467+
pub enum BankDebitData {
468+
/// Payment Method data for Ach bank debit
469+
AchBankDebit {
470+
/// Billing details for bank debit
471+
billing_details: BankDebitBilling,
472+
/// Account number for ach bank debit payment
473+
#[schema(value_type = String, example = "000123456789")]
474+
account_number: Secret<String>,
475+
/// Routing number for ach bank debit payment
476+
#[schema(value_type = String, example = "110000000")]
477+
routing_number: Secret<String>,
478+
},
479+
SepaBankDebit {
480+
/// Billing details for bank debit
481+
billing_details: BankDebitBilling,
482+
/// International bank account number (iban) for SEPA
483+
#[schema(value_type = String, example = "DE89370400440532013000")]
484+
iban: Secret<String>,
485+
},
486+
BecsBankDebit {
487+
/// Billing details for bank debit
488+
billing_details: BankDebitBilling,
489+
/// Account number for Becs payment method
490+
#[schema(value_type = String, example = "000123456")]
491+
account_number: Secret<String>,
492+
/// Bank-State-Branch (bsb) number
493+
#[schema(value_type = String, example = "000000")]
494+
bsb_number: Secret<String>,
495+
},
496+
BacsBankDebit {
497+
/// Billing details for bank debit
498+
billing_details: BankDebitBilling,
499+
/// Account number for Bacs payment method
500+
#[schema(value_type = String, example = "00012345")]
501+
account_number: Secret<String>,
502+
/// Sort code for Bacs payment method
503+
#[schema(value_type = String, example = "108800")]
504+
sort_code: Secret<String>,
505+
},
506+
}
507+
508+
#[derive(Debug, Clone, serde::Deserialize, serde::Serialize, ToSchema)]
466509
#[serde(rename_all = "snake_case")]
467510
pub enum PaymentMethodData {
468511
Card(Card),
469512
Wallet(WalletData),
470513
PayLater(PayLaterData),
471514
BankRedirect(BankRedirectData),
515+
BankDebit(BankDebitData),
472516
Crypto(CryptoData),
473517
}
474518

@@ -485,6 +529,7 @@ pub enum AdditionalPaymentData {
485529
Wallet {},
486530
PayLater {},
487531
Crypto {},
532+
BankDebit {},
488533
}
489534

490535
impl From<&PaymentMethodData> for AdditionalPaymentData {
@@ -509,6 +554,7 @@ impl From<&PaymentMethodData> for AdditionalPaymentData {
509554
PaymentMethodData::Wallet(_) => Self::Wallet {},
510555
PaymentMethodData::PayLater(_) => Self::PayLater {},
511556
PaymentMethodData::Crypto(_) => Self::Crypto {},
557+
PaymentMethodData::BankDebit(_) => Self::BankDebit {},
512558
}
513559
}
514560
}
@@ -607,6 +653,18 @@ pub struct BankRedirectBilling {
607653
pub billing_name: Secret<String>,
608654
}
609655

656+
#[derive(serde::Deserialize, serde::Serialize, Debug, Clone, ToSchema, Eq, PartialEq)]
657+
pub struct BankDebitBilling {
658+
/// The billing name for bank debits
659+
#[schema(value_type = String, example = "John Doe")]
660+
pub name: Secret<String>,
661+
/// The billing email for bank debits
662+
#[schema(value_type = String, example = "[email protected]")]
663+
pub email: Secret<String, pii::Email>,
664+
/// The billing address for bank debits
665+
pub address: Option<AddressDetails>,
666+
}
667+
610668
#[derive(Eq, PartialEq, Clone, Debug, serde::Deserialize, serde::Serialize, ToSchema)]
611669
#[serde(rename_all = "snake_case")]
612670
pub enum WalletData {
@@ -722,6 +780,7 @@ pub enum PaymentMethodDataResponse {
722780
Paypal,
723781
BankRedirect(BankRedirectData),
724782
Crypto(CryptoData),
783+
BankDebit(BankDebitData),
725784
}
726785

727786
#[derive(Debug, Clone, PartialEq, Eq, serde::Serialize, serde::Deserialize, ToSchema)]
@@ -1137,7 +1196,7 @@ pub struct PaymentListResponse {
11371196
pub data: Vec<PaymentsResponse>,
11381197
}
11391198

1140-
#[derive(Setter, Clone, Default, Debug, Eq, PartialEq, serde::Serialize)]
1199+
#[derive(Setter, Clone, Default, Debug, serde::Serialize)]
11411200
pub struct VerifyResponse {
11421201
pub verify_id: Option<String>,
11431202
pub merchant_id: Option<String>,
@@ -1262,6 +1321,7 @@ impl From<PaymentMethodData> for PaymentMethodDataResponse {
12621321
Self::BankRedirect(bank_redirect_data)
12631322
}
12641323
PaymentMethodData::Crypto(crpto_data) => Self::Crypto(crpto_data),
1324+
PaymentMethodData::BankDebit(bank_debit_data) => Self::BankDebit(bank_debit_data),
12651325
}
12661326
}
12671327
}

crates/router/src/connector/aci/transformers.rs

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -111,11 +111,14 @@ impl TryFrom<&types::PaymentsAuthorizeRouterData> for AciPaymentsRequest {
111111
api::PaymentMethodData::PayLater(_) => PaymentDetails::Klarna,
112112
api::PaymentMethodData::Wallet(_) => PaymentDetails::Wallet,
113113
api::PaymentMethodData::BankRedirect(_) => PaymentDetails::BankRedirect,
114-
api::PaymentMethodData::Crypto(_) => Err(errors::ConnectorError::NotSupported {
115-
payment_method: format!("{:?}", item.payment_method),
116-
connector: "Aci",
117-
payment_experience: api_models::enums::PaymentExperience::RedirectToUrl.to_string(),
118-
})?,
114+
api::PaymentMethodData::Crypto(_) | api::PaymentMethodData::BankDebit(_) => {
115+
Err(errors::ConnectorError::NotSupported {
116+
payment_method: format!("{:?}", item.payment_method),
117+
connector: "Aci",
118+
payment_experience: api_models::enums::PaymentExperience::RedirectToUrl
119+
.to_string(),
120+
})?
121+
}
119122
};
120123

121124
let auth = AciAuthType::try_from(&item.connector_auth_type)?;

crates/router/src/connector/authorizedotnet/transformers.rs

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -87,11 +87,14 @@ impl TryFrom<api_models::payments::PaymentMethodData> for PaymentDetails {
8787
api::PaymentMethodData::PayLater(_) => Ok(Self::Klarna),
8888
api::PaymentMethodData::Wallet(_) => Ok(Self::Wallet),
8989
api::PaymentMethodData::BankRedirect(_) => Ok(Self::BankRedirect),
90-
api::PaymentMethodData::Crypto(_) => Err(errors::ConnectorError::NotSupported {
91-
payment_method: format!("{value:?}"),
92-
connector: "AuthorizeDotNet",
93-
payment_experience: api_models::enums::PaymentExperience::RedirectToUrl.to_string(),
94-
})?,
90+
api::PaymentMethodData::Crypto(_) | api::PaymentMethodData::BankDebit(_) => {
91+
Err(errors::ConnectorError::NotSupported {
92+
payment_method: format!("{value:?}"),
93+
connector: "AuthorizeDotNet",
94+
payment_experience: api_models::enums::PaymentExperience::RedirectToUrl
95+
.to_string(),
96+
})?
97+
}
9598
}
9699
}
97100
}

0 commit comments

Comments
 (0)