mirror of
https://github.com/juspay/hyperswitch.git
synced 2025-10-30 01:27:31 +08:00
fix(mandate): make payment_method_data optional for mandate scenario (#1032)
This commit is contained in:
@ -520,6 +520,7 @@ pub enum PaymentMethodData {
|
|||||||
BankRedirect(BankRedirectData),
|
BankRedirect(BankRedirectData),
|
||||||
BankDebit(BankDebitData),
|
BankDebit(BankDebitData),
|
||||||
Crypto(CryptoData),
|
Crypto(CryptoData),
|
||||||
|
MandatePayment,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug, Clone, Eq, PartialEq, serde::Deserialize, serde::Serialize)]
|
#[derive(Debug, Clone, Eq, PartialEq, serde::Deserialize, serde::Serialize)]
|
||||||
@ -536,6 +537,7 @@ pub enum AdditionalPaymentData {
|
|||||||
PayLater {},
|
PayLater {},
|
||||||
Crypto {},
|
Crypto {},
|
||||||
BankDebit {},
|
BankDebit {},
|
||||||
|
MandatePayment {},
|
||||||
}
|
}
|
||||||
|
|
||||||
impl From<&PaymentMethodData> for AdditionalPaymentData {
|
impl From<&PaymentMethodData> for AdditionalPaymentData {
|
||||||
@ -561,6 +563,7 @@ impl From<&PaymentMethodData> for AdditionalPaymentData {
|
|||||||
PaymentMethodData::PayLater(_) => Self::PayLater {},
|
PaymentMethodData::PayLater(_) => Self::PayLater {},
|
||||||
PaymentMethodData::Crypto(_) => Self::Crypto {},
|
PaymentMethodData::Crypto(_) => Self::Crypto {},
|
||||||
PaymentMethodData::BankDebit(_) => Self::BankDebit {},
|
PaymentMethodData::BankDebit(_) => Self::BankDebit {},
|
||||||
|
PaymentMethodData::MandatePayment => Self::MandatePayment {},
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -790,6 +793,7 @@ pub enum PaymentMethodDataResponse {
|
|||||||
BankRedirect(BankRedirectData),
|
BankRedirect(BankRedirectData),
|
||||||
Crypto(CryptoData),
|
Crypto(CryptoData),
|
||||||
BankDebit(BankDebitData),
|
BankDebit(BankDebitData),
|
||||||
|
MandatePayment,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug, Clone, PartialEq, Eq, serde::Serialize, serde::Deserialize, ToSchema)]
|
#[derive(Debug, Clone, PartialEq, Eq, serde::Serialize, serde::Deserialize, ToSchema)]
|
||||||
@ -1331,6 +1335,7 @@ impl From<PaymentMethodData> for PaymentMethodDataResponse {
|
|||||||
}
|
}
|
||||||
PaymentMethodData::Crypto(crpto_data) => Self::Crypto(crpto_data),
|
PaymentMethodData::Crypto(crpto_data) => Self::Crypto(crpto_data),
|
||||||
PaymentMethodData::BankDebit(bank_debit_data) => Self::BankDebit(bank_debit_data),
|
PaymentMethodData::BankDebit(bank_debit_data) => Self::BankDebit(bank_debit_data),
|
||||||
|
PaymentMethodData::MandatePayment => Self::MandatePayment,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -184,7 +184,9 @@ impl TryFrom<&types::PaymentsAuthorizeRouterData> for AciPaymentsRequest {
|
|||||||
))?,
|
))?,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
api::PaymentMethodData::Crypto(_) | api::PaymentMethodData::BankDebit(_) => {
|
api::PaymentMethodData::Crypto(_)
|
||||||
|
| api::PaymentMethodData::BankDebit(_)
|
||||||
|
| api::PaymentMethodData::MandatePayment => {
|
||||||
Err(errors::ConnectorError::NotSupported {
|
Err(errors::ConnectorError::NotSupported {
|
||||||
message: format!("{:?}", item.payment_method),
|
message: format!("{:?}", item.payment_method),
|
||||||
connector: "Aci",
|
connector: "Aci",
|
||||||
|
|||||||
@ -129,7 +129,9 @@ fn get_pm_and_subsequent_auth_detail(
|
|||||||
api::PaymentMethodData::BankRedirect(_) => {
|
api::PaymentMethodData::BankRedirect(_) => {
|
||||||
Ok((PaymentDetails::BankRedirect, None, None))
|
Ok((PaymentDetails::BankRedirect, None, None))
|
||||||
}
|
}
|
||||||
api::PaymentMethodData::Crypto(_) | api::PaymentMethodData::BankDebit(_) => {
|
api::PaymentMethodData::Crypto(_)
|
||||||
|
| api::PaymentMethodData::BankDebit(_)
|
||||||
|
| api::PaymentMethodData::MandatePayment => {
|
||||||
Err(errors::ConnectorError::NotSupported {
|
Err(errors::ConnectorError::NotSupported {
|
||||||
message: format!("{:?}", item.request.payment_method_data),
|
message: format!("{:?}", item.request.payment_method_data),
|
||||||
connector: "AuthorizeDotNet",
|
connector: "AuthorizeDotNet",
|
||||||
|
|||||||
@ -1864,11 +1864,14 @@ impl
|
|||||||
bank_specific_data: bank_data,
|
bank_specific_data: bank_data,
|
||||||
}))
|
}))
|
||||||
}
|
}
|
||||||
api::PaymentMethodData::Crypto(_) => Err(errors::ConnectorError::NotSupported {
|
api::PaymentMethodData::MandatePayment | api::PaymentMethodData::Crypto(_) => {
|
||||||
message: format!("{pm_type:?}"),
|
Err(errors::ConnectorError::NotSupported {
|
||||||
connector: "Stripe",
|
message: format!("{pm_type:?}"),
|
||||||
payment_experience: api_models::enums::PaymentExperience::RedirectToUrl.to_string(),
|
connector: "Stripe",
|
||||||
})?,
|
payment_experience: api_models::enums::PaymentExperience::RedirectToUrl
|
||||||
|
.to_string(),
|
||||||
|
})?
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -721,6 +721,9 @@ where
|
|||||||
let connector = payment_data.payment_attempt.connector.to_owned();
|
let connector = payment_data.payment_attempt.connector.to_owned();
|
||||||
|
|
||||||
let payment_data_and_tokenization_action = match connector {
|
let payment_data_and_tokenization_action = match connector {
|
||||||
|
Some(_) if payment_data.mandate_id.is_some() => {
|
||||||
|
(payment_data, TokenizationAction::SkipConnectorTokenization)
|
||||||
|
}
|
||||||
Some(connector) if is_operation_confirm(&operation) => {
|
Some(connector) if is_operation_confirm(&operation) => {
|
||||||
let payment_method = &payment_data
|
let payment_method = &payment_data
|
||||||
.payment_attempt
|
.payment_attempt
|
||||||
|
|||||||
@ -182,20 +182,25 @@ pub async fn get_token_for_recurring_mandate(
|
|||||||
.locker_id
|
.locker_id
|
||||||
.to_owned()
|
.to_owned()
|
||||||
.get_required_value("locker_id")?;
|
.get_required_value("locker_id")?;
|
||||||
let _ = cards::get_lookup_key_from_locker(state, &token, &payment_method, &locker_id).await?;
|
if let storage_models::enums::PaymentMethod::Card = payment_method.payment_method {
|
||||||
|
let _ =
|
||||||
|
cards::get_lookup_key_from_locker(state, &token, &payment_method, &locker_id).await?;
|
||||||
|
if let Some(payment_method_from_request) = req.payment_method {
|
||||||
|
let pm: storage_enums::PaymentMethod = payment_method_from_request.foreign_into();
|
||||||
|
if pm != payment_method.payment_method {
|
||||||
|
Err(report!(errors::ApiErrorResponse::PreconditionFailed {
|
||||||
|
message:
|
||||||
|
"payment method in request does not match previously provided payment \
|
||||||
|
method information"
|
||||||
|
.into()
|
||||||
|
}))?
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
if let Some(payment_method_from_request) = req.payment_method {
|
Ok((Some(token), Some(payment_method.payment_method)))
|
||||||
let pm: storage_enums::PaymentMethod = payment_method_from_request.foreign_into();
|
} else {
|
||||||
if pm != payment_method.payment_method {
|
Ok((None, Some(payment_method.payment_method)))
|
||||||
Err(report!(errors::ApiErrorResponse::PreconditionFailed {
|
}
|
||||||
message: "payment method in request does not match previously provided payment \
|
|
||||||
method information"
|
|
||||||
.into()
|
|
||||||
}))?
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
Ok((Some(token), Some(payment_method.payment_method)))
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#[instrument(skip_all)]
|
#[instrument(skip_all)]
|
||||||
|
|||||||
@ -520,10 +520,16 @@ impl<F: Clone> TryFrom<PaymentAdditionalData<'_, F>> for types::PaymentsAuthoriz
|
|||||||
payment_data.creds_identifier.as_deref(),
|
payment_data.creds_identifier.as_deref(),
|
||||||
));
|
));
|
||||||
|
|
||||||
|
// payment_method_data is not required during recurring mandate payment, in such case keep default PaymentMethodData as MandatePayment
|
||||||
|
let payment_method_data = payment_data.payment_method_data.or_else(|| {
|
||||||
|
if payment_data.mandate_id.is_some() {
|
||||||
|
Some(api_models::payments::PaymentMethodData::MandatePayment)
|
||||||
|
} else {
|
||||||
|
None
|
||||||
|
}
|
||||||
|
});
|
||||||
Ok(Self {
|
Ok(Self {
|
||||||
payment_method_data: payment_data
|
payment_method_data: payment_method_data.get_required_value("payment_method_data")?,
|
||||||
.payment_method_data
|
|
||||||
.get_required_value("payment_method_data")?,
|
|
||||||
setup_future_usage: payment_data.payment_intent.setup_future_usage,
|
setup_future_usage: payment_data.payment_intent.setup_future_usage,
|
||||||
mandate_id: payment_data.mandate_id.clone(),
|
mandate_id: payment_data.mandate_id.clone(),
|
||||||
off_session: payment_data.mandate_id.as_ref().map(|_| true),
|
off_session: payment_data.mandate_id.as_ref().map(|_| true),
|
||||||
|
|||||||
Reference in New Issue
Block a user