diff --git a/crates/api_models/src/payments.rs b/crates/api_models/src/payments.rs index 74d627d5f6..eeaceec211 100644 --- a/crates/api_models/src/payments.rs +++ b/crates/api_models/src/payments.rs @@ -1575,15 +1575,21 @@ pub struct Metadata { #[serde(flatten)] pub data: pii::SecretSerdeValue, - /// Payload coming in request as a metadata field - #[schema(value_type = Option)] - pub payload: Option, + /// Redirection response coming in request as metadata field only for redirection scenarios + pub redirect_response: Option, /// Allowed payment method types for a payment intent #[schema(value_type = Option>)] pub allowed_payment_method_types: Option>, } +#[derive(Default, Debug, Eq, PartialEq, serde::Deserialize, serde::Serialize, Clone, ToSchema)] +pub struct RedirectResponse { + pub param: Option>, + #[schema(value_type = Option)] + pub json_payload: Option, +} + #[derive(Debug, serde::Deserialize, serde::Serialize, Clone, ToSchema)] pub struct PaymentsSessionRequest { /// The identifier for the payment diff --git a/crates/router/src/connector/airwallex/transformers.rs b/crates/router/src/connector/airwallex/transformers.rs index 5d4c2ec71d..1cb3bc6076 100644 --- a/crates/router/src/connector/airwallex/transformers.rs +++ b/crates/router/src/connector/airwallex/transformers.rs @@ -1,3 +1,5 @@ +use error_stack::{IntoReport, ResultExt}; +use masking::PeekInterface; use serde::{Deserialize, Serialize}; use time::PrimitiveDateTime; use url::Url; @@ -166,9 +168,18 @@ impl TryFrom<&types::PaymentsCompleteAuthorizeRouterData> for AirwallexCompleteR three_ds: AirwallexThreeDsData { acs_response: item .request - .payload + .redirect_response .as_ref() - .map(|data| Secret::new(serde_json::Value::to_string(data))), + .map(|f| f.payload.to_owned()) + .ok_or(errors::ConnectorError::MissingRequiredField { + field_name: "redirect_response.payload", + })? + .as_ref() + .map(|data| serde_json::to_string(data.peek())) + .transpose() + .into_report() + .change_context(errors::ConnectorError::ResponseDeserializationFailed)? + .map(Secret::new), }, three_ds_type: AirwallexThreeDsType::ThreeDSContinue, }) diff --git a/crates/router/src/connector/bambora/transformers.rs b/crates/router/src/connector/bambora/transformers.rs index 14ce731627..e3b02b995b 100644 --- a/crates/router/src/connector/bambora/transformers.rs +++ b/crates/router/src/connector/bambora/transformers.rs @@ -80,10 +80,11 @@ impl TryFrom<&types::CompleteAuthorizeData> for BamboraThreedsContinueRequest { type Error = error_stack::Report; fn try_from(value: &types::CompleteAuthorizeData) -> Result { let card_response: CardResponse = value - .payload - .clone() + .redirect_response + .as_ref() + .and_then(|f| f.payload.to_owned()) .ok_or(errors::ConnectorError::MissingRequiredField { - field_name: "payload", + field_name: "redirect_response.payload", })? .parse_value("CardResponse") .change_context(errors::ConnectorError::ParsingFailed)?; diff --git a/crates/router/src/connector/bluesnap/transformers.rs b/crates/router/src/connector/bluesnap/transformers.rs index 7626d1f3ee..909cab27cc 100644 --- a/crates/router/src/connector/bluesnap/transformers.rs +++ b/crates/router/src/connector/bluesnap/transformers.rs @@ -339,10 +339,11 @@ impl TryFrom<&types::PaymentsCompleteAuthorizeRouterData> for BluesnapPaymentsRe fn try_from(item: &types::PaymentsCompleteAuthorizeRouterData) -> Result { let redirection_response: BluesnapRedirectionResponse = item .request - .payload - .clone() + .redirect_response + .as_ref() + .and_then(|res| res.payload.to_owned()) .ok_or(errors::ConnectorError::MissingConnectorRedirectionPayload { - field_name: "request.payload", + field_name: "request.redirect_response.payload", })? .parse_value("BluesnapRedirectionResponse") .change_context(errors::ConnectorError::ResponseDeserializationFailed)?; diff --git a/crates/router/src/core/payments.rs b/crates/router/src/core/payments.rs index c2faae18a8..0ad80cbf19 100644 --- a/crates/router/src/core/payments.rs +++ b/crates/router/src/core/payments.rs @@ -361,7 +361,10 @@ impl PaymentRedirectFlow for PaymentRedirectCompleteAuthorize { routing_parameters: None, order_details: None, data: masking::Secret::new("{}".into()), - payload: Some(req.json_payload.unwrap_or(serde_json::json!({})).into()), + redirect_response: Some(api_models::payments::RedirectResponse { + param: req.param.map(Secret::new), + json_payload: Some(req.json_payload.unwrap_or(serde_json::json!({})).into()), + }), allowed_payment_method_types: None, }), ..Default::default() @@ -950,6 +953,7 @@ where pub pm_token: Option, pub connector_customer_id: Option, pub ephemeral_key: Option, + pub redirect_response: Option, } #[derive(Debug, Default)] diff --git a/crates/router/src/core/payments/operations/payment_cancel.rs b/crates/router/src/core/payments/operations/payment_cancel.rs index 573ec4d2e5..e5468b3139 100644 --- a/crates/router/src/core/payments/operations/payment_cancel.rs +++ b/crates/router/src/core/payments/operations/payment_cancel.rs @@ -152,6 +152,7 @@ impl GetTracker, api::PaymentsCancelRequest> pm_token: None, connector_customer_id: None, ephemeral_key: None, + redirect_response: None, }, None, )) diff --git a/crates/router/src/core/payments/operations/payment_capture.rs b/crates/router/src/core/payments/operations/payment_capture.rs index 368e51fd79..3903c989f5 100644 --- a/crates/router/src/core/payments/operations/payment_capture.rs +++ b/crates/router/src/core/payments/operations/payment_capture.rs @@ -158,6 +158,7 @@ impl GetTracker, api::PaymentsCaptu pm_token: None, connector_customer_id: None, ephemeral_key: None, + redirect_response: None, }, None, )) diff --git a/crates/router/src/core/payments/operations/payment_complete_authorize.rs b/crates/router/src/core/payments/operations/payment_complete_authorize.rs index 7e7f698911..065f3a1467 100644 --- a/crates/router/src/core/payments/operations/payment_complete_authorize.rs +++ b/crates/router/src/core/payments/operations/payment_complete_authorize.rs @@ -2,7 +2,6 @@ use std::marker::PhantomData; use async_trait::async_trait; use error_stack::ResultExt; -use masking::ExposeOptionInterface; use router_derive::PaymentOperation; use router_env::{instrument, tracing}; @@ -146,7 +145,7 @@ impl GetTracker, api::PaymentsRequest> for Co ) .await?; - let mut connector_response = db + let connector_response = db .find_connector_response_by_payment_id_merchant_id_attempt_id( &payment_attempt.payment_id, &payment_attempt.merchant_id, @@ -156,12 +155,10 @@ impl GetTracker, api::PaymentsRequest> for Co .await .to_not_found_response(errors::ApiErrorResponse::PaymentNotFound)?; - connector_response.encoded_data = request.metadata.clone().and_then(|secret_metadata| { - secret_metadata - .payload - .expose_option() - .map(|exposed_payload| exposed_payload.to_string()) - }); + let redirect_response = request + .metadata + .as_ref() + .and_then(|secret_metadata| secret_metadata.redirect_response.to_owned()); payment_intent.shipping_address_id = shipping_address.clone().map(|i| i.address_id); payment_intent.billing_address_id = billing_address.clone().map(|i| i.address_id); @@ -205,6 +202,7 @@ impl GetTracker, api::PaymentsRequest> for Co pm_token: None, connector_customer_id: None, ephemeral_key: None, + redirect_response, }, Some(CustomerDetails { customer_id: request.customer_id.clone(), diff --git a/crates/router/src/core/payments/operations/payment_confirm.rs b/crates/router/src/core/payments/operations/payment_confirm.rs index c32a57a88b..9d413d6903 100644 --- a/crates/router/src/core/payments/operations/payment_confirm.rs +++ b/crates/router/src/core/payments/operations/payment_confirm.rs @@ -245,6 +245,7 @@ impl GetTracker, api::PaymentsRequest> for Pa pm_token: None, connector_customer_id: None, ephemeral_key: None, + redirect_response: None, }, Some(CustomerDetails { customer_id: request.customer_id.clone(), diff --git a/crates/router/src/core/payments/operations/payment_create.rs b/crates/router/src/core/payments/operations/payment_create.rs index edaa922df5..82bb804775 100644 --- a/crates/router/src/core/payments/operations/payment_create.rs +++ b/crates/router/src/core/payments/operations/payment_create.rs @@ -250,6 +250,7 @@ impl GetTracker, api::PaymentsRequest> for Pa pm_token: None, connector_customer_id: None, ephemeral_key, + redirect_response: None, }, Some(CustomerDetails { customer_id: request.customer_id.clone(), diff --git a/crates/router/src/core/payments/operations/payment_method_validate.rs b/crates/router/src/core/payments/operations/payment_method_validate.rs index 9a4cf69f40..9b3375aa33 100644 --- a/crates/router/src/core/payments/operations/payment_method_validate.rs +++ b/crates/router/src/core/payments/operations/payment_method_validate.rs @@ -179,6 +179,7 @@ impl GetTracker, api::VerifyRequest> for Paym pm_token: None, connector_customer_id: None, ephemeral_key: None, + redirect_response: None, }, Some(payments::CustomerDetails { customer_id: request.customer_id.clone(), diff --git a/crates/router/src/core/payments/operations/payment_session.rs b/crates/router/src/core/payments/operations/payment_session.rs index f12d60aff6..409818125c 100644 --- a/crates/router/src/core/payments/operations/payment_session.rs +++ b/crates/router/src/core/payments/operations/payment_session.rs @@ -171,6 +171,7 @@ impl GetTracker, api::PaymentsSessionRequest> pm_token: None, connector_customer_id: None, ephemeral_key: None, + redirect_response: None, }, Some(customer_details), )) diff --git a/crates/router/src/core/payments/operations/payment_start.rs b/crates/router/src/core/payments/operations/payment_start.rs index e69c576e53..b8f657b569 100644 --- a/crates/router/src/core/payments/operations/payment_start.rs +++ b/crates/router/src/core/payments/operations/payment_start.rs @@ -143,6 +143,7 @@ impl GetTracker, api::PaymentsStartRequest> f pm_token: None, connector_customer_id: None, ephemeral_key: None, + redirect_response: None, }, Some(customer_details), )) diff --git a/crates/router/src/core/payments/operations/payment_status.rs b/crates/router/src/core/payments/operations/payment_status.rs index 8117a87f17..780ec27c83 100644 --- a/crates/router/src/core/payments/operations/payment_status.rs +++ b/crates/router/src/core/payments/operations/payment_status.rs @@ -291,6 +291,7 @@ async fn get_tracker_for_sync< pm_token: None, connector_customer_id: None, ephemeral_key: None, + redirect_response: None, }, None, )) diff --git a/crates/router/src/core/payments/operations/payment_update.rs b/crates/router/src/core/payments/operations/payment_update.rs index 6830cebb7e..853df5630b 100644 --- a/crates/router/src/core/payments/operations/payment_update.rs +++ b/crates/router/src/core/payments/operations/payment_update.rs @@ -304,6 +304,7 @@ impl GetTracker, api::PaymentsRequest> for Pa pm_token: None, connector_customer_id: None, ephemeral_key: None, + redirect_response: None, }, Some(CustomerDetails { customer_id: request.customer_id.clone(), diff --git a/crates/router/src/core/payments/transformers.rs b/crates/router/src/core/payments/transformers.rs index 8d44d2ec30..0a8edf9a2a 100644 --- a/crates/router/src/core/payments/transformers.rs +++ b/crates/router/src/core/payments/transformers.rs @@ -1,7 +1,7 @@ use std::{fmt::Debug, marker::PhantomData}; use common_utils::fp_utils; -use error_stack::{IntoReport, ResultExt}; +use error_stack::ResultExt; use router_env::{instrument, tracing}; use storage_models::ephemeral_key; @@ -836,13 +836,13 @@ impl TryFrom> for types::CompleteAuthoriz field_name: "browser_info", })?; - let json_payload = payment_data - .connector_response - .encoded_data - .map(|s| serde_json::from_str::(&s)) - .transpose() - .into_report() - .change_context(errors::ApiErrorResponse::InternalServerError)?; + let redirect_response = payment_data.redirect_response.map(|redirect| { + types::CompleteAuthorizeRedirectResponse { + params: redirect.param, + payload: redirect.json_payload, + } + }); + Ok(Self { setup_future_usage: payment_data.payment_intent.setup_future_usage, mandate_id: payment_data.mandate_id.clone(), @@ -857,7 +857,7 @@ impl TryFrom> for types::CompleteAuthoriz email: payment_data.email, payment_method_data: payment_data.payment_method_data, connector_transaction_id: payment_data.connector_response.connector_transaction_id, - payload: json_payload, + redirect_response, connector_meta: payment_data.payment_attempt.connector_metadata, }) } diff --git a/crates/router/src/types.rs b/crates/router/src/types.rs index 803f987f0a..347adcc92f 100644 --- a/crates/router/src/types.rs +++ b/crates/router/src/types.rs @@ -284,12 +284,18 @@ pub struct CompleteAuthorizeData { pub mandate_id: Option, pub off_session: Option, pub setup_mandate_details: Option, - pub payload: Option, + pub redirect_response: Option, pub browser_info: Option, pub connector_transaction_id: Option, pub connector_meta: Option, } +#[derive(Debug, Clone)] +pub struct CompleteAuthorizeRedirectResponse { + pub params: Option>, + pub payload: Option, +} + #[derive(Debug, Default, Clone)] pub struct PaymentsSyncData { //TODO : add fields based on the connector requirements