Skip to content

Commit 1904ffa

Browse files
authored
Feat(connector): [BRAINTREE] Implement Card Mandates (#5204)
1 parent 00f9ed4 commit 1904ffa

File tree

13 files changed

+246
-49
lines changed

13 files changed

+246
-49
lines changed

config/deployments/integration_test.toml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -135,8 +135,8 @@ connectors_with_delayed_session_response = "trustpay,payme" # List of connec
135135
bank_debit.ach.connector_list = "gocardless" # Mandate supported payment method type and connector for bank_debit
136136
bank_debit.becs.connector_list = "gocardless" # Mandate supported payment method type and connector for bank_debit
137137
bank_debit.sepa.connector_list = "gocardless" # Mandate supported payment method type and connector for bank_debit
138-
card.credit.connector_list = "stripe,adyen,authorizedotnet,cybersource,globalpay,worldpay,multisafepay,nmi,nexinets,noon,bankofamerica" # Mandate supported payment method type and connector for card
139-
card.debit.connector_list = "stripe,adyen,authorizedotnet,cybersource,globalpay,worldpay,multisafepay,nmi,nexinets,noon,bankofamerica" # Mandate supported payment method type and connector for card
138+
card.credit.connector_list = "stripe,adyen,authorizedotnet,cybersource,globalpay,worldpay,multisafepay,nmi,nexinets,noon,bankofamerica,braintree" # Mandate supported payment method type and connector for card
139+
card.debit.connector_list = "stripe,adyen,authorizedotnet,cybersource,globalpay,worldpay,multisafepay,nmi,nexinets,noon,bankofamerica,braintree" # Mandate supported payment method type and connector for card
140140
pay_later.klarna.connector_list = "adyen" # Mandate supported payment method type and connector for pay_later
141141
wallet.apple_pay.connector_list = "stripe,adyen,cybersource,noon,bankofamerica" # Mandate supported payment method type and connector for wallets
142142
wallet.google_pay.connector_list = "stripe,adyen,cybersource,bankofamerica" # Mandate supported payment method type and connector for wallets

config/deployments/production.toml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -135,8 +135,8 @@ enabled = false
135135
bank_debit.ach.connector_list = "gocardless" # Mandate supported payment method type and connector for bank_debit
136136
bank_debit.becs.connector_list = "gocardless" # Mandate supported payment method type and connector for bank_debit
137137
bank_debit.sepa.connector_list = "gocardless" # Mandate supported payment method type and connector for bank_debit
138-
card.credit.connector_list = "stripe,adyen,authorizedotnet,cybersource,globalpay,worldpay,multisafepay,nmi,nexinets,noon,bankofamerica" # Mandate supported payment method type and connector for card
139-
card.debit.connector_list = "stripe,adyen,authorizedotnet,cybersource,globalpay,worldpay,multisafepay,nmi,nexinets,noon,bankofamerica" # Mandate supported payment method type and connector for card
138+
card.credit.connector_list = "stripe,adyen,authorizedotnet,cybersource,globalpay,worldpay,multisafepay,nmi,nexinets,noon,bankofamerica,braintree" # Mandate supported payment method type and connector for card
139+
card.debit.connector_list = "stripe,adyen,authorizedotnet,cybersource,globalpay,worldpay,multisafepay,nmi,nexinets,noon,bankofamerica,braintree" # Mandate supported payment method type and connector for card
140140
pay_later.klarna.connector_list = "adyen" # Mandate supported payment method type and connector for pay_later
141141
wallet.apple_pay.connector_list = "stripe,adyen,cybersource,noon,bankofamerica" # Mandate supported payment method type and connector for wallets
142142
wallet.google_pay.connector_list = "stripe,adyen,cybersource,bankofamerica" # Mandate supported payment method type and connector for wallets

config/deployments/sandbox.toml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -135,8 +135,8 @@ enabled = true
135135
bank_debit.ach.connector_list = "gocardless" # Mandate supported payment method type and connector for bank_debit
136136
bank_debit.becs.connector_list = "gocardless" # Mandate supported payment method type and connector for bank_debit
137137
bank_debit.sepa.connector_list = "gocardless" # Mandate supported payment method type and connector for bank_debit
138-
card.credit.connector_list = "stripe,adyen,authorizedotnet,cybersource,globalpay,worldpay,multisafepay,nmi,nexinets,noon,bankofamerica" # Mandate supported payment method type and connector for card
139-
card.debit.connector_list = "stripe,adyen,authorizedotnet,cybersource,globalpay,worldpay,multisafepay,nmi,nexinets,noon,bankofamerica" # Mandate supported payment method type and connector for card
138+
card.credit.connector_list = "stripe,adyen,authorizedotnet,cybersource,globalpay,worldpay,multisafepay,nmi,nexinets,noon,bankofamerica,braintree" # Mandate supported payment method type and connector for card
139+
card.debit.connector_list = "stripe,adyen,authorizedotnet,cybersource,globalpay,worldpay,multisafepay,nmi,nexinets,noon,bankofamerica,braintree" # Mandate supported payment method type and connector for card
140140
pay_later.klarna.connector_list = "adyen" # Mandate supported payment method type and connector for pay_later
141141
wallet.apple_pay.connector_list = "stripe,adyen,cybersource,noon,bankofamerica" # Mandate supported payment method type and connector for wallets
142142
wallet.google_pay.connector_list = "stripe,adyen,cybersource,bankofamerica" # Mandate supported payment method type and connector for wallets

config/development.toml

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -410,8 +410,6 @@ google_pay = { currency = "USD" }
410410

411411
[pm_filters.braintree]
412412
paypal = { currency = "AUD,BRL,CAD,CNY,CZK,DKK,EUR,HKD,HUF,ILS,JPY,MYR,MXN,TWD,NZD,NOK,PHP,PLN,GBP,RUB,SGD,SEK,CHF,THB,USD" }
413-
credit = { not_available_flows = { capture_method = "manual" } }
414-
debit = { not_available_flows = { capture_method = "manual" } }
415413

416414
[pm_filters.helcim]
417415
credit = { currency = "USD" }
@@ -536,8 +534,8 @@ pay_later.klarna = { connector_list = "adyen" }
536534
wallet.google_pay = { connector_list = "stripe,adyen,cybersource,bankofamerica" }
537535
wallet.apple_pay = { connector_list = "stripe,adyen,cybersource,noon,bankofamerica" }
538536
wallet.paypal = { connector_list = "adyen" }
539-
card.credit = { connector_list = "stripe,adyen,authorizedotnet,cybersource,globalpay,worldpay,multisafepay,nmi,nexinets,noon,bankofamerica" }
540-
card.debit = { connector_list = "stripe,adyen,authorizedotnet,cybersource,globalpay,worldpay,multisafepay,nmi,nexinets,noon,bankofamerica" }
537+
card.credit = { connector_list = "stripe,adyen,authorizedotnet,cybersource,globalpay,worldpay,multisafepay,nmi,nexinets,noon,bankofamerica,braintree" }
538+
card.debit = { connector_list = "stripe,adyen,authorizedotnet,cybersource,globalpay,worldpay,multisafepay,nmi,nexinets,noon,bankofamerica,braintree" }
541539
bank_debit.ach = { connector_list = "gocardless" }
542540
bank_debit.becs = { connector_list = "gocardless" }
543541
bank_debit.sepa = { connector_list = "gocardless" }

crates/hyperswitch_domain_models/src/mandates.rs

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -43,26 +43,29 @@ pub struct MandateData {
4343
pub mandate_type: Option<MandateDataType>,
4444
}
4545

46-
#[derive(Default, Eq, PartialEq, Debug, Clone)]
46+
#[derive(Default, Eq, PartialEq, Debug, Clone, serde::Deserialize)]
4747
pub struct CustomerAcceptance {
4848
/// Type of acceptance provided by the
4949
pub acceptance_type: AcceptanceType,
5050
/// Specifying when the customer acceptance was provided
51+
#[serde(with = "common_utils::custom_serde::iso8601::option")]
5152
pub accepted_at: Option<PrimitiveDateTime>,
5253
/// Information required for online mandate generation
5354
pub online: Option<OnlineMandate>,
5455
}
5556

56-
#[derive(Default, Debug, PartialEq, Eq, Clone)]
57+
#[derive(Default, Debug, PartialEq, Eq, Clone, serde::Deserialize)]
58+
#[serde(rename_all = "lowercase")]
5759
pub enum AcceptanceType {
5860
Online,
5961
#[default]
6062
Offline,
6163
}
6264

63-
#[derive(Default, Eq, PartialEq, Debug, Clone)]
65+
#[derive(Default, Eq, PartialEq, Debug, Clone, serde::Deserialize)]
6466
pub struct OnlineMandate {
6567
/// Ip address of the customer machine from which the mandate was created
68+
#[serde(skip_deserializing)]
6669
pub ip_address: Option<Secret<String, pii::IpAddress>>,
6770
/// The user-agent of the customer's browser
6871
pub user_agent: String,

crates/hyperswitch_domain_models/src/router_request_types.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -347,7 +347,7 @@ pub struct CompleteAuthorizeData {
347347
pub connector_meta: Option<serde_json::Value>,
348348
pub complete_authorize_url: Option<String>,
349349
pub metadata: Option<pii::SecretSerdeValue>,
350-
350+
pub customer_acceptance: Option<mandates::CustomerAcceptance>,
351351
// New amount for amount frame work
352352
pub minor_amount: MinorUnit,
353353
}

crates/router/src/connector/braintree.rs

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ use self::transformers as braintree;
1515
use super::utils::{self as connector_utils, PaymentsAuthorizeRequestData};
1616
use crate::{
1717
configs::settings,
18+
connector::utils::PaymentMethodDataType,
1819
consts,
1920
core::{
2021
errors::{self, CustomResult},
@@ -175,6 +176,15 @@ impl ConnectorValidation for Braintree {
175176
),
176177
}
177178
}
179+
180+
fn validate_mandate_payment(
181+
&self,
182+
pm_type: Option<types::storage::enums::PaymentMethodType>,
183+
pm_data: domain::payments::PaymentMethodData,
184+
) -> CustomResult<(), errors::ConnectorError> {
185+
let mandate_supported_pmd = std::collections::HashSet::from([PaymentMethodDataType::Card]);
186+
connector_utils::is_mandate_supported(pm_data, pm_type, mandate_supported_pmd, self.id())
187+
}
178188
}
179189

180190
impl api::Payment for Braintree {}

0 commit comments

Comments
 (0)