mirror of
				https://github.com/juspay/hyperswitch.git
				synced 2025-11-01 02:57:02 +08:00 
			
		
		
		
	feat(connector): mask pii information in connector request and response for stripe, aci, adyen, airwallex and authorizedotnet (#3678)
Co-authored-by: Sampras lopes <lsampras@pm.me> Co-authored-by: hyperswitch-bot[bot] <148525504+hyperswitch-bot[bot]@users.noreply.github.com>
This commit is contained in:
		| @ -3,7 +3,7 @@ use std::str::FromStr; | ||||
| use api_models::enums::BankNames; | ||||
| use common_utils::pii::Email; | ||||
| use error_stack::report; | ||||
| use masking::Secret; | ||||
| use masking::{ExposeInterface, Secret}; | ||||
| use reqwest::Url; | ||||
| use serde::{Deserialize, Serialize}; | ||||
|  | ||||
| @ -382,7 +382,7 @@ pub struct Instruction { | ||||
| #[derive(Debug, Clone, Eq, PartialEq, Serialize)] | ||||
| pub struct BankDetails { | ||||
|     #[serde(rename = "bankAccount.holder")] | ||||
|     pub account_holder: String, | ||||
|     pub account_holder: Secret<String>, | ||||
| } | ||||
|  | ||||
| #[allow(dead_code)] | ||||
| @ -657,10 +657,11 @@ impl FromStr for AciPaymentStatus { | ||||
| #[serde(rename_all = "camelCase")] | ||||
| pub struct AciPaymentsResponse { | ||||
|     id: String, | ||||
|     registration_id: Option<String>, | ||||
|     registration_id: Option<Secret<String>>, | ||||
|     // ndc is an internal unique identifier for the request. | ||||
|     ndc: String, | ||||
|     timestamp: String, | ||||
|     // Number useful for support purposes. | ||||
|     build_number: String, | ||||
|     pub(super) result: ResultCode, | ||||
|     pub(super) redirect: Option<AciRedirectionData>, | ||||
| @ -734,7 +735,7 @@ impl<F, T> | ||||
|             .response | ||||
|             .registration_id | ||||
|             .map(|id| types::MandateReference { | ||||
|                 connector_mandate_id: Some(id), | ||||
|                 connector_mandate_id: Some(id.expose()), | ||||
|                 payment_method_id: None, | ||||
|             }); | ||||
|  | ||||
|  | ||||
| @ -7,6 +7,7 @@ use base64::Engine; | ||||
| use common_utils::request::RequestContent; | ||||
| use diesel_models::{enums as storage_enums, enums}; | ||||
| use error_stack::{IntoReport, ResultExt}; | ||||
| use masking::ExposeInterface; | ||||
| use ring::hmac; | ||||
| use router_env::{instrument, tracing}; | ||||
|  | ||||
| @ -467,8 +468,10 @@ impl | ||||
|             .response | ||||
|             .parse_struct("AdyenCaptureResponse") | ||||
|             .change_context(errors::ConnectorError::ResponseDeserializationFailed)?; | ||||
|  | ||||
|         event_builder.map(|i| i.set_response_body(&response)); | ||||
|         router_env::logger::info!(connector_response=?response); | ||||
|  | ||||
|         types::RouterData::try_from(types::ResponseRouterData { | ||||
|             response, | ||||
|             data: data.clone(), | ||||
| @ -610,8 +613,10 @@ impl | ||||
|             .response | ||||
|             .parse_struct("AdyenPaymentResponse") | ||||
|             .change_context(errors::ConnectorError::ResponseDeserializationFailed)?; | ||||
|  | ||||
|         event_builder.map(|i| i.set_response_body(&response)); | ||||
|         router_env::logger::info!(connector_response=?response); | ||||
|  | ||||
|         let is_multiple_capture_sync = match data.request.sync_type { | ||||
|             types::SyncRequestType::MultipleCaptureSync(_) => true, | ||||
|             types::SyncRequestType::SinglePaymentSync => false, | ||||
| @ -1513,7 +1518,7 @@ impl api::IncomingWebhook for Adyen { | ||||
|         let notif_item = get_webhook_object_from_body(request.body) | ||||
|             .change_context(errors::ConnectorError::WebhookSourceVerificationFailed)?; | ||||
|  | ||||
|         let base64_signature = notif_item.additional_data.hmac_signature; | ||||
|         let base64_signature = notif_item.additional_data.hmac_signature.expose(); | ||||
|         Ok(base64_signature.as_bytes().to_vec()) | ||||
|     } | ||||
|  | ||||
|  | ||||
| @ -4,7 +4,7 @@ use api_models::{enums, payments, webhooks}; | ||||
| use cards::CardNumber; | ||||
| use common_utils::ext_traits::Encode; | ||||
| use error_stack::ResultExt; | ||||
| use masking::PeekInterface; | ||||
| use masking::{ExposeInterface, PeekInterface}; | ||||
| use reqwest::Url; | ||||
| use serde::{Deserialize, Serialize}; | ||||
| use time::{Duration, OffsetDateTime, PrimitiveDateTime}; | ||||
| @ -95,10 +95,10 @@ pub struct AdditionalData { | ||||
|     pub recurring_processing_model: Option<AdyenRecurringModel>, | ||||
|     /// Enable recurring details in dashboard to receive this ID, https://docs.adyen.com/online-payments/tokenization/create-and-use-tokens#test-and-go-live | ||||
|     #[serde(rename = "recurring.recurringDetailReference")] | ||||
|     recurring_detail_reference: Option<String>, | ||||
|     recurring_detail_reference: Option<Secret<String>>, | ||||
|     #[serde(rename = "recurring.shopperReference")] | ||||
|     recurring_shopper_reference: Option<String>, | ||||
|     network_tx_reference: Option<String>, | ||||
|     network_tx_reference: Option<Secret<String>>, | ||||
|     #[cfg(feature = "payouts")] | ||||
|     payout_eligible: Option<PayoutEligibility>, | ||||
|     funds_availability: Option<String>, | ||||
| @ -559,7 +559,7 @@ pub struct JCSVoucherData { | ||||
|     first_name: Secret<String>, | ||||
|     last_name: Option<Secret<String>>, | ||||
|     shopper_email: Email, | ||||
|     telephone_number: String, | ||||
|     telephone_number: Secret<String>, | ||||
| } | ||||
|  | ||||
| #[derive(Debug, Clone, Serialize)] | ||||
| @ -610,14 +610,6 @@ pub struct BacsDirectDebitData { | ||||
|     holder_name: Secret<String>, | ||||
| } | ||||
|  | ||||
| #[derive(Debug, Clone, Serialize)] | ||||
| #[serde(rename_all = "camelCase")] | ||||
| pub struct MandateData { | ||||
|     #[serde(rename = "type")] | ||||
|     payment_type: PaymentType, | ||||
|     stored_payment_method_id: String, | ||||
| } | ||||
|  | ||||
| #[derive(Debug, Clone, Serialize)] | ||||
| #[serde(rename_all = "camelCase")] | ||||
| pub struct BancontactCardData { | ||||
| @ -680,7 +672,7 @@ impl TryFrom<&Box<payments::JCSVoucherData>> for JCSVoucherData { | ||||
|             first_name: jcs_data.first_name.clone(), | ||||
|             last_name: jcs_data.last_name.clone(), | ||||
|             shopper_email: jcs_data.email.clone(), | ||||
|             telephone_number: jcs_data.phone_number.clone(), | ||||
|             telephone_number: Secret::new(jcs_data.phone_number.clone()), | ||||
|         }) | ||||
|     } | ||||
| } | ||||
| @ -1037,7 +1029,7 @@ impl TryFrom<&api_enums::BankNames> for OpenBankingUKIssuer { | ||||
| pub struct BlikRedirectionData { | ||||
|     #[serde(rename = "type")] | ||||
|     payment_type: PaymentType, | ||||
|     blik_code: String, | ||||
|     blik_code: Secret<String>, | ||||
| } | ||||
|  | ||||
| #[derive(Debug, Clone, Serialize)] | ||||
| @ -1053,7 +1045,7 @@ pub struct BankRedirectionWithIssuer<'a> { | ||||
| pub struct AdyenMandate { | ||||
|     #[serde(rename = "type")] | ||||
|     payment_type: PaymentType, | ||||
|     stored_payment_method_id: String, | ||||
|     stored_payment_method_id: Secret<String>, | ||||
| } | ||||
|  | ||||
| #[derive(Debug, Clone, Serialize, Deserialize)] | ||||
| @ -1066,7 +1058,7 @@ pub struct AdyenCard { | ||||
|     expiry_year: Secret<String>, | ||||
|     cvc: Option<Secret<String>>, | ||||
|     brand: Option<CardBrand>, //Mandatory for mandate using network_txns_id | ||||
|     network_payment_reference: Option<String>, | ||||
|     network_payment_reference: Option<Secret<String>>, | ||||
| } | ||||
|  | ||||
| #[derive(Debug, Clone, Serialize, Deserialize)] | ||||
| @ -1149,7 +1141,7 @@ pub struct AdyenRefundRequest { | ||||
| #[derive(Default, Debug, Clone, Serialize, Deserialize)] | ||||
| #[serde(rename_all = "camelCase")] | ||||
| pub struct AdyenRefundResponse { | ||||
|     merchant_account: String, | ||||
|     merchant_account: Secret<String>, | ||||
|     psp_reference: String, | ||||
|     payment_psp_reference: String, | ||||
|     reference: String, | ||||
| @ -2137,11 +2129,11 @@ impl<'a> TryFrom<&api_models::payments::BankRedirectData> for AdyenPaymentMethod | ||||
|             api_models::payments::BankRedirectData::Blik { blik_code } => { | ||||
|                 Ok(AdyenPaymentMethod::Blik(Box::new(BlikRedirectionData { | ||||
|                     payment_type: PaymentType::Blik, | ||||
|                     blik_code: blik_code.clone().ok_or( | ||||
|                     blik_code: Secret::new(blik_code.clone().ok_or( | ||||
|                         errors::ConnectorError::MissingRequiredField { | ||||
|                             field_name: "blik_code", | ||||
|                         }, | ||||
|                     )?, | ||||
|                     )?), | ||||
|                 }))) | ||||
|             } | ||||
|             api_models::payments::BankRedirectData::Eps { bank_name, .. } => Ok( | ||||
| @ -2363,7 +2355,9 @@ impl<'a> | ||||
|             payments::MandateReferenceId::ConnectorMandateId(connector_mandate_ids) => { | ||||
|                 let adyen_mandate = AdyenMandate { | ||||
|                     payment_type: PaymentType::try_from(payment_method_type)?, | ||||
|                     stored_payment_method_id: connector_mandate_ids.get_connector_mandate_id()?, | ||||
|                     stored_payment_method_id: Secret::new( | ||||
|                         connector_mandate_ids.get_connector_mandate_id()?, | ||||
|                     ), | ||||
|                 }; | ||||
|                 Ok::<AdyenPaymentMethod<'_>, Self::Error>(AdyenPaymentMethod::Mandate(Box::new( | ||||
|                     adyen_mandate, | ||||
| @ -2381,7 +2375,7 @@ impl<'a> | ||||
|                             expiry_year: card.card_exp_year.clone(), | ||||
|                             cvc: None, | ||||
|                             brand: Some(brand), | ||||
|                             network_payment_reference: Some(network_mandate_id), | ||||
|                             network_payment_reference: Some(Secret::new(network_mandate_id)), | ||||
|                         }; | ||||
|                         Ok(AdyenPaymentMethod::AdyenCard(Box::new(adyen_card))) | ||||
|                     } | ||||
| @ -3053,12 +3047,14 @@ pub fn get_adyen_response( | ||||
|         .as_ref() | ||||
|         .and_then(|data| data.recurring_detail_reference.to_owned()) | ||||
|         .map(|mandate_id| types::MandateReference { | ||||
|             connector_mandate_id: Some(mandate_id), | ||||
|             connector_mandate_id: Some(mandate_id.expose()), | ||||
|             payment_method_id: None, | ||||
|         }); | ||||
|     let network_txn_id = response | ||||
|         .additional_data | ||||
|         .and_then(|additional_data| additional_data.network_tx_reference); | ||||
|     let network_txn_id = response.additional_data.and_then(|additional_data| { | ||||
|         additional_data | ||||
|             .network_tx_reference | ||||
|             .map(|network_tx_id| network_tx_id.expose()) | ||||
|     }); | ||||
|  | ||||
|     let payments_response_data = types::PaymentsResponseData::TransactionResponse { | ||||
|         resource_id: types::ResponseId::ConnectorTransactionId(response.psp_reference), | ||||
| @ -3333,7 +3329,7 @@ pub fn get_redirection_error_response( | ||||
| pub fn get_qr_metadata( | ||||
|     response: &QrCodeResponseResponse, | ||||
| ) -> errors::CustomResult<Option<serde_json::Value>, errors::ConnectorError> { | ||||
|     let image_data = crate_utils::QrImage::new_from_data(response.action.qr_code_data.to_owned()) | ||||
|     let image_data = crate_utils::QrImage::new_from_data(response.action.qr_code_data.clone()) | ||||
|         .change_context(errors::ConnectorError::ResponseHandlingFailed)?; | ||||
|  | ||||
|     let image_data_url = Url::parse(image_data.data.clone().as_str()).ok(); | ||||
| @ -3655,7 +3651,7 @@ impl TryFrom<&AdyenRouterData<&types::PaymentsCaptureRouterData>> for AdyenCaptu | ||||
| #[derive(Default, Debug, Serialize, Deserialize)] | ||||
| #[serde(rename_all = "camelCase")] | ||||
| pub struct AdyenCaptureResponse { | ||||
|     merchant_account: String, | ||||
|     merchant_account: Secret<String>, | ||||
|     payment_psp_reference: String, | ||||
|     psp_reference: String, | ||||
|     reference: String, | ||||
| @ -3813,7 +3809,7 @@ pub enum DisputeStatus { | ||||
| #[derive(Debug, Deserialize)] | ||||
| #[serde(rename_all = "camelCase")] | ||||
| pub struct AdyenAdditionalDataWH { | ||||
|     pub hmac_signature: String, | ||||
|     pub hmac_signature: Secret<String>, | ||||
|     pub dispute_status: Option<DisputeStatus>, | ||||
|     pub chargeback_reason_code: Option<String>, | ||||
|     #[serde(default, with = "common_utils::custom_serde::iso8601::option")] | ||||
|  | ||||
| @ -522,8 +522,10 @@ impl ConnectorIntegration<api::PSync, types::PaymentsSyncData, types::PaymentsRe | ||||
|             .response | ||||
|             .parse_struct("airwallex AirwallexPaymentsSyncResponse") | ||||
|             .change_context(errors::ConnectorError::ResponseDeserializationFailed)?; | ||||
|  | ||||
|         event_builder.map(|i| i.set_response_body(&response)); | ||||
|         router_env::logger::info!(connector_response=?response); | ||||
|  | ||||
|         types::PaymentsSyncRouterData::try_from(types::ResponseRouterData { | ||||
|             response, | ||||
|             data: data.clone(), | ||||
|  | ||||
| @ -1,5 +1,5 @@ | ||||
| use error_stack::{IntoReport, ResultExt}; | ||||
| use masking::PeekInterface; | ||||
| use masking::{ExposeInterface, PeekInterface}; | ||||
| use serde::{Deserialize, Serialize}; | ||||
| use time::PrimitiveDateTime; | ||||
| use url::Url; | ||||
| @ -416,10 +416,10 @@ pub enum AirwallexNextActionStage { | ||||
| #[derive(Debug, Clone, Deserialize, PartialEq, Serialize)] | ||||
| pub struct AirwallexRedirectFormData { | ||||
|     #[serde(rename = "JWT")] | ||||
|     jwt: Option<String>, | ||||
|     jwt: Option<Secret<String>>, | ||||
|     #[serde(rename = "threeDSMethodData")] | ||||
|     three_ds_method_data: Option<String>, | ||||
|     token: Option<String>, | ||||
|     three_ds_method_data: Option<Secret<String>>, | ||||
|     token: Option<Secret<String>>, | ||||
|     provider: Option<String>, | ||||
|     version: Option<String>, | ||||
| } | ||||
| @ -439,7 +439,7 @@ pub struct AirwallexPaymentsResponse { | ||||
|     id: String, | ||||
|     amount: Option<f32>, | ||||
|     //ID of the PaymentConsent related to this PaymentIntent | ||||
|     payment_consent_id: Option<String>, | ||||
|     payment_consent_id: Option<Secret<String>>, | ||||
|     next_action: Option<AirwallexPaymentsNextAction>, | ||||
| } | ||||
|  | ||||
| @ -450,7 +450,7 @@ pub struct AirwallexPaymentsSyncResponse { | ||||
|     id: String, | ||||
|     amount: Option<f32>, | ||||
|     //ID of the PaymentConsent related to this PaymentIntent | ||||
|     payment_consent_id: Option<String>, | ||||
|     payment_consent_id: Option<Secret<String>>, | ||||
|     next_action: Option<AirwallexPaymentsNextAction>, | ||||
| } | ||||
|  | ||||
| @ -464,18 +464,27 @@ fn get_redirection_form( | ||||
|             //Some form fields might be empty based on the authentication type by the connector | ||||
|             ( | ||||
|                 "JWT".to_string(), | ||||
|                 response_url_data.data.jwt.unwrap_or_default(), | ||||
|                 response_url_data | ||||
|                     .data | ||||
|                     .jwt | ||||
|                     .map(|jwt| jwt.expose()) | ||||
|                     .unwrap_or_default(), | ||||
|             ), | ||||
|             ( | ||||
|                 "threeDSMethodData".to_string(), | ||||
|                 response_url_data | ||||
|                     .data | ||||
|                     .three_ds_method_data | ||||
|                     .map(|three_ds_method_data| three_ds_method_data.expose()) | ||||
|                     .unwrap_or_default(), | ||||
|             ), | ||||
|             ( | ||||
|                 "token".to_string(), | ||||
|                 response_url_data.data.token.unwrap_or_default(), | ||||
|                 response_url_data | ||||
|                     .data | ||||
|                     .token | ||||
|                     .map(|token: Secret<String>| token.expose()) | ||||
|                     .unwrap_or_default(), | ||||
|             ), | ||||
|             ( | ||||
|                 "provider".to_string(), | ||||
|  | ||||
| @ -212,8 +212,10 @@ impl ConnectorIntegration<api::Capture, types::PaymentsCaptureData, types::Payme | ||||
|         let response: authorizedotnet::AuthorizedotnetPaymentsResponse = intermediate_response | ||||
|             .parse_struct("AuthorizedotnetPaymentsResponse") | ||||
|             .change_context(errors::ConnectorError::ResponseDeserializationFailed)?; | ||||
|  | ||||
|         event_builder.map(|i| i.set_response_body(&response)); | ||||
|         router_env::logger::info!(connector_response=?response); | ||||
|  | ||||
|         types::RouterData::try_from(types::ResponseRouterData { | ||||
|             response, | ||||
|             data: data.clone(), | ||||
| @ -353,7 +355,6 @@ impl ConnectorIntegration<api::Authorize, types::PaymentsAuthorizeData, types::P | ||||
|         ))?; | ||||
|         let connector_req = | ||||
|             authorizedotnet::CreateTransactionRequest::try_from(&connector_router_data)?; | ||||
|  | ||||
|         Ok(RequestContent::Json(Box::new(connector_req))) | ||||
|     } | ||||
|  | ||||
| @ -400,8 +401,10 @@ impl ConnectorIntegration<api::Authorize, types::PaymentsAuthorizeData, types::P | ||||
|         let response: authorizedotnet::AuthorizedotnetPaymentsResponse = intermediate_response | ||||
|             .parse_struct("AuthorizedotnetPaymentsResponse") | ||||
|             .change_context(errors::ConnectorError::ResponseDeserializationFailed)?; | ||||
|  | ||||
|         event_builder.map(|i| i.set_response_body(&response)); | ||||
|         router_env::logger::info!(connector_response=?response); | ||||
|  | ||||
|         types::RouterData::try_from(types::ResponseRouterData { | ||||
|             response, | ||||
|             data: data.clone(), | ||||
|  | ||||
| @ -3,7 +3,7 @@ use common_utils::{ | ||||
|     ext_traits::{Encode, ValueExt}, | ||||
| }; | ||||
| use error_stack::{IntoReport, ResultExt}; | ||||
| use masking::{PeekInterface, Secret, StrongSecret}; | ||||
| use masking::{ExposeInterface, PeekInterface, Secret, StrongSecret}; | ||||
| use serde::{Deserialize, Serialize}; | ||||
|  | ||||
| use crate::{ | ||||
| @ -119,7 +119,7 @@ pub struct PayPalDetails { | ||||
| #[serde(rename_all = "camelCase")] | ||||
| pub struct WalletDetails { | ||||
|     pub data_descriptor: WalletMethod, | ||||
|     pub data_value: String, | ||||
|     pub data_value: Secret<String>, | ||||
| } | ||||
|  | ||||
| #[derive(Serialize, Debug, Deserialize)] | ||||
| @ -147,14 +147,12 @@ fn get_pm_and_subsequent_auth_detail( | ||||
|         .to_owned() | ||||
|         .and_then(|mandate_ids| mandate_ids.mandate_reference_id) | ||||
|     { | ||||
|         Some(api_models::payments::MandateReferenceId::NetworkMandateId( | ||||
|             original_network_trans_id, | ||||
|         )) => { | ||||
|         Some(api_models::payments::MandateReferenceId::NetworkMandateId(network_trans_id)) => { | ||||
|             let processing_options = Some(ProcessingOptions { | ||||
|                 is_subsequent_auth: true, | ||||
|             }); | ||||
|             let subseuent_auth_info = Some(SubsequentAuthInformation { | ||||
|                 original_network_trans_id, | ||||
|                 original_network_trans_id: Secret::new(network_trans_id), | ||||
|                 reason: Reason::Resubmission, | ||||
|             }); | ||||
|             match item.router_data.request.payment_method_data { | ||||
| @ -225,7 +223,7 @@ pub struct ProcessingOptions { | ||||
| #[derive(Debug, Serialize)] | ||||
| #[serde(rename_all = "camelCase")] | ||||
| pub struct SubsequentAuthInformation { | ||||
|     original_network_trans_id: String, | ||||
|     original_network_trans_id: Secret<String>, | ||||
|     // original_auth_amount: String, Required for Discover, Diners Club, JCB, and China Union Pay transactions. | ||||
|     reason: Reason, | ||||
| } | ||||
| @ -474,8 +472,8 @@ pub struct AuthorizedotnetTransactionResponse { | ||||
|     response_code: AuthorizedotnetPaymentStatus, | ||||
|     #[serde(rename = "transId")] | ||||
|     transaction_id: String, | ||||
|     network_trans_id: Option<String>, | ||||
|     pub(super) account_number: Option<String>, | ||||
|     network_trans_id: Option<Secret<String>>, | ||||
|     pub(super) account_number: Option<Secret<String>>, | ||||
|     pub(super) errors: Option<Vec<ErrorMessage>>, | ||||
|     secure_acceptance: Option<SecureAcceptance>, | ||||
| } | ||||
| @ -487,8 +485,8 @@ pub struct RefundResponse { | ||||
|     #[serde(rename = "transId")] | ||||
|     transaction_id: String, | ||||
|     #[allow(dead_code)] | ||||
|     network_trans_id: Option<String>, | ||||
|     pub account_number: Option<String>, | ||||
|     network_trans_id: Option<Secret<String>>, | ||||
|     pub account_number: Option<Secret<String>>, | ||||
|     pub errors: Option<Vec<ErrorMessage>>, | ||||
| } | ||||
|  | ||||
| @ -518,8 +516,8 @@ pub struct VoidResponse { | ||||
|     response_code: AuthorizedotnetVoidStatus, | ||||
|     #[serde(rename = "transId")] | ||||
|     transaction_id: String, | ||||
|     network_trans_id: Option<String>, | ||||
|     pub account_number: Option<String>, | ||||
|     network_trans_id: Option<Secret<String>>, | ||||
|     pub account_number: Option<Secret<String>>, | ||||
|     pub errors: Option<Vec<ErrorMessage>>, | ||||
| } | ||||
|  | ||||
| @ -581,7 +579,7 @@ impl<F, T> | ||||
|                     .account_number | ||||
|                     .as_ref() | ||||
|                     .map(|acc_no| { | ||||
|                         construct_refund_payment_details(acc_no.clone()).encode_to_value() | ||||
|                         construct_refund_payment_details(acc_no.clone().expose()).encode_to_value() | ||||
|                     }) | ||||
|                     .transpose() | ||||
|                     .change_context(errors::ConnectorError::MissingRequiredField { | ||||
| @ -604,7 +602,10 @@ impl<F, T> | ||||
|                             redirection_data, | ||||
|                             mandate_reference: None, | ||||
|                             connector_metadata: metadata, | ||||
|                             network_txn_id: transaction_response.network_trans_id.clone(), | ||||
|                             network_txn_id: transaction_response | ||||
|                                 .network_trans_id | ||||
|                                 .clone() | ||||
|                                 .map(|network_trans_id| network_trans_id.expose()), | ||||
|                             connector_response_reference_id: Some( | ||||
|                                 transaction_response.transaction_id.clone(), | ||||
|                             ), | ||||
| @ -656,7 +657,7 @@ impl<F, T> | ||||
|                     .account_number | ||||
|                     .as_ref() | ||||
|                     .map(|acc_no| { | ||||
|                         construct_refund_payment_details(acc_no.clone()).encode_to_value() | ||||
|                         construct_refund_payment_details(acc_no.clone().expose()).encode_to_value() | ||||
|                     }) | ||||
|                     .transpose() | ||||
|                     .change_context(errors::ConnectorError::MissingRequiredField { | ||||
| @ -673,7 +674,10 @@ impl<F, T> | ||||
|                             redirection_data: None, | ||||
|                             mandate_reference: None, | ||||
|                             connector_metadata: metadata, | ||||
|                             network_txn_id: transaction_response.network_trans_id.clone(), | ||||
|                             network_txn_id: transaction_response | ||||
|                                 .network_trans_id | ||||
|                                 .clone() | ||||
|                                 .map(|network_trans_id| network_trans_id.expose()), | ||||
|                             connector_response_reference_id: Some( | ||||
|                                 transaction_response.transaction_id.clone(), | ||||
|                             ), | ||||
| @ -1152,13 +1156,13 @@ fn get_wallet_data( | ||||
|         api_models::payments::WalletData::GooglePay(_) => { | ||||
|             Ok(PaymentDetails::OpaqueData(WalletDetails { | ||||
|                 data_descriptor: WalletMethod::Googlepay, | ||||
|                 data_value: wallet_data.get_encoded_wallet_token()?, | ||||
|                 data_value: Secret::new(wallet_data.get_encoded_wallet_token()?), | ||||
|             })) | ||||
|         } | ||||
|         api_models::payments::WalletData::ApplePay(applepay_token) => { | ||||
|             Ok(PaymentDetails::OpaqueData(WalletDetails { | ||||
|                 data_descriptor: WalletMethod::Applepay, | ||||
|                 data_value: applepay_token.payment_data.clone(), | ||||
|                 data_value: Secret::new(applepay_token.payment_data.clone()), | ||||
|             })) | ||||
|         } | ||||
|         api_models::payments::WalletData::PaypalRedirect(_) => { | ||||
| @ -1215,7 +1219,7 @@ pub struct Paypal { | ||||
| #[derive(Debug, Serialize, Deserialize)] | ||||
| pub struct PaypalQueryParams { | ||||
|     #[serde(rename = "PayerID")] | ||||
|     payer_id: String, | ||||
|     payer_id: Secret<String>, | ||||
| } | ||||
|  | ||||
| impl TryFrom<&AuthorizedotnetRouterData<&types::PaymentsCompleteAuthorizeRouterData>> | ||||
| @ -1232,12 +1236,11 @@ impl TryFrom<&AuthorizedotnetRouterData<&types::PaymentsCompleteAuthorizeRouterD | ||||
|             .as_ref() | ||||
|             .and_then(|redirect_response| redirect_response.params.as_ref()) | ||||
|             .ok_or(errors::ConnectorError::ResponseDeserializationFailed)?; | ||||
|         let payer_id: Secret<String> = Secret::new( | ||||
|         let payer_id: Secret<String> = | ||||
|             serde_urlencoded::from_str::<PaypalQueryParams>(params.peek()) | ||||
|                 .into_report() | ||||
|                 .change_context(errors::ConnectorError::ResponseDeserializationFailed)? | ||||
|                 .payer_id, | ||||
|         ); | ||||
|                 .payer_id; | ||||
|         let transaction_type = match item.router_data.request.capture_method { | ||||
|             Some(enums::CaptureMethod::Manual) => TransactionType::ContinueAuthorization, | ||||
|             _ => TransactionType::ContinueCapture, | ||||
|  | ||||
| @ -1708,7 +1708,7 @@ impl | ||||
|     fn handle_response( | ||||
|         &self, | ||||
|         data: &types::RetrieveFileRouterData, | ||||
|         _event_builder: Option<&mut ConnectorEvent>, | ||||
|         event_builder: Option<&mut ConnectorEvent>, | ||||
|         res: types::Response, | ||||
|     ) -> CustomResult< | ||||
|         types::RouterData< | ||||
| @ -1719,7 +1719,10 @@ impl | ||||
|         errors::ConnectorError, | ||||
|     > { | ||||
|         let response = res.response; | ||||
|         router_env::logger::info!(connector_response=?response); | ||||
|  | ||||
|         event_builder.map(|event| event.set_response_body(&serde_json::json!({"connector_response_type": "file", "status_code": res.status_code}))); | ||||
|         router_env::logger::info!(connector_response_type=?"file"); | ||||
|  | ||||
|         Ok(types::RetrieveFileRouterData { | ||||
|             response: Ok(types::RetrieveFileResponse { | ||||
|                 file_data: response.to_vec(), | ||||
| @ -1737,6 +1740,7 @@ impl | ||||
|             .response | ||||
|             .parse_struct("ErrorResponse") | ||||
|             .change_context(errors::ConnectorError::ResponseDeserializationFailed)?; | ||||
|  | ||||
|         event_builder.map(|i| i.set_error_response_body(&response)); | ||||
|         router_env::logger::info!(connector_response=?response); | ||||
|  | ||||
|  | ||||
| @ -188,7 +188,7 @@ pub struct TokenRequest { | ||||
|  | ||||
| #[derive(Debug, Eq, PartialEq, Deserialize, Serialize)] | ||||
| pub struct StripeTokenResponse { | ||||
|     pub id: String, | ||||
|     pub id: Secret<String>, | ||||
|     pub object: String, | ||||
| } | ||||
|  | ||||
| @ -198,7 +198,7 @@ pub struct CustomerRequest { | ||||
|     pub email: Option<Email>, | ||||
|     pub phone: Option<Secret<String>>, | ||||
|     pub name: Option<Secret<String>>, | ||||
|     pub source: Option<String>, | ||||
|     pub source: Option<Secret<String>>, | ||||
| } | ||||
|  | ||||
| #[derive(Debug, Eq, PartialEq, Deserialize, Serialize)] | ||||
| @ -324,7 +324,7 @@ pub struct StripeBlik { | ||||
|     #[serde(rename = "payment_method_data[type]")] | ||||
|     pub payment_method_data_type: StripePaymentMethodType, | ||||
|     #[serde(rename = "payment_method_options[blik][code]")] | ||||
|     pub code: String, | ||||
|     pub code: Secret<String>, | ||||
| } | ||||
|  | ||||
| #[derive(Debug, Eq, PartialEq, Serialize)] | ||||
| @ -499,7 +499,7 @@ pub struct StripeApplePay { | ||||
|     pub pk_token: Secret<String>, | ||||
|     pub pk_token_instrument_name: String, | ||||
|     pub pk_token_payment_network: String, | ||||
|     pub pk_token_transaction_id: String, | ||||
|     pub pk_token_transaction_id: Secret<String>, | ||||
| } | ||||
|  | ||||
| #[derive(Debug, Eq, PartialEq, Serialize)] | ||||
| @ -547,7 +547,7 @@ pub enum WechatClient { | ||||
| #[derive(Debug, Eq, PartialEq, Serialize)] | ||||
| pub struct GooglepayPayment { | ||||
|     #[serde(rename = "payment_method_data[card][token]")] | ||||
|     pub token: String, | ||||
|     pub token: Secret<String>, | ||||
|     #[serde(rename = "payment_method_data[type]")] | ||||
|     pub payment_method_types: StripePaymentMethodType, | ||||
| } | ||||
| @ -1536,9 +1536,9 @@ impl TryFrom<(&payments::WalletData, Option<types::PaymentMethodToken>)> | ||||
|                                 .payment_method | ||||
|                                 .network | ||||
|                                 .to_owned(), | ||||
|                             pk_token_transaction_id: applepay_data | ||||
|                                 .transaction_identifier | ||||
|                                 .to_owned(), | ||||
|                             pk_token_transaction_id: Secret::new( | ||||
|                                 applepay_data.transaction_identifier.to_owned(), | ||||
|                             ), | ||||
|                         }))); | ||||
|                 }; | ||||
|                 let pmd = apple_pay_decrypt_data | ||||
| @ -1611,11 +1611,11 @@ impl TryFrom<&payments::BankRedirectData> for StripePaymentMethodData { | ||||
|             payments::BankRedirectData::Blik { blik_code } => Ok(Self::BankRedirect( | ||||
|                 StripeBankRedirectData::StripeBlik(Box::new(StripeBlik { | ||||
|                     payment_method_data_type, | ||||
|                     code: blik_code.clone().ok_or( | ||||
|                     code: Secret::new(blik_code.clone().ok_or( | ||||
|                         errors::ConnectorError::MissingRequiredField { | ||||
|                             field_name: "blik_code", | ||||
|                         }, | ||||
|                     )?, | ||||
|                     )?), | ||||
|                 })), | ||||
|             )), | ||||
|             payments::BankRedirectData::Eps { bank_name, .. } => Ok(Self::BankRedirect( | ||||
| @ -2042,7 +2042,7 @@ impl TryFrom<&types::ConnectorCustomerRouterData> for CustomerRequest { | ||||
|             email: item.request.email.to_owned(), | ||||
|             phone: item.request.phone.to_owned(), | ||||
|             name: item.request.name.to_owned(), | ||||
|             source: item.request.preprocessing_id.to_owned(), | ||||
|             source: item.request.preprocessing_id.to_owned().map(Secret::new), | ||||
|         }) | ||||
|     } | ||||
| } | ||||
| @ -2096,8 +2096,8 @@ pub struct PaymentIntentResponse { | ||||
|     pub status: StripePaymentStatus, | ||||
|     pub client_secret: Option<Secret<String>>, | ||||
|     pub created: i32, | ||||
|     pub customer: Option<String>, | ||||
|     pub payment_method: Option<String>, | ||||
|     pub customer: Option<Secret<String>>, | ||||
|     pub payment_method: Option<Secret<String>>, | ||||
|     pub description: Option<String>, | ||||
|     pub statement_descriptor: Option<String>, | ||||
|     pub statement_descriptor_suffix: Option<String>, | ||||
| @ -2206,7 +2206,7 @@ pub struct StripeCharge { | ||||
| #[derive(Deserialize, Clone, Debug, Serialize)] | ||||
| pub struct StripeBankRedirectDetails { | ||||
|     #[serde(rename = "generated_sepa_debit")] | ||||
|     attached_payment_method: Option<String>, | ||||
|     attached_payment_method: Option<Secret<String>>, | ||||
| } | ||||
|  | ||||
| impl Deref for PaymentIntentSyncResponse { | ||||
| @ -2308,7 +2308,7 @@ pub struct SetupIntentResponse { | ||||
|     pub object: String, | ||||
|     pub status: StripePaymentStatus, // Change to SetupStatus | ||||
|     pub client_secret: Secret<String>, | ||||
|     pub customer: Option<String>, | ||||
|     pub customer: Option<Secret<String>>, | ||||
|     pub payment_method: Option<String>, | ||||
|     pub statement_descriptor: Option<String>, | ||||
|     pub statement_descriptor_suffix: Option<String>, | ||||
| @ -2327,7 +2327,7 @@ impl ForeignFrom<(Option<StripePaymentMethodOptions>, String)> for types::Mandat | ||||
|             connector_mandate_id: payment_method_options.and_then(|options| match options { | ||||
|                 StripePaymentMethodOptions::Card { | ||||
|                     mandate_options, .. | ||||
|                 } => mandate_options.map(|mandate_options| mandate_options.reference), | ||||
|                 } => mandate_options.map(|mandate_options| mandate_options.reference.expose()), | ||||
|                 StripePaymentMethodOptions::Klarna {} | ||||
|                 | StripePaymentMethodOptions::Affirm {} | ||||
|                 | StripePaymentMethodOptions::AfterpayClearpay {} | ||||
| @ -2369,7 +2369,10 @@ impl<F, T> | ||||
|             }); | ||||
|  | ||||
|         let mandate_reference = item.response.payment_method.map(|pm| { | ||||
|             types::MandateReference::foreign_from((item.response.payment_method_options, pm)) | ||||
|             types::MandateReference::foreign_from(( | ||||
|                 item.response.payment_method_options, | ||||
|                 pm.expose(), | ||||
|             )) | ||||
|         }); | ||||
|  | ||||
|         //Note: we might have to call retrieve_setup_intent to get the network_transaction_id in case its not sent in PaymentIntentResponse | ||||
| @ -2488,14 +2491,19 @@ impl<F, T> | ||||
|                     Some(StripeChargeEnum::ChargeObject(charge)) => { | ||||
|                         match charge.payment_method_details { | ||||
|                             Some(StripePaymentMethodDetailsResponse::Bancontact { bancontact }) => { | ||||
|                                 bancontact.attached_payment_method.unwrap_or(pm) | ||||
|                             } | ||||
|                             Some(StripePaymentMethodDetailsResponse::Ideal { ideal }) => { | ||||
|                                 ideal.attached_payment_method.unwrap_or(pm) | ||||
|                             } | ||||
|                             Some(StripePaymentMethodDetailsResponse::Sofort { sofort }) => { | ||||
|                                 sofort.attached_payment_method.unwrap_or(pm) | ||||
|                                 bancontact | ||||
|                                     .attached_payment_method | ||||
|                                     .map(|attached_payment_method| attached_payment_method.expose()) | ||||
|                                     .unwrap_or(pm.expose()) | ||||
|                             } | ||||
|                             Some(StripePaymentMethodDetailsResponse::Ideal { ideal }) => ideal | ||||
|                                 .attached_payment_method | ||||
|                                 .map(|attached_payment_method| attached_payment_method.expose()) | ||||
|                                 .unwrap_or(pm.expose()), | ||||
|                             Some(StripePaymentMethodDetailsResponse::Sofort { sofort }) => sofort | ||||
|                                 .attached_payment_method | ||||
|                                 .map(|attached_payment_method| attached_payment_method.expose()) | ||||
|                                 .unwrap_or(pm.expose()), | ||||
|                             Some(StripePaymentMethodDetailsResponse::Blik) | ||||
|                             | Some(StripePaymentMethodDetailsResponse::Eps) | ||||
|                             | Some(StripePaymentMethodDetailsResponse::Fpx) | ||||
| @ -2513,10 +2521,10 @@ impl<F, T> | ||||
|                             | Some(StripePaymentMethodDetailsResponse::Wechatpay) | ||||
|                             | Some(StripePaymentMethodDetailsResponse::Alipay) | ||||
|                             | Some(StripePaymentMethodDetailsResponse::CustomerBalance) | ||||
|                             | None => pm, | ||||
|                             | None => pm.expose(), | ||||
|                         } | ||||
|                     } | ||||
|                     Some(StripeChargeEnum::ChargeId(_)) | None => pm, | ||||
|                     Some(StripeChargeEnum::ChargeId(_)) | None => pm.expose(), | ||||
|                 }, | ||||
|             )) | ||||
|         }); | ||||
| @ -2751,17 +2759,17 @@ pub struct StripeFinanicalInformation { | ||||
|  | ||||
| #[derive(Clone, Debug, Eq, PartialEq, Deserialize, Serialize)] | ||||
| pub struct SepaFinancialDetails { | ||||
|     pub account_holder_name: String, | ||||
|     pub bic: String, | ||||
|     pub country: String, | ||||
|     pub iban: String, | ||||
|     pub account_holder_name: Secret<String>, | ||||
|     pub bic: Secret<String>, | ||||
|     pub country: Secret<String>, | ||||
|     pub iban: Secret<String>, | ||||
| } | ||||
|  | ||||
| #[derive(Clone, Debug, Eq, PartialEq, Deserialize, Serialize)] | ||||
| pub struct BacsFinancialDetails { | ||||
|     pub account_holder_name: String, | ||||
|     pub account_number: String, | ||||
|     pub sort_code: String, | ||||
|     pub account_holder_name: Secret<String>, | ||||
|     pub account_number: Secret<String>, | ||||
|     pub sort_code: Secret<String>, | ||||
| } | ||||
|  | ||||
| // REFUND : | ||||
| @ -2962,7 +2970,7 @@ pub struct StripeBillingAddress { | ||||
| #[derive(Debug, Clone, serde::Deserialize, Eq, PartialEq)] | ||||
| pub struct StripeRedirectResponse { | ||||
|     pub payment_intent: Option<String>, | ||||
|     pub payment_intent_client_secret: Option<String>, | ||||
|     pub payment_intent_client_secret: Option<Secret<String>>, | ||||
|     pub source_redirect_slug: Option<String>, | ||||
|     pub redirect_status: Option<StripePaymentStatus>, | ||||
|     pub source_type: Option<Secret<String>>, | ||||
| @ -3036,7 +3044,7 @@ pub struct LatestPaymentAttempt { | ||||
| // pub struct Card | ||||
| #[derive(serde::Serialize, serde::Deserialize, Clone, Debug, Default, Eq, PartialEq)] | ||||
| pub struct StripeMandateOptions { | ||||
|     reference: String, // Extendable, But only important field to be captured | ||||
|     reference: Secret<String>, // Extendable, But only important field to be captured | ||||
| } | ||||
| /// Represents the capture request body for stripe connector. | ||||
| #[derive(Debug, Serialize, Clone, Copy)] | ||||
| @ -3238,7 +3246,7 @@ impl<F, T> | ||||
|     ) -> Result<Self, Self::Error> { | ||||
|         Ok(Self { | ||||
|             response: Ok(types::PaymentsResponseData::TokenizationResponse { | ||||
|                 token: item.response.id, | ||||
|                 token: item.response.id.expose(), | ||||
|             }), | ||||
|             ..item.data | ||||
|         }) | ||||
| @ -3619,7 +3627,7 @@ pub struct Evidence { | ||||
|     #[serde(rename = "evidence[access_activity_log]")] | ||||
|     pub access_activity_log: Option<String>, | ||||
|     #[serde(rename = "evidence[billing_address]")] | ||||
|     pub billing_address: Option<String>, | ||||
|     pub billing_address: Option<Secret<String>>, | ||||
|     #[serde(rename = "evidence[cancellation_policy]")] | ||||
|     pub cancellation_policy: Option<String>, | ||||
|     #[serde(rename = "evidence[cancellation_policy_disclosure]")] | ||||
| @ -3629,17 +3637,17 @@ pub struct Evidence { | ||||
|     #[serde(rename = "evidence[customer_communication]")] | ||||
|     pub customer_communication: Option<String>, | ||||
|     #[serde(rename = "evidence[customer_email_address]")] | ||||
|     pub customer_email_address: Option<String>, | ||||
|     pub customer_email_address: Option<Secret<String, pii::EmailStrategy>>, | ||||
|     #[serde(rename = "evidence[customer_name]")] | ||||
|     pub customer_name: Option<String>, | ||||
|     pub customer_name: Option<Secret<String>>, | ||||
|     #[serde(rename = "evidence[customer_purchase_ip]")] | ||||
|     pub customer_purchase_ip: Option<String>, | ||||
|     pub customer_purchase_ip: Option<Secret<String, pii::IpAddress>>, | ||||
|     #[serde(rename = "evidence[customer_signature]")] | ||||
|     pub customer_signature: Option<String>, | ||||
|     pub customer_signature: Option<Secret<String>>, | ||||
|     #[serde(rename = "evidence[product_description]")] | ||||
|     pub product_description: Option<String>, | ||||
|     #[serde(rename = "evidence[receipt]")] | ||||
|     pub receipt: Option<String>, | ||||
|     pub receipt: Option<Secret<String>>, | ||||
|     #[serde(rename = "evidence[refund_policy]")] | ||||
|     pub refund_policy: Option<String>, | ||||
|     #[serde(rename = "evidence[refund_policy_disclosure]")] | ||||
| @ -3651,15 +3659,15 @@ pub struct Evidence { | ||||
|     #[serde(rename = "evidence[service_documentation]")] | ||||
|     pub service_documentation: Option<String>, | ||||
|     #[serde(rename = "evidence[shipping_address]")] | ||||
|     pub shipping_address: Option<String>, | ||||
|     pub shipping_address: Option<Secret<String>>, | ||||
|     #[serde(rename = "evidence[shipping_carrier]")] | ||||
|     pub shipping_carrier: Option<String>, | ||||
|     #[serde(rename = "evidence[shipping_date]")] | ||||
|     pub shipping_date: Option<String>, | ||||
|     #[serde(rename = "evidence[shipping_documentation]")] | ||||
|     pub shipping_documentation: Option<String>, | ||||
|     pub shipping_documentation: Option<Secret<String>>, | ||||
|     #[serde(rename = "evidence[shipping_tracking_number]")] | ||||
|     pub shipping_tracking_number: Option<String>, | ||||
|     pub shipping_tracking_number: Option<Secret<String>>, | ||||
|     #[serde(rename = "evidence[uncategorized_file]")] | ||||
|     pub uncategorized_file: Option<String>, | ||||
|     #[serde(rename = "evidence[uncategorized_text]")] | ||||
| @ -3708,31 +3716,46 @@ impl TryFrom<&types::SubmitEvidenceRouterData> for Evidence { | ||||
|         let submit_evidence_request_data = item.request.clone(); | ||||
|         Ok(Self { | ||||
|             access_activity_log: submit_evidence_request_data.access_activity_log, | ||||
|             billing_address: submit_evidence_request_data.billing_address, | ||||
|             billing_address: submit_evidence_request_data | ||||
|                 .billing_address | ||||
|                 .map(Secret::new), | ||||
|             cancellation_policy: submit_evidence_request_data.cancellation_policy_provider_file_id, | ||||
|             cancellation_policy_disclosure: submit_evidence_request_data | ||||
|                 .cancellation_policy_disclosure, | ||||
|             cancellation_rebuttal: submit_evidence_request_data.cancellation_rebuttal, | ||||
|             customer_communication: submit_evidence_request_data | ||||
|                 .customer_communication_provider_file_id, | ||||
|             customer_email_address: submit_evidence_request_data.customer_email_address, | ||||
|             customer_name: submit_evidence_request_data.customer_name, | ||||
|             customer_purchase_ip: submit_evidence_request_data.customer_purchase_ip, | ||||
|             customer_signature: submit_evidence_request_data.customer_signature_provider_file_id, | ||||
|             customer_email_address: submit_evidence_request_data | ||||
|                 .customer_email_address | ||||
|                 .map(Secret::new), | ||||
|             customer_name: submit_evidence_request_data.customer_name.map(Secret::new), | ||||
|             customer_purchase_ip: submit_evidence_request_data | ||||
|                 .customer_purchase_ip | ||||
|                 .map(Secret::new), | ||||
|             customer_signature: submit_evidence_request_data | ||||
|                 .customer_signature_provider_file_id | ||||
|                 .map(Secret::new), | ||||
|             product_description: submit_evidence_request_data.product_description, | ||||
|             receipt: submit_evidence_request_data.receipt_provider_file_id, | ||||
|             receipt: submit_evidence_request_data | ||||
|                 .receipt_provider_file_id | ||||
|                 .map(Secret::new), | ||||
|             refund_policy: submit_evidence_request_data.refund_policy_provider_file_id, | ||||
|             refund_policy_disclosure: submit_evidence_request_data.refund_policy_disclosure, | ||||
|             refund_refusal_explanation: submit_evidence_request_data.refund_refusal_explanation, | ||||
|             service_date: submit_evidence_request_data.service_date, | ||||
|             service_documentation: submit_evidence_request_data | ||||
|                 .service_documentation_provider_file_id, | ||||
|             shipping_address: submit_evidence_request_data.shipping_address, | ||||
|             shipping_address: submit_evidence_request_data | ||||
|                 .shipping_address | ||||
|                 .map(Secret::new), | ||||
|             shipping_carrier: submit_evidence_request_data.shipping_carrier, | ||||
|             shipping_date: submit_evidence_request_data.shipping_date, | ||||
|             shipping_documentation: submit_evidence_request_data | ||||
|                 .shipping_documentation_provider_file_id, | ||||
|             shipping_tracking_number: submit_evidence_request_data.shipping_tracking_number, | ||||
|                 .shipping_documentation_provider_file_id | ||||
|                 .map(Secret::new), | ||||
|             shipping_tracking_number: submit_evidence_request_data | ||||
|                 .shipping_tracking_number | ||||
|                 .map(Secret::new), | ||||
|             uncategorized_file: submit_evidence_request_data.uncategorized_file_provider_file_id, | ||||
|             uncategorized_text: submit_evidence_request_data.uncategorized_text, | ||||
|             submit: true, | ||||
|  | ||||
		Reference in New Issue
	
	Block a user
	 AkshayaFoiger
					AkshayaFoiger