mirror of
https://github.com/juspay/hyperswitch.git
synced 2025-11-01 19:42:27 +08:00
fix(api_request): make payment_method_data as optional (#4527)
Co-authored-by: hyperswitch-bot[bot] <148525504+hyperswitch-bot[bot]@users.noreply.github.com>
This commit is contained in:
@ -1288,15 +1288,56 @@ mod payment_method_data_serde {
|
|||||||
OptionalPaymentMethod(serde_json::Value),
|
OptionalPaymentMethod(serde_json::Value),
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// This struct is an intermediate representation
|
||||||
|
// This is required in order to catch deserialization errors when deserializing `payment_method_data`
|
||||||
|
// The #[serde(flatten)] attribute applied on `payment_method_data` discards
|
||||||
|
// any of the error when deserializing and deserializes to an option instead
|
||||||
|
#[derive(serde::Deserialize, Debug)]
|
||||||
|
struct __InnerPaymentMethodData {
|
||||||
|
billing: Option<Address>,
|
||||||
|
#[serde(flatten)]
|
||||||
|
payment_method_data: Option<serde_json::Value>,
|
||||||
|
}
|
||||||
|
|
||||||
let deserialize_to_inner = __Inner::deserialize(deserializer)?;
|
let deserialize_to_inner = __Inner::deserialize(deserializer)?;
|
||||||
|
|
||||||
match deserialize_to_inner {
|
match deserialize_to_inner {
|
||||||
__Inner::OptionalPaymentMethod(value) => {
|
__Inner::OptionalPaymentMethod(value) => {
|
||||||
let parsed_value = serde_json::from_value::<PaymentMethodDataRequest>(value)
|
let parsed_value = serde_json::from_value::<__InnerPaymentMethodData>(value)
|
||||||
.map_err(|serde_json_error| {
|
.map_err(|serde_json_error| {
|
||||||
serde::de::Error::custom(serde_json_error.to_string())
|
serde::de::Error::custom(serde_json_error.to_string())
|
||||||
})?;
|
})?;
|
||||||
|
|
||||||
Ok(Some(parsed_value))
|
let payment_method_data = if let Some(payment_method_data_value) =
|
||||||
|
parsed_value.payment_method_data
|
||||||
|
{
|
||||||
|
// Even though no data is passed, the flatten serde_json::Value is deserialized as Some(Object {})
|
||||||
|
if let serde_json::Value::Object(ref inner_map) = payment_method_data_value {
|
||||||
|
if inner_map.is_empty() {
|
||||||
|
None
|
||||||
|
} else {
|
||||||
|
Some(
|
||||||
|
serde_json::from_value::<PaymentMethodData>(
|
||||||
|
payment_method_data_value,
|
||||||
|
)
|
||||||
|
.map_err(|serde_json_error| {
|
||||||
|
serde::de::Error::custom(serde_json_error.to_string())
|
||||||
|
})?,
|
||||||
|
)
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
Err(serde::de::Error::custom(
|
||||||
|
"Expected a map for payment_method_data",
|
||||||
|
))?
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
None
|
||||||
|
};
|
||||||
|
|
||||||
|
Ok(Some(PaymentMethodDataRequest {
|
||||||
|
payment_method_data,
|
||||||
|
billing: parsed_value.billing,
|
||||||
|
}))
|
||||||
}
|
}
|
||||||
__Inner::RewardString(inner_string) => {
|
__Inner::RewardString(inner_string) => {
|
||||||
let payment_method_data = match inner_string.as_str() {
|
let payment_method_data = match inner_string.as_str() {
|
||||||
@ -1305,7 +1346,7 @@ mod payment_method_data_serde {
|
|||||||
};
|
};
|
||||||
|
|
||||||
Ok(Some(PaymentMethodDataRequest {
|
Ok(Some(PaymentMethodDataRequest {
|
||||||
payment_method_data,
|
payment_method_data: Some(payment_method_data),
|
||||||
billing: None,
|
billing: None,
|
||||||
}))
|
}))
|
||||||
}
|
}
|
||||||
@ -1320,21 +1361,29 @@ mod payment_method_data_serde {
|
|||||||
S: Serializer,
|
S: Serializer,
|
||||||
{
|
{
|
||||||
if let Some(payment_method_data_request) = payment_method_data_request {
|
if let Some(payment_method_data_request) = payment_method_data_request {
|
||||||
match payment_method_data_request.payment_method_data {
|
if let Some(payment_method_data) =
|
||||||
PaymentMethodData::Reward => serializer.serialize_str("reward"),
|
payment_method_data_request.payment_method_data.as_ref()
|
||||||
PaymentMethodData::CardRedirect(_)
|
{
|
||||||
| PaymentMethodData::BankDebit(_)
|
match payment_method_data {
|
||||||
| PaymentMethodData::BankRedirect(_)
|
PaymentMethodData::Reward => serializer.serialize_str("reward"),
|
||||||
| PaymentMethodData::BankTransfer(_)
|
PaymentMethodData::CardRedirect(_)
|
||||||
| PaymentMethodData::CardToken(_)
|
| PaymentMethodData::BankDebit(_)
|
||||||
| PaymentMethodData::Crypto(_)
|
| PaymentMethodData::BankRedirect(_)
|
||||||
| PaymentMethodData::GiftCard(_)
|
| PaymentMethodData::BankTransfer(_)
|
||||||
| PaymentMethodData::PayLater(_)
|
| PaymentMethodData::CardToken(_)
|
||||||
| PaymentMethodData::Upi(_)
|
| PaymentMethodData::Crypto(_)
|
||||||
| PaymentMethodData::Voucher(_)
|
| PaymentMethodData::GiftCard(_)
|
||||||
| PaymentMethodData::Card(_)
|
| PaymentMethodData::PayLater(_)
|
||||||
| PaymentMethodData::MandatePayment
|
| PaymentMethodData::Upi(_)
|
||||||
| PaymentMethodData::Wallet(_) => payment_method_data_request.serialize(serializer),
|
| PaymentMethodData::Voucher(_)
|
||||||
|
| PaymentMethodData::Card(_)
|
||||||
|
| PaymentMethodData::MandatePayment
|
||||||
|
| PaymentMethodData::Wallet(_) => {
|
||||||
|
payment_method_data_request.serialize(serializer)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
payment_method_data_request.serialize(serializer)
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
serializer.serialize_none()
|
serializer.serialize_none()
|
||||||
@ -1345,7 +1394,7 @@ mod payment_method_data_serde {
|
|||||||
#[derive(Debug, Clone, serde::Deserialize, serde::Serialize, ToSchema, Eq, PartialEq)]
|
#[derive(Debug, Clone, serde::Deserialize, serde::Serialize, ToSchema, Eq, PartialEq)]
|
||||||
pub struct PaymentMethodDataRequest {
|
pub struct PaymentMethodDataRequest {
|
||||||
#[serde(flatten)]
|
#[serde(flatten)]
|
||||||
pub payment_method_data: PaymentMethodData,
|
pub payment_method_data: Option<PaymentMethodData>,
|
||||||
/// billing details for the payment method.
|
/// billing details for the payment method.
|
||||||
/// This billing details will be passed to the processor as billing address.
|
/// This billing details will be passed to the processor as billing address.
|
||||||
/// If not passed, then payment.billing will be considered
|
/// If not passed, then payment.billing will be considered
|
||||||
@ -4715,7 +4764,7 @@ mod payments_request_api_contract {
|
|||||||
let payments_request = serde_json::from_str::<PaymentsRequest>(payments_request);
|
let payments_request = serde_json::from_str::<PaymentsRequest>(payments_request);
|
||||||
assert!(payments_request.is_ok());
|
assert!(payments_request.is_ok());
|
||||||
|
|
||||||
if let PaymentMethodData::Card(card_data) = payments_request
|
if let Some(PaymentMethodData::Card(card_data)) = payments_request
|
||||||
.unwrap()
|
.unwrap()
|
||||||
.payment_method_data
|
.payment_method_data
|
||||||
.unwrap()
|
.unwrap()
|
||||||
@ -4747,7 +4796,7 @@ mod payments_request_api_contract {
|
|||||||
.payment_method_data
|
.payment_method_data
|
||||||
.unwrap()
|
.unwrap()
|
||||||
.payment_method_data,
|
.payment_method_data,
|
||||||
PaymentMethodData::Reward
|
Some(PaymentMethodData::Reward)
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -335,7 +335,9 @@ impl TryFrom<StripePaymentIntentRequest> for payments::PaymentsRequest {
|
|||||||
pmd.payment_method_details
|
pmd.payment_method_details
|
||||||
.as_ref()
|
.as_ref()
|
||||||
.map(|spmd| payments::PaymentMethodDataRequest {
|
.map(|spmd| payments::PaymentMethodDataRequest {
|
||||||
payment_method_data: payments::PaymentMethodData::from(spmd.to_owned()),
|
payment_method_data: Some(payments::PaymentMethodData::from(
|
||||||
|
spmd.to_owned(),
|
||||||
|
)),
|
||||||
billing: pmd.billing_details.clone().map(payments::Address::from),
|
billing: pmd.billing_details.clone().map(payments::Address::from),
|
||||||
})
|
})
|
||||||
}),
|
}),
|
||||||
|
|||||||
@ -246,7 +246,9 @@ impl TryFrom<StripeSetupIntentRequest> for payments::PaymentsRequest {
|
|||||||
pmd.payment_method_details
|
pmd.payment_method_details
|
||||||
.as_ref()
|
.as_ref()
|
||||||
.map(|spmd| payments::PaymentMethodDataRequest {
|
.map(|spmd| payments::PaymentMethodDataRequest {
|
||||||
payment_method_data: payments::PaymentMethodData::from(spmd.to_owned()),
|
payment_method_data: Some(payments::PaymentMethodData::from(
|
||||||
|
spmd.to_owned(),
|
||||||
|
)),
|
||||||
billing: pmd.billing_details.clone().map(payments::Address::from),
|
billing: pmd.billing_details.clone().map(payments::Address::from),
|
||||||
})
|
})
|
||||||
}),
|
}),
|
||||||
|
|||||||
@ -1159,7 +1159,7 @@ pub fn verify_mandate_details_for_recurring_payments(
|
|||||||
|
|
||||||
#[instrument(skip_all)]
|
#[instrument(skip_all)]
|
||||||
pub fn payment_attempt_status_fsm(
|
pub fn payment_attempt_status_fsm(
|
||||||
payment_method_data: &Option<api::payments::PaymentMethodDataRequest>,
|
payment_method_data: Option<&api::payments::PaymentMethodData>,
|
||||||
confirm: Option<bool>,
|
confirm: Option<bool>,
|
||||||
) -> storage_enums::AttemptStatus {
|
) -> storage_enums::AttemptStatus {
|
||||||
match payment_method_data {
|
match payment_method_data {
|
||||||
@ -1172,7 +1172,7 @@ pub fn payment_attempt_status_fsm(
|
|||||||
}
|
}
|
||||||
|
|
||||||
pub fn payment_intent_status_fsm(
|
pub fn payment_intent_status_fsm(
|
||||||
payment_method_data: &Option<api::PaymentMethodDataRequest>,
|
payment_method_data: Option<&api::PaymentMethodData>,
|
||||||
confirm: Option<bool>,
|
confirm: Option<bool>,
|
||||||
) -> storage_enums::IntentStatus {
|
) -> storage_enums::IntentStatus {
|
||||||
match payment_method_data {
|
match payment_method_data {
|
||||||
@ -2129,8 +2129,14 @@ pub(crate) fn validate_amount_to_capture(
|
|||||||
pub(crate) fn validate_payment_method_fields_present(
|
pub(crate) fn validate_payment_method_fields_present(
|
||||||
req: &api::PaymentsRequest,
|
req: &api::PaymentsRequest,
|
||||||
) -> RouterResult<()> {
|
) -> RouterResult<()> {
|
||||||
|
let payment_method_data =
|
||||||
|
req.payment_method_data
|
||||||
|
.as_ref()
|
||||||
|
.and_then(|request_payment_method_data| {
|
||||||
|
request_payment_method_data.payment_method_data.as_ref()
|
||||||
|
});
|
||||||
utils::when(
|
utils::when(
|
||||||
req.payment_method.is_none() && req.payment_method_data.is_some(),
|
req.payment_method.is_none() && payment_method_data.is_some(),
|
||||||
|| {
|
|| {
|
||||||
Err(errors::ApiErrorResponse::MissingRequiredField {
|
Err(errors::ApiErrorResponse::MissingRequiredField {
|
||||||
field_name: "payment_method",
|
field_name: "payment_method",
|
||||||
@ -2152,7 +2158,7 @@ pub(crate) fn validate_payment_method_fields_present(
|
|||||||
|
|
||||||
utils::when(
|
utils::when(
|
||||||
req.payment_method.is_some()
|
req.payment_method.is_some()
|
||||||
&& req.payment_method_data.is_none()
|
&& payment_method_data.is_none()
|
||||||
&& req.payment_token.is_none()
|
&& req.payment_token.is_none()
|
||||||
&& req.recurring_details.is_none(),
|
&& req.recurring_details.is_none(),
|
||||||
|| {
|
|| {
|
||||||
@ -2194,14 +2200,14 @@ pub(crate) fn validate_payment_method_fields_present(
|
|||||||
};
|
};
|
||||||
|
|
||||||
utils::when(
|
utils::when(
|
||||||
req.payment_method.is_some() && req.payment_method_data.is_some(),
|
req.payment_method.is_some() && payment_method_data.is_some(),
|
||||||
|| {
|
|| {
|
||||||
req.payment_method_data
|
payment_method_data
|
||||||
.clone()
|
.cloned()
|
||||||
.map_or(Ok(()), |req_payment_method_data| {
|
.map_or(Ok(()), |payment_method_data| {
|
||||||
req.payment_method.map_or(Ok(()), |req_payment_method| {
|
req.payment_method.map_or(Ok(()), |req_payment_method| {
|
||||||
validate_payment_method_and_payment_method_data(
|
validate_payment_method_and_payment_method_data(
|
||||||
req_payment_method_data.payment_method_data,
|
payment_method_data,
|
||||||
req_payment_method,
|
req_payment_method,
|
||||||
)
|
)
|
||||||
})
|
})
|
||||||
@ -3409,7 +3415,7 @@ impl AttemptType {
|
|||||||
// In case if fields are not overridden by the request then they contain the same data that was in the previous attempt provided it is populated in this function.
|
// In case if fields are not overridden by the request then they contain the same data that was in the previous attempt provided it is populated in this function.
|
||||||
#[inline(always)]
|
#[inline(always)]
|
||||||
fn make_new_payment_attempt(
|
fn make_new_payment_attempt(
|
||||||
payment_method_data: &Option<api_models::payments::PaymentMethodDataRequest>,
|
payment_method_data: Option<&api_models::payments::PaymentMethodData>,
|
||||||
old_payment_attempt: PaymentAttempt,
|
old_payment_attempt: PaymentAttempt,
|
||||||
new_attempt_count: i16,
|
new_attempt_count: i16,
|
||||||
storage_scheme: enums::MerchantStorageScheme,
|
storage_scheme: enums::MerchantStorageScheme,
|
||||||
@ -3507,7 +3513,11 @@ impl AttemptType {
|
|||||||
let new_payment_attempt = db
|
let new_payment_attempt = db
|
||||||
.insert_payment_attempt(
|
.insert_payment_attempt(
|
||||||
Self::make_new_payment_attempt(
|
Self::make_new_payment_attempt(
|
||||||
&request.payment_method_data,
|
request.payment_method_data.as_ref().and_then(
|
||||||
|
|request_payment_method_data| {
|
||||||
|
request_payment_method_data.payment_method_data.as_ref()
|
||||||
|
},
|
||||||
|
),
|
||||||
fetched_payment_attempt,
|
fetched_payment_attempt,
|
||||||
new_attempt_count,
|
new_attempt_count,
|
||||||
storage_scheme,
|
storage_scheme,
|
||||||
@ -3524,7 +3534,11 @@ impl AttemptType {
|
|||||||
fetched_payment_intent,
|
fetched_payment_intent,
|
||||||
storage::PaymentIntentUpdate::StatusAndAttemptUpdate {
|
storage::PaymentIntentUpdate::StatusAndAttemptUpdate {
|
||||||
status: payment_intent_status_fsm(
|
status: payment_intent_status_fsm(
|
||||||
&request.payment_method_data,
|
request.payment_method_data.as_ref().and_then(
|
||||||
|
|request_payment_method_data| {
|
||||||
|
request_payment_method_data.payment_method_data.as_ref()
|
||||||
|
},
|
||||||
|
),
|
||||||
Some(true),
|
Some(true),
|
||||||
),
|
),
|
||||||
active_attempt_id: new_payment_attempt.attempt_id.clone(),
|
active_attempt_id: new_payment_attempt.attempt_id.clone(),
|
||||||
|
|||||||
@ -138,7 +138,7 @@ impl<F: Send + Clone, Ctx: PaymentMethodRetrieve>
|
|||||||
&request
|
&request
|
||||||
.payment_method_data
|
.payment_method_data
|
||||||
.as_ref()
|
.as_ref()
|
||||||
.map(|pmd| pmd.payment_method_data.clone()),
|
.and_then(|pmd| pmd.payment_method_data.clone()),
|
||||||
&request.payment_method_type,
|
&request.payment_method_type,
|
||||||
&mandate_type,
|
&mandate_type,
|
||||||
&token,
|
&token,
|
||||||
@ -284,7 +284,7 @@ impl<F: Send + Clone, Ctx: PaymentMethodRetrieve>
|
|||||||
payment_method_data: request
|
payment_method_data: request
|
||||||
.payment_method_data
|
.payment_method_data
|
||||||
.as_ref()
|
.as_ref()
|
||||||
.map(|pmd| pmd.payment_method_data.clone()),
|
.and_then(|pmd| pmd.payment_method_data.clone()),
|
||||||
payment_method_info,
|
payment_method_info,
|
||||||
force_sync: None,
|
force_sync: None,
|
||||||
refunds: vec![],
|
refunds: vec![],
|
||||||
|
|||||||
@ -341,7 +341,7 @@ impl<F: Send + Clone, Ctx: PaymentMethodRetrieve>
|
|||||||
request
|
request
|
||||||
.payment_method_data
|
.payment_method_data
|
||||||
.as_ref()
|
.as_ref()
|
||||||
.map(|pmd| pmd.payment_method_data.clone()),
|
.and_then(|pmd| pmd.payment_method_data.clone()),
|
||||||
)?;
|
)?;
|
||||||
|
|
||||||
payment_attempt.browser_info = browser_info;
|
payment_attempt.browser_info = browser_info;
|
||||||
@ -412,7 +412,7 @@ impl<F: Send + Clone, Ctx: PaymentMethodRetrieve>
|
|||||||
let n_request_payment_method_data = request
|
let n_request_payment_method_data = request
|
||||||
.payment_method_data
|
.payment_method_data
|
||||||
.as_ref()
|
.as_ref()
|
||||||
.map(|pmd| pmd.payment_method_data.clone());
|
.and_then(|pmd| pmd.payment_method_data.clone());
|
||||||
|
|
||||||
let store = state.clone().store;
|
let store = state.clone().store;
|
||||||
|
|
||||||
@ -524,7 +524,7 @@ impl<F: Send + Clone, Ctx: PaymentMethodRetrieve>
|
|||||||
&request
|
&request
|
||||||
.payment_method_data
|
.payment_method_data
|
||||||
.as_ref()
|
.as_ref()
|
||||||
.map(|pmd| pmd.payment_method_data.clone()),
|
.and_then(|pmd| pmd.payment_method_data.clone()),
|
||||||
&request.payment_method_type,
|
&request.payment_method_type,
|
||||||
&mandate_type,
|
&mandate_type,
|
||||||
&token,
|
&token,
|
||||||
@ -570,11 +570,12 @@ impl<F: Send + Clone, Ctx: PaymentMethodRetrieve>
|
|||||||
let payment_method_data_after_card_bin_call = request
|
let payment_method_data_after_card_bin_call = request
|
||||||
.payment_method_data
|
.payment_method_data
|
||||||
.as_ref()
|
.as_ref()
|
||||||
|
.and_then(|request_payment_method_data| {
|
||||||
|
request_payment_method_data.payment_method_data.as_ref()
|
||||||
|
})
|
||||||
.zip(additional_pm_data)
|
.zip(additional_pm_data)
|
||||||
.map(|(payment_method_data, additional_payment_data)| {
|
.map(|(payment_method_data, additional_payment_data)| {
|
||||||
payment_method_data
|
payment_method_data.apply_additional_payment_data(additional_payment_data)
|
||||||
.payment_method_data
|
|
||||||
.apply_additional_payment_data(additional_payment_data)
|
|
||||||
});
|
});
|
||||||
let authentication = payment_attempt.authentication_id.as_ref().async_map(|authentication_id| async move {
|
let authentication = payment_attempt.authentication_id.as_ref().async_map(|authentication_id| async move {
|
||||||
state
|
state
|
||||||
|
|||||||
@ -396,11 +396,14 @@ impl<F: Send + Clone, Ctx: PaymentMethodRetrieve>
|
|||||||
let payment_method_data_after_card_bin_call = request
|
let payment_method_data_after_card_bin_call = request
|
||||||
.payment_method_data
|
.payment_method_data
|
||||||
.as_ref()
|
.as_ref()
|
||||||
|
.and_then(|payment_method_data_from_request| {
|
||||||
|
payment_method_data_from_request
|
||||||
|
.payment_method_data
|
||||||
|
.as_ref()
|
||||||
|
})
|
||||||
.zip(additional_payment_data)
|
.zip(additional_payment_data)
|
||||||
.map(|(payment_method_data, additional_payment_data)| {
|
.map(|(payment_method_data, additional_payment_data)| {
|
||||||
payment_method_data
|
payment_method_data.apply_additional_payment_data(additional_payment_data)
|
||||||
.payment_method_data
|
|
||||||
.apply_additional_payment_data(additional_payment_data)
|
|
||||||
});
|
});
|
||||||
|
|
||||||
let amount = payment_attempt.get_total_amount().into();
|
let amount = payment_attempt.get_total_amount().into();
|
||||||
@ -702,7 +705,7 @@ impl<F: Send + Clone, Ctx: PaymentMethodRetrieve> ValidateRequest<F, api::Paymen
|
|||||||
request
|
request
|
||||||
.payment_method_data
|
.payment_method_data
|
||||||
.as_ref()
|
.as_ref()
|
||||||
.map(|pmd| pmd.payment_method_data.clone()),
|
.and_then(|pmd| pmd.payment_method_data.clone()),
|
||||||
)?;
|
)?;
|
||||||
|
|
||||||
helpers::validate_payment_method_fields_present(request)?;
|
helpers::validate_payment_method_fields_present(request)?;
|
||||||
@ -722,7 +725,7 @@ impl<F: Send + Clone, Ctx: PaymentMethodRetrieve> ValidateRequest<F, api::Paymen
|
|||||||
&request
|
&request
|
||||||
.payment_method_data
|
.payment_method_data
|
||||||
.as_ref()
|
.as_ref()
|
||||||
.map(|pmd| pmd.payment_method_data.clone()),
|
.and_then(|pmd| pmd.payment_method_data.clone()),
|
||||||
&request.payment_method_type,
|
&request.payment_method_type,
|
||||||
&mandate_type,
|
&mandate_type,
|
||||||
&request.payment_token,
|
&request.payment_token,
|
||||||
@ -772,20 +775,26 @@ impl PaymentCreate {
|
|||||||
storage::PaymentAttemptNew,
|
storage::PaymentAttemptNew,
|
||||||
Option<api_models::payments::AdditionalPaymentData>,
|
Option<api_models::payments::AdditionalPaymentData>,
|
||||||
)> {
|
)> {
|
||||||
|
let payment_method_data =
|
||||||
|
request
|
||||||
|
.payment_method_data
|
||||||
|
.as_ref()
|
||||||
|
.and_then(|payment_method_data_request| {
|
||||||
|
payment_method_data_request.payment_method_data.as_ref()
|
||||||
|
});
|
||||||
|
|
||||||
let created_at @ modified_at @ last_synced = Some(common_utils::date_time::now());
|
let created_at @ modified_at @ last_synced = Some(common_utils::date_time::now());
|
||||||
let status =
|
let status = helpers::payment_attempt_status_fsm(payment_method_data, request.confirm);
|
||||||
helpers::payment_attempt_status_fsm(&request.payment_method_data, request.confirm);
|
|
||||||
let (amount, currency) = (money.0, Some(money.1));
|
let (amount, currency) = (money.0, Some(money.1));
|
||||||
|
|
||||||
let mut additional_pm_data = request
|
let mut additional_pm_data = request
|
||||||
.payment_method_data
|
.payment_method_data
|
||||||
.as_ref()
|
.as_ref()
|
||||||
|
.and_then(|payment_method_data_request| {
|
||||||
|
payment_method_data_request.payment_method_data.as_ref()
|
||||||
|
})
|
||||||
.async_map(|payment_method_data| async {
|
.async_map(|payment_method_data| async {
|
||||||
helpers::get_additional_payment_data(
|
helpers::get_additional_payment_data(payment_method_data, &*state.store).await
|
||||||
&payment_method_data.payment_method_data,
|
|
||||||
&*state.store,
|
|
||||||
)
|
|
||||||
.await
|
|
||||||
})
|
})
|
||||||
.await;
|
.await;
|
||||||
|
|
||||||
@ -944,8 +953,16 @@ impl PaymentCreate {
|
|||||||
session_expiry: PrimitiveDateTime,
|
session_expiry: PrimitiveDateTime,
|
||||||
) -> RouterResult<storage::PaymentIntentNew> {
|
) -> RouterResult<storage::PaymentIntentNew> {
|
||||||
let created_at @ modified_at @ last_synced = Some(common_utils::date_time::now());
|
let created_at @ modified_at @ last_synced = Some(common_utils::date_time::now());
|
||||||
let status =
|
|
||||||
helpers::payment_intent_status_fsm(&request.payment_method_data, request.confirm);
|
let status = helpers::payment_intent_status_fsm(
|
||||||
|
request
|
||||||
|
.payment_method_data
|
||||||
|
.as_ref()
|
||||||
|
.and_then(|request_payment_method_data| {
|
||||||
|
request_payment_method_data.payment_method_data.as_ref()
|
||||||
|
}),
|
||||||
|
request.confirm,
|
||||||
|
);
|
||||||
let client_secret =
|
let client_secret =
|
||||||
crate::utils::generate_id(consts::ID_LENGTH, format!("{payment_id}_secret").as_str());
|
crate::utils::generate_id(consts::ID_LENGTH, format!("{payment_id}_secret").as_str());
|
||||||
let (amount, currency) = (money.0, Some(money.1));
|
let (amount, currency) = (money.0, Some(money.1));
|
||||||
|
|||||||
@ -81,7 +81,7 @@ impl<F: Send + Clone, Ctx: PaymentMethodRetrieve>
|
|||||||
request
|
request
|
||||||
.payment_method_data
|
.payment_method_data
|
||||||
.as_ref()
|
.as_ref()
|
||||||
.map(|pmd| pmd.payment_method_data.clone()),
|
.and_then(|pmd| pmd.payment_method_data.clone()),
|
||||||
)?;
|
)?;
|
||||||
|
|
||||||
helpers::validate_payment_status_against_not_allowed_statuses(
|
helpers::validate_payment_status_against_not_allowed_statuses(
|
||||||
@ -265,7 +265,7 @@ impl<F: Send + Clone, Ctx: PaymentMethodRetrieve>
|
|||||||
&request
|
&request
|
||||||
.payment_method_data
|
.payment_method_data
|
||||||
.as_ref()
|
.as_ref()
|
||||||
.map(|pmd| pmd.payment_method_data.clone()),
|
.and_then(|pmd| pmd.payment_method_data.clone()),
|
||||||
&request.payment_method_type,
|
&request.payment_method_type,
|
||||||
&mandate_type,
|
&mandate_type,
|
||||||
&token,
|
&token,
|
||||||
@ -430,7 +430,7 @@ impl<F: Send + Clone, Ctx: PaymentMethodRetrieve>
|
|||||||
payment_method_data: request
|
payment_method_data: request
|
||||||
.payment_method_data
|
.payment_method_data
|
||||||
.as_ref()
|
.as_ref()
|
||||||
.map(|pmd| pmd.payment_method_data.clone()),
|
.and_then(|pmd| pmd.payment_method_data.clone()),
|
||||||
payment_method_info,
|
payment_method_info,
|
||||||
force_sync: None,
|
force_sync: None,
|
||||||
refunds: vec![],
|
refunds: vec![],
|
||||||
|
|||||||
@ -261,7 +261,7 @@ mod payments_test {
|
|||||||
PaymentsRequest {
|
PaymentsRequest {
|
||||||
amount: Some(Amount::from(200)),
|
amount: Some(Amount::from(200)),
|
||||||
payment_method_data: Some(PaymentMethodDataRequest {
|
payment_method_data: Some(PaymentMethodDataRequest {
|
||||||
payment_method_data: PaymentMethodData::Card(card()),
|
payment_method_data: Some(PaymentMethodData::Card(card())),
|
||||||
billing: None,
|
billing: None,
|
||||||
}),
|
}),
|
||||||
..PaymentsRequest::default()
|
..PaymentsRequest::default()
|
||||||
|
|||||||
@ -317,7 +317,7 @@ async fn payments_create_core() {
|
|||||||
setup_future_usage: Some(api_enums::FutureUsage::OnSession),
|
setup_future_usage: Some(api_enums::FutureUsage::OnSession),
|
||||||
authentication_type: Some(api_enums::AuthenticationType::NoThreeDs),
|
authentication_type: Some(api_enums::AuthenticationType::NoThreeDs),
|
||||||
payment_method_data: Some(api::PaymentMethodDataRequest {
|
payment_method_data: Some(api::PaymentMethodDataRequest {
|
||||||
payment_method_data: api::PaymentMethodData::Card(api::Card {
|
payment_method_data: Some(api::PaymentMethodData::Card(api::Card {
|
||||||
card_number: "4242424242424242".to_string().try_into().unwrap(),
|
card_number: "4242424242424242".to_string().try_into().unwrap(),
|
||||||
card_exp_month: "10".to_string().into(),
|
card_exp_month: "10".to_string().into(),
|
||||||
card_exp_year: "35".to_string().into(),
|
card_exp_year: "35".to_string().into(),
|
||||||
@ -329,7 +329,7 @@ async fn payments_create_core() {
|
|||||||
card_issuing_country: None,
|
card_issuing_country: None,
|
||||||
bank_code: None,
|
bank_code: None,
|
||||||
nick_name: Some(masking::Secret::new("nick_name".into())),
|
nick_name: Some(masking::Secret::new("nick_name".into())),
|
||||||
}),
|
})),
|
||||||
billing: None,
|
billing: None,
|
||||||
}),
|
}),
|
||||||
payment_method: Some(api_enums::PaymentMethod::Card),
|
payment_method: Some(api_enums::PaymentMethod::Card),
|
||||||
@ -499,7 +499,7 @@ async fn payments_create_core_adyen_no_redirect() {
|
|||||||
setup_future_usage: Some(api_enums::FutureUsage::OnSession),
|
setup_future_usage: Some(api_enums::FutureUsage::OnSession),
|
||||||
authentication_type: Some(api_enums::AuthenticationType::NoThreeDs),
|
authentication_type: Some(api_enums::AuthenticationType::NoThreeDs),
|
||||||
payment_method_data: Some(api::PaymentMethodDataRequest {
|
payment_method_data: Some(api::PaymentMethodDataRequest {
|
||||||
payment_method_data: api::PaymentMethodData::Card(api::Card {
|
payment_method_data: Some(api::PaymentMethodData::Card(api::Card {
|
||||||
card_number: "5555 3412 4444 1115".to_string().try_into().unwrap(),
|
card_number: "5555 3412 4444 1115".to_string().try_into().unwrap(),
|
||||||
card_exp_month: "03".to_string().into(),
|
card_exp_month: "03".to_string().into(),
|
||||||
card_exp_year: "2030".to_string().into(),
|
card_exp_year: "2030".to_string().into(),
|
||||||
@ -511,7 +511,7 @@ async fn payments_create_core_adyen_no_redirect() {
|
|||||||
card_issuing_country: None,
|
card_issuing_country: None,
|
||||||
bank_code: None,
|
bank_code: None,
|
||||||
nick_name: Some(masking::Secret::new("nick_name".into())),
|
nick_name: Some(masking::Secret::new("nick_name".into())),
|
||||||
}),
|
})),
|
||||||
billing: None,
|
billing: None,
|
||||||
}),
|
}),
|
||||||
payment_method: Some(api_enums::PaymentMethod::Card),
|
payment_method: Some(api_enums::PaymentMethod::Card),
|
||||||
|
|||||||
@ -77,7 +77,7 @@ async fn payments_create_core() {
|
|||||||
setup_future_usage: None,
|
setup_future_usage: None,
|
||||||
authentication_type: Some(api_enums::AuthenticationType::NoThreeDs),
|
authentication_type: Some(api_enums::AuthenticationType::NoThreeDs),
|
||||||
payment_method_data: Some(api::PaymentMethodDataRequest {
|
payment_method_data: Some(api::PaymentMethodDataRequest {
|
||||||
payment_method_data: api::PaymentMethodData::Card(api::Card {
|
payment_method_data: Some(api::PaymentMethodData::Card(api::Card {
|
||||||
card_number: "4242424242424242".to_string().try_into().unwrap(),
|
card_number: "4242424242424242".to_string().try_into().unwrap(),
|
||||||
card_exp_month: "10".to_string().into(),
|
card_exp_month: "10".to_string().into(),
|
||||||
card_exp_year: "35".to_string().into(),
|
card_exp_year: "35".to_string().into(),
|
||||||
@ -89,7 +89,7 @@ async fn payments_create_core() {
|
|||||||
card_issuing_country: None,
|
card_issuing_country: None,
|
||||||
bank_code: None,
|
bank_code: None,
|
||||||
nick_name: Some(masking::Secret::new("nick_name".into())),
|
nick_name: Some(masking::Secret::new("nick_name".into())),
|
||||||
}),
|
})),
|
||||||
billing: None,
|
billing: None,
|
||||||
}),
|
}),
|
||||||
payment_method: Some(api_enums::PaymentMethod::Card),
|
payment_method: Some(api_enums::PaymentMethod::Card),
|
||||||
@ -266,7 +266,7 @@ async fn payments_create_core_adyen_no_redirect() {
|
|||||||
setup_future_usage: Some(api_enums::FutureUsage::OffSession),
|
setup_future_usage: Some(api_enums::FutureUsage::OffSession),
|
||||||
authentication_type: Some(api_enums::AuthenticationType::NoThreeDs),
|
authentication_type: Some(api_enums::AuthenticationType::NoThreeDs),
|
||||||
payment_method_data: Some(api::PaymentMethodDataRequest {
|
payment_method_data: Some(api::PaymentMethodDataRequest {
|
||||||
payment_method_data: api::PaymentMethodData::Card(api::Card {
|
payment_method_data: Some(api::PaymentMethodData::Card(api::Card {
|
||||||
card_number: "5555 3412 4444 1115".to_string().try_into().unwrap(),
|
card_number: "5555 3412 4444 1115".to_string().try_into().unwrap(),
|
||||||
card_exp_month: "03".to_string().into(),
|
card_exp_month: "03".to_string().into(),
|
||||||
card_exp_year: "2030".to_string().into(),
|
card_exp_year: "2030".to_string().into(),
|
||||||
@ -278,7 +278,7 @@ async fn payments_create_core_adyen_no_redirect() {
|
|||||||
card_type: None,
|
card_type: None,
|
||||||
card_issuing_country: None,
|
card_issuing_country: None,
|
||||||
nick_name: Some(masking::Secret::new("nick_name".into())),
|
nick_name: Some(masking::Secret::new("nick_name".into())),
|
||||||
}),
|
})),
|
||||||
billing: None,
|
billing: None,
|
||||||
}),
|
}),
|
||||||
|
|
||||||
|
|||||||
@ -12787,7 +12787,12 @@
|
|||||||
"PaymentMethodDataRequest": {
|
"PaymentMethodDataRequest": {
|
||||||
"allOf": [
|
"allOf": [
|
||||||
{
|
{
|
||||||
"$ref": "#/components/schemas/PaymentMethodData"
|
"allOf": [
|
||||||
|
{
|
||||||
|
"$ref": "#/components/schemas/PaymentMethodData"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"nullable": true
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"type": "object",
|
"type": "object",
|
||||||
|
|||||||
Reference in New Issue
Block a user