Skip to content

Commit 9aa5dea

Browse files
swetasharma03Sayak Bhattacharya
authored andcommitted
feat(connector): Added recurring payments support for split payments in Stripe (#8271)
Co-authored-by: Sayak Bhattacharya <[email protected]>
1 parent 0a59174 commit 9aa5dea

File tree

2 files changed

+39
-5
lines changed

2 files changed

+39
-5
lines changed

crates/hyperswitch_connectors/src/connectors/stripe/transformers.rs

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1999,7 +1999,15 @@ impl TryFrom<(&PaymentsAuthorizeRouterData, MinorUnit)> for PaymentIntentRequest
19991999
customer: Some(Secret::new(customer_id)),
20002000
setup_mandate_details,
20012001
off_session: item.request.off_session,
2002-
setup_future_usage,
2002+
setup_future_usage: match (
2003+
item.request.split_payments.as_ref(),
2004+
item.request.setup_future_usage,
2005+
item.request.customer_acceptance.as_ref(),
2006+
) {
2007+
(Some(_), Some(usage), Some(_)) => Some(usage),
2008+
_ => setup_future_usage,
2009+
},
2010+
20032011
payment_method_types,
20042012
expand: Some(ExpandableObjects::LatestCharge),
20052013
browser_info,

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

Lines changed: 30 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ use std::{fmt::Debug, marker::PhantomData, str::FromStr};
22

33
use api_models::payments::{
44
Address, ConnectorMandateReferenceId, CustomerDetails, CustomerDetailsResponse, FrmMessage,
5-
RequestSurchargeDetails,
5+
MandateIds, RequestSurchargeDetails,
66
};
77
use common_enums::{Currency, RequestIncrementalAuthorization};
88
use common_utils::{
@@ -3366,6 +3366,17 @@ impl<F: Clone> TryFrom<PaymentAdditionalData<'_, F>> for types::PaymentsAuthoriz
33663366
}
33673367
}
33683368

3369+
fn get_off_session(
3370+
mandate_id: Option<&MandateIds>,
3371+
off_session_flag: Option<bool>,
3372+
) -> Option<bool> {
3373+
match (mandate_id, off_session_flag) {
3374+
(_, Some(false)) => Some(false),
3375+
(Some(_), _) | (_, Some(true)) => Some(true),
3376+
(None, None) => None,
3377+
}
3378+
}
3379+
33693380
#[cfg(all(any(feature = "v1", feature = "v2"), not(feature = "customer_v2")))]
33703381
impl<F: Clone> TryFrom<PaymentAdditionalData<'_, F>> for types::PaymentsAuthorizeData {
33713382
type Error = error_stack::Report<errors::ApiErrorResponse>;
@@ -3520,12 +3531,16 @@ impl<F: Clone> TryFrom<PaymentAdditionalData<'_, F>> for types::PaymentsAuthoriz
35203531
})
35213532
.transpose()?
35223533
.map(pii::SecretSerdeValue::new);
3534+
let is_off_session = get_off_session(
3535+
payment_data.mandate_id.as_ref(),
3536+
payment_data.payment_intent.off_session,
3537+
);
35233538

35243539
Ok(Self {
35253540
payment_method_data: (payment_method_data.get_required_value("payment_method_data")?),
35263541
setup_future_usage: payment_data.payment_attempt.setup_future_usage_applied,
35273542
mandate_id: payment_data.mandate_id.clone(),
3528-
off_session: payment_data.mandate_id.as_ref().map(|_| true),
3543+
off_session: is_off_session,
35293544
setup_mandate_details: payment_data.setup_mandate.clone(),
35303545
confirm: payment_data.payment_attempt.confirm,
35313546
statement_descriptor_suffix: payment_data.payment_intent.statement_descriptor_suffix,
@@ -4361,6 +4376,11 @@ impl<F: Clone> TryFrom<PaymentAdditionalData<'_, F>> for types::SetupMandateRequ
43614376
.transpose()?
43624377
.map(pii::SecretSerdeValue::new);
43634378

4379+
let is_off_session = get_off_session(
4380+
payment_data.mandate_id.as_ref(),
4381+
payment_data.payment_intent.off_session,
4382+
);
4383+
43644384
Ok(Self {
43654385
currency: payment_data.currency,
43664386
confirm: true,
@@ -4371,7 +4391,7 @@ impl<F: Clone> TryFrom<PaymentAdditionalData<'_, F>> for types::SetupMandateRequ
43714391
.get_required_value("payment_method_data")?),
43724392
statement_descriptor_suffix: payment_data.payment_intent.statement_descriptor_suffix,
43734393
setup_future_usage: payment_data.payment_attempt.setup_future_usage_applied,
4374-
off_session: payment_data.mandate_id.as_ref().map(|_| true),
4394+
off_session: is_off_session,
43754395
mandate_id: payment_data.mandate_id.clone(),
43764396
setup_mandate_details: payment_data.setup_mandate,
43774397
customer_acceptance: payment_data.customer_acceptance,
@@ -4505,10 +4525,16 @@ impl<F: Clone> TryFrom<PaymentAdditionalData<'_, F>> for types::CompleteAuthoriz
45054525
.and_then(|braintree| braintree.merchant_account_id.clone());
45064526
let merchant_config_currency =
45074527
braintree_metadata.and_then(|braintree| braintree.merchant_config_currency);
4528+
4529+
let is_off_session = get_off_session(
4530+
payment_data.mandate_id.as_ref(),
4531+
payment_data.payment_intent.off_session,
4532+
);
4533+
45084534
Ok(Self {
45094535
setup_future_usage: payment_data.payment_intent.setup_future_usage,
45104536
mandate_id: payment_data.mandate_id.clone(),
4511-
off_session: payment_data.mandate_id.as_ref().map(|_| true),
4537+
off_session: is_off_session,
45124538
setup_mandate_details: payment_data.setup_mandate.clone(),
45134539
confirm: payment_data.payment_attempt.confirm,
45144540
statement_descriptor_suffix: payment_data.payment_intent.statement_descriptor_suffix,

0 commit comments

Comments
 (0)