diff --git a/api-reference-v2/openapi_spec.json b/api-reference-v2/openapi_spec.json index 53af0100c4..263d27aa46 100644 --- a/api-reference-v2/openapi_spec.json +++ b/api-reference-v2/openapi_spec.json @@ -7634,6 +7634,7 @@ "globepay", "gocardless", "gpayments", + "hipay", "helcim", "inespay", "iatapay", @@ -8721,6 +8722,14 @@ } ], "nullable": true + }, + "network_tokenization": { + "allOf": [ + { + "$ref": "#/components/schemas/NetworkTokenResponse" + } + ], + "nullable": true } } }, @@ -11590,6 +11599,14 @@ "type": "object", "description": "Metadata is useful for storing additional, unstructured information about the merchant account.", "nullable": true + }, + "product_type": { + "allOf": [ + { + "$ref": "#/components/schemas/api_enums.MerchantProductType" + } + ], + "nullable": true } }, "additionalProperties": false @@ -11724,6 +11741,14 @@ }, "recon_status": { "$ref": "#/components/schemas/ReconStatus" + }, + "product_type": { + "allOf": [ + { + "$ref": "#/components/schemas/api_enums.MerchantProductType" + } + ], + "nullable": true } } }, @@ -15357,6 +15382,14 @@ }, "description": "The connector token details if available", "nullable": true + }, + "network_token": { + "allOf": [ + { + "$ref": "#/components/schemas/NetworkTokenResponse" + } + ], + "nullable": true } } }, @@ -15890,7 +15923,8 @@ "active_attempt_payment_connector_id", "billing_connector_payment_details", "payment_method_type", - "payment_method_subtype" + "payment_method_subtype", + "connector" ], "properties": { "total_retry_count": { @@ -15921,6 +15955,9 @@ }, "payment_method_subtype": { "$ref": "#/components/schemas/PaymentMethodType" + }, + "connector": { + "$ref": "#/components/schemas/Connector" } } }, @@ -20308,6 +20345,7 @@ "globalpay", "globepay", "gocardless", + "hipay", "helcim", "iatapay", "inespay", diff --git a/api-reference/openapi_spec.json b/api-reference/openapi_spec.json index cc1207d477..4d4dc65d9b 100644 --- a/api-reference/openapi_spec.json +++ b/api-reference/openapi_spec.json @@ -9733,6 +9733,7 @@ "globepay", "gocardless", "gpayments", + "hipay", "helcim", "inespay", "iatapay", @@ -13928,6 +13929,14 @@ } ], "nullable": true + }, + "product_type": { + "allOf": [ + { + "$ref": "#/components/schemas/api_enums.MerchantProductType" + } + ], + "nullable": true } }, "additionalProperties": false @@ -14161,6 +14170,14 @@ } ], "nullable": true + }, + "product_type": { + "allOf": [ + { + "$ref": "#/components/schemas/api_enums.MerchantProductType" + } + ], + "nullable": true } } }, @@ -19591,6 +19608,16 @@ } ], "nullable": true + }, + "issuer_error_code": { + "type": "string", + "description": "Error code received from the issuer in case of failed payments", + "nullable": true + }, + "issuer_error_message": { + "type": "string", + "description": "Error message received from the issuer in case of failed payments", + "nullable": true } } }, @@ -20859,6 +20886,16 @@ } ], "nullable": true + }, + "issuer_error_code": { + "type": "string", + "description": "Error code received from the issuer in case of failed payments", + "nullable": true + }, + "issuer_error_message": { + "type": "string", + "description": "Error message received from the issuer in case of failed payments", + "nullable": true } } }, @@ -24138,6 +24175,16 @@ } ], "nullable": true + }, + "issuer_error_code": { + "type": "string", + "description": "Error code received from the issuer in case of failed refunds", + "nullable": true + }, + "issuer_error_message": { + "type": "string", + "description": "Error message received from the issuer in case of failed refunds", + "nullable": true } } }, @@ -24794,6 +24841,7 @@ "globalpay", "globepay", "gocardless", + "hipay", "helcim", "iatapay", "inespay", diff --git a/crates/api_models/src/payments.rs b/crates/api_models/src/payments.rs index 651b009656..2e21de6108 100644 --- a/crates/api_models/src/payments.rs +++ b/crates/api_models/src/payments.rs @@ -5036,6 +5036,12 @@ pub struct PaymentsResponse { /// Method through which card was discovered #[schema(value_type = Option, example = "manual")] pub card_discovery: Option, + + /// Error code received from the issuer in case of failed payments + pub issuer_error_code: Option, + + /// Error message received from the issuer in case of failed payments + pub issuer_error_message: Option, } #[cfg(feature = "v2")] diff --git a/crates/api_models/src/refunds.rs b/crates/api_models/src/refunds.rs index ad09c333ea..ece1edb72b 100644 --- a/crates/api_models/src/refunds.rs +++ b/crates/api_models/src/refunds.rs @@ -210,6 +210,10 @@ pub struct RefundResponse { /// Charge specific fields for controlling the revert of funds from either platform or connected account #[schema(value_type = Option,)] pub split_refunds: Option, + /// Error code received from the issuer in case of failed refunds + pub issuer_error_code: Option, + /// Error message received from the issuer in case of failed refunds + pub issuer_error_message: Option, } #[cfg(feature = "v1")] diff --git a/crates/diesel_models/src/payment_attempt.rs b/crates/diesel_models/src/payment_attempt.rs index 7409b72265..8fb4afeb8e 100644 --- a/crates/diesel_models/src/payment_attempt.rs +++ b/crates/diesel_models/src/payment_attempt.rs @@ -187,6 +187,8 @@ pub struct PaymentAttempt { pub processor_transaction_data: Option, pub card_discovery: Option, pub charges: Option, + pub issuer_error_code: Option, + pub issuer_error_message: Option, } #[cfg(feature = "v1")] @@ -547,6 +549,8 @@ pub enum PaymentAttemptUpdate { connector_transaction_id: Option, payment_method_data: Option, authentication_type: Option, + issuer_error_code: Option, + issuer_error_message: Option, }, CaptureUpdate { amount_to_capture: Option, @@ -898,6 +902,8 @@ pub struct PaymentAttemptUpdateInternal { pub processor_transaction_data: Option, pub card_discovery: Option, pub charges: Option, + pub issuer_error_code: Option, + pub issuer_error_message: Option, } #[cfg(feature = "v1")] @@ -1082,6 +1088,8 @@ impl PaymentAttemptUpdate { connector_mandate_detail, card_discovery, charges, + issuer_error_code, + issuer_error_message, } = PaymentAttemptUpdateInternal::from(self).populate_derived_fields(&source); PaymentAttempt { amount: amount.unwrap_or(source.amount), @@ -1141,6 +1149,8 @@ impl PaymentAttemptUpdate { connector_mandate_detail: connector_mandate_detail.or(source.connector_mandate_detail), card_discovery: card_discovery.or(source.card_discovery), charges: charges.or(source.charges), + issuer_error_code: issuer_error_code.or(source.issuer_error_code), + issuer_error_message: issuer_error_message.or(source.issuer_error_message), ..source } } @@ -2194,6 +2204,8 @@ impl From for PaymentAttemptUpdateInternal { connector_mandate_detail: None, card_discovery: None, charges: None, + issuer_error_code: None, + issuer_error_message: None, }, PaymentAttemptUpdate::AuthenticationTypeUpdate { authentication_type, @@ -2251,6 +2263,8 @@ impl From for PaymentAttemptUpdateInternal { connector_mandate_detail: None, card_discovery: None, charges: None, + issuer_error_code: None, + issuer_error_message: None, }, PaymentAttemptUpdate::ConfirmUpdate { amount, @@ -2340,6 +2354,8 @@ impl From for PaymentAttemptUpdateInternal { connector_mandate_detail, card_discovery, charges: None, + issuer_error_code: None, + issuer_error_message: None, }, PaymentAttemptUpdate::VoidUpdate { status, @@ -2398,6 +2414,8 @@ impl From for PaymentAttemptUpdateInternal { connector_mandate_detail: None, card_discovery: None, charges: None, + issuer_error_code: None, + issuer_error_message: None, }, PaymentAttemptUpdate::RejectUpdate { status, @@ -2457,6 +2475,8 @@ impl From for PaymentAttemptUpdateInternal { connector_mandate_detail: None, card_discovery: None, charges: None, + issuer_error_code: None, + issuer_error_message: None, }, PaymentAttemptUpdate::BlocklistUpdate { status, @@ -2516,6 +2536,8 @@ impl From for PaymentAttemptUpdateInternal { connector_mandate_detail: None, card_discovery: None, charges: None, + issuer_error_code: None, + issuer_error_message: None, }, PaymentAttemptUpdate::ConnectorMandateDetailUpdate { connector_mandate_detail, @@ -2573,6 +2595,8 @@ impl From for PaymentAttemptUpdateInternal { connector_mandate_detail, card_discovery: None, charges: None, + issuer_error_code: None, + issuer_error_message: None, }, PaymentAttemptUpdate::PaymentMethodDetailsUpdate { payment_method_id, @@ -2630,6 +2654,8 @@ impl From for PaymentAttemptUpdateInternal { connector_mandate_detail: None, card_discovery: None, charges: None, + issuer_error_code: None, + issuer_error_message: None, }, PaymentAttemptUpdate::ResponseUpdate { status, @@ -2712,6 +2738,8 @@ impl From for PaymentAttemptUpdateInternal { shipping_cost: None, order_tax_amount: None, card_discovery: None, + issuer_error_code: None, + issuer_error_message: None, } } PaymentAttemptUpdate::ErrorUpdate { @@ -2727,6 +2755,8 @@ impl From for PaymentAttemptUpdateInternal { connector_transaction_id, payment_method_data, authentication_type, + issuer_error_code, + issuer_error_message, } => { let (connector_transaction_id, processor_transaction_data) = connector_transaction_id @@ -2748,6 +2778,8 @@ impl From for PaymentAttemptUpdateInternal { payment_method_data, authentication_type, processor_transaction_data, + issuer_error_code, + issuer_error_message, amount: None, net_amount: None, currency: None, @@ -2841,6 +2873,8 @@ impl From for PaymentAttemptUpdateInternal { connector_mandate_detail: None, card_discovery: None, charges: None, + issuer_error_code: None, + issuer_error_message: None, }, PaymentAttemptUpdate::UpdateTrackers { payment_token, @@ -2904,6 +2938,8 @@ impl From for PaymentAttemptUpdateInternal { connector_mandate_detail: None, card_discovery: None, charges: None, + issuer_error_code: None, + issuer_error_message: None, }, PaymentAttemptUpdate::UnresolvedResponseUpdate { status, @@ -2974,6 +3010,8 @@ impl From for PaymentAttemptUpdateInternal { connector_mandate_detail: None, card_discovery: None, charges: None, + issuer_error_code: None, + issuer_error_message: None, } } PaymentAttemptUpdate::PreprocessingUpdate { @@ -3043,6 +3081,8 @@ impl From for PaymentAttemptUpdateInternal { connector_mandate_detail: None, card_discovery: None, charges: None, + issuer_error_code: None, + issuer_error_message: None, } } PaymentAttemptUpdate::CaptureUpdate { @@ -3102,6 +3142,8 @@ impl From for PaymentAttemptUpdateInternal { connector_mandate_detail: None, card_discovery: None, charges: None, + issuer_error_code: None, + issuer_error_message: None, }, PaymentAttemptUpdate::AmountToCaptureUpdate { status, @@ -3160,6 +3202,8 @@ impl From for PaymentAttemptUpdateInternal { connector_mandate_detail: None, card_discovery: None, charges: None, + issuer_error_code: None, + issuer_error_message: None, }, PaymentAttemptUpdate::ConnectorResponse { authentication_data, @@ -3227,6 +3271,8 @@ impl From for PaymentAttemptUpdateInternal { order_tax_amount: None, connector_mandate_detail: None, card_discovery: None, + issuer_error_code: None, + issuer_error_message: None, } } PaymentAttemptUpdate::IncrementalAuthorizationAmountUpdate { @@ -3285,6 +3331,8 @@ impl From for PaymentAttemptUpdateInternal { connector_mandate_detail: None, card_discovery: None, charges: None, + issuer_error_code: None, + issuer_error_message: None, }, PaymentAttemptUpdate::AuthenticationUpdate { status, @@ -3345,6 +3393,8 @@ impl From for PaymentAttemptUpdateInternal { connector_mandate_detail: None, card_discovery: None, charges: None, + issuer_error_code: None, + issuer_error_message: None, }, PaymentAttemptUpdate::ManualUpdate { status, @@ -3414,6 +3464,8 @@ impl From for PaymentAttemptUpdateInternal { connector_mandate_detail: None, card_discovery: None, charges: None, + issuer_error_code: None, + issuer_error_message: None, } } PaymentAttemptUpdate::PostSessionTokensUpdate { @@ -3472,6 +3524,8 @@ impl From for PaymentAttemptUpdateInternal { connector_mandate_detail: None, card_discovery: None, charges: None, + issuer_error_code: None, + issuer_error_message: None, }, } } diff --git a/crates/diesel_models/src/refund.rs b/crates/diesel_models/src/refund.rs index f19c3252c6..ee598bebd2 100644 --- a/crates/diesel_models/src/refund.rs +++ b/crates/diesel_models/src/refund.rs @@ -60,6 +60,8 @@ pub struct Refund { pub unified_message: Option, pub processor_refund_data: Option, pub processor_transaction_data: Option, + pub issuer_error_code: Option, + pub issuer_error_message: Option, } #[derive( @@ -140,6 +142,8 @@ pub enum RefundUpdate { processor_refund_data: Option, unified_code: Option, unified_message: Option, + issuer_error_code: Option, + issuer_error_message: Option, }, ManualUpdate { refund_status: Option, @@ -165,6 +169,8 @@ pub struct RefundUpdateInternal { processor_refund_data: Option, unified_code: Option, unified_message: Option, + issuer_error_code: Option, + issuer_error_message: Option, } impl RefundUpdateInternal { @@ -213,6 +219,8 @@ impl From for RefundUpdateInternal { modified_at: common_utils::date_time::now(), unified_code: None, unified_message: None, + issuer_error_code: None, + issuer_error_message: None, }, RefundUpdate::MetadataAndReasonUpdate { metadata, @@ -232,6 +240,8 @@ impl From for RefundUpdateInternal { processor_refund_data: None, unified_code: None, unified_message: None, + issuer_error_code: None, + issuer_error_message: None, }, RefundUpdate::StatusUpdate { connector_refund_id, @@ -253,6 +263,8 @@ impl From for RefundUpdateInternal { modified_at: common_utils::date_time::now(), unified_code: None, unified_message: None, + issuer_error_code: None, + issuer_error_message: None, }, RefundUpdate::ErrorUpdate { refund_status, @@ -263,6 +275,8 @@ impl From for RefundUpdateInternal { updated_by, connector_refund_id, processor_refund_data, + issuer_error_code, + issuer_error_message, } => Self { refund_status, refund_error_message, @@ -277,6 +291,8 @@ impl From for RefundUpdateInternal { modified_at: common_utils::date_time::now(), unified_code, unified_message, + issuer_error_code, + issuer_error_message, }, RefundUpdate::ManualUpdate { refund_status, @@ -297,6 +313,8 @@ impl From for RefundUpdateInternal { processor_refund_data: None, unified_code: None, unified_message: None, + issuer_error_code: None, + issuer_error_message: None, }, } } @@ -318,6 +336,8 @@ impl RefundUpdate { processor_refund_data, unified_code, unified_message, + issuer_error_code, + issuer_error_message, } = self.into(); Refund { connector_refund_id: connector_refund_id.or(source.connector_refund_id), @@ -333,6 +353,8 @@ impl RefundUpdate { processor_refund_data: processor_refund_data.or(source.processor_refund_data), unified_code: unified_code.or(source.unified_code), unified_message: unified_message.or(source.unified_message), + issuer_error_code: issuer_error_code.or(source.issuer_error_code), + issuer_error_message: issuer_error_message.or(source.issuer_error_message), ..source } } diff --git a/crates/diesel_models/src/schema.rs b/crates/diesel_models/src/schema.rs index ae01a54bd4..4e2ba4811b 100644 --- a/crates/diesel_models/src/schema.rs +++ b/crates/diesel_models/src/schema.rs @@ -922,6 +922,9 @@ diesel::table! { processor_transaction_data -> Nullable, card_discovery -> Nullable, charges -> Nullable, + #[max_length = 64] + issuer_error_code -> Nullable, + issuer_error_message -> Nullable, } } @@ -1276,6 +1279,9 @@ diesel::table! { unified_message -> Nullable, processor_refund_data -> Nullable, processor_transaction_data -> Nullable, + #[max_length = 64] + issuer_error_code -> Nullable, + issuer_error_message -> Nullable, } } diff --git a/crates/hyperswitch_connectors/src/connectors/aci.rs b/crates/hyperswitch_connectors/src/connectors/aci.rs index f4fce668ee..8219105ed2 100644 --- a/crates/hyperswitch_connectors/src/connectors/aci.rs +++ b/crates/hyperswitch_connectors/src/connectors/aci.rs @@ -121,6 +121,8 @@ impl ConnectorCommon for Aci { }), attempt_status: None, connector_transaction_id: None, + issuer_error_code: None, + issuer_error_message: None, }) } } diff --git a/crates/hyperswitch_connectors/src/connectors/adyen.rs b/crates/hyperswitch_connectors/src/connectors/adyen.rs index 1e57cbbcf6..8e0694336b 100644 --- a/crates/hyperswitch_connectors/src/connectors/adyen.rs +++ b/crates/hyperswitch_connectors/src/connectors/adyen.rs @@ -144,6 +144,8 @@ impl ConnectorCommon for Adyen { reason: Some(response.message), attempt_status: None, connector_transaction_id: response.psp_reference, + issuer_error_code: None, + issuer_error_message: None, }) } } @@ -988,6 +990,8 @@ impl ConnectorIntegration, funds_availability: Option, + refusal_reason_raw: Option, + refusal_code_raw: Option, } #[serde_with::skip_serializing_none] @@ -444,6 +446,10 @@ pub struct AdyenWebhookResponse { refusal_reason: Option, refusal_reason_code: Option, event_code: WebhookEventCode, + // Raw acquirer refusal code + refusal_code_raw: Option, + // Raw acquirer refusal reason + refusal_reason_raw: Option, } #[derive(Debug, Clone, Serialize, Deserialize)] @@ -453,6 +459,7 @@ pub struct RedirectionErrorResponse { refusal_reason: Option, psp_reference: Option, merchant_reference: Option, + additional_data: Option, } #[derive(Debug, Clone, Deserialize, Serialize)] @@ -466,6 +473,7 @@ pub struct RedirectionResponse { merchant_reference: Option, store: Option, splits: Option>, + additional_data: Option, } #[derive(Debug, Clone, Deserialize, Serialize)] @@ -3461,6 +3469,14 @@ pub fn get_adyen_response( status_code, attempt_status: None, connector_transaction_id: Some(response.psp_reference.clone()), + issuer_error_code: response + .additional_data + .as_ref() + .and_then(|data| data.refusal_code_raw.clone()), + issuer_error_message: response + .additional_data + .as_ref() + .and_then(|data| data.refusal_reason_raw.clone()), }) } else { None @@ -3533,6 +3549,8 @@ pub fn get_webhook_response( status_code, attempt_status: None, connector_transaction_id: Some(response.transaction_id.clone()), + issuer_error_code: response.refusal_code_raw.clone(), + issuer_error_message: response.refusal_reason_raw.clone(), }) } else { None @@ -3598,6 +3616,14 @@ pub fn get_redirection_response( status_code, attempt_status: None, connector_transaction_id: response.psp_reference.clone(), + issuer_error_code: response + .additional_data + .as_ref() + .and_then(|data| data.refusal_code_raw.clone()), + issuer_error_message: response + .additional_data + .as_ref() + .and_then(|data| data.refusal_reason_raw.clone()), }) } else { None @@ -3674,6 +3700,8 @@ pub fn get_present_to_shopper_response( status_code, attempt_status: None, connector_transaction_id: response.psp_reference.clone(), + issuer_error_code: None, + issuer_error_message: None, }) } else { None @@ -3739,6 +3767,8 @@ pub fn get_qr_code_response( status_code, attempt_status: None, connector_transaction_id: response.psp_reference.clone(), + issuer_error_code: None, + issuer_error_message: None, }) } else { None @@ -3796,6 +3826,14 @@ pub fn get_redirection_error_response( status_code, attempt_status: None, connector_transaction_id: response.psp_reference.clone(), + issuer_error_code: response + .additional_data + .as_ref() + .and_then(|data| data.refusal_code_raw.clone()), + issuer_error_message: response + .additional_data + .as_ref() + .and_then(|data| data.refusal_reason_raw.clone()), }); // We don't get connector transaction id for redirections in Adyen. let payments_response_data = PaymentsResponseData::TransactionResponse { @@ -4307,6 +4345,10 @@ pub struct AdyenAdditionalDataWH { #[serde(rename = "recurring.recurringDetailReference")] pub recurring_detail_reference: Option>, pub network_tx_reference: Option>, + /// [only for cards] Enable raw acquirer from Adyen dashboard to receive this (https://docs.adyen.com/development-resources/raw-acquirer-responses/#search-modal) + pub refusal_reason_raw: Option, + /// [only for cards] This is only available for Visa and Mastercard + pub refusal_code_raw: Option, } #[derive(Debug, Deserialize)] @@ -4592,6 +4634,8 @@ impl From for AdyenWebhookResponse { refusal_reason, refusal_reason_code, event_code: notif.event_code, + refusal_code_raw: notif.additional_data.refusal_code_raw, + refusal_reason_raw: notif.additional_data.refusal_reason_raw, } } } @@ -5307,6 +5351,8 @@ impl ForeignTryFrom<(&Self, AdyenDisputeResponse)> for AcceptDisputeRouterData { )?, attempt_status: None, connector_transaction_id: None, + issuer_error_code: None, + issuer_error_message: None, }), ..data.clone() }) @@ -5345,6 +5391,8 @@ impl ForeignTryFrom<(&Self, AdyenDisputeResponse)> for SubmitEvidenceRouterData )?, attempt_status: None, connector_transaction_id: None, + issuer_error_code: None, + issuer_error_message: None, }), ..data.clone() }) @@ -5385,6 +5433,8 @@ impl ForeignTryFrom<(&Self, AdyenDisputeResponse)> for DefendDisputeRouterData { )?, attempt_status: None, connector_transaction_id: None, + issuer_error_code: None, + issuer_error_message: None, }), ..data.clone() }) diff --git a/crates/hyperswitch_connectors/src/connectors/airwallex.rs b/crates/hyperswitch_connectors/src/connectors/airwallex.rs index f37bef8302..c748223626 100644 --- a/crates/hyperswitch_connectors/src/connectors/airwallex.rs +++ b/crates/hyperswitch_connectors/src/connectors/airwallex.rs @@ -122,6 +122,8 @@ impl ConnectorCommon for Airwallex { reason: response.source, attempt_status: None, connector_transaction_id: None, + issuer_error_code: None, + issuer_error_message: None, }) } } diff --git a/crates/hyperswitch_connectors/src/connectors/amazonpay.rs b/crates/hyperswitch_connectors/src/connectors/amazonpay.rs index f895954157..d383bb59b7 100644 --- a/crates/hyperswitch_connectors/src/connectors/amazonpay.rs +++ b/crates/hyperswitch_connectors/src/connectors/amazonpay.rs @@ -145,6 +145,8 @@ impl ConnectorCommon for Amazonpay { reason: response.reason, attempt_status: None, connector_transaction_id: None, + issuer_error_code: None, + issuer_error_message: None, }) } } diff --git a/crates/hyperswitch_connectors/src/connectors/authorizedotnet.rs b/crates/hyperswitch_connectors/src/connectors/authorizedotnet.rs index 3bd39fd38b..de72dbe2ae 100644 --- a/crates/hyperswitch_connectors/src/connectors/authorizedotnet.rs +++ b/crates/hyperswitch_connectors/src/connectors/authorizedotnet.rs @@ -1000,6 +1000,8 @@ fn get_error_response( status_code, attempt_status: None, connector_transaction_id: None, + issuer_error_code: None, + issuer_error_message: None, }) }) .unwrap_or_else(|| ErrorResponse { @@ -1009,6 +1011,8 @@ fn get_error_response( status_code, attempt_status: None, connector_transaction_id: None, + issuer_error_code: None, + issuer_error_message: None, })), Some(authorizedotnet::TransactionResponse::AuthorizedotnetTransactionResponseError(_)) | None => { @@ -1025,6 +1029,8 @@ fn get_error_response( status_code, attempt_status: None, connector_transaction_id: None, + issuer_error_code: None, + issuer_error_message: None, }) } } diff --git a/crates/hyperswitch_connectors/src/connectors/authorizedotnet/transformers.rs b/crates/hyperswitch_connectors/src/connectors/authorizedotnet/transformers.rs index 3ba9e76cc7..2d329ec82f 100644 --- a/crates/hyperswitch_connectors/src/connectors/authorizedotnet/transformers.rs +++ b/crates/hyperswitch_connectors/src/connectors/authorizedotnet/transformers.rs @@ -551,6 +551,8 @@ impl status_code: item.http_code, attempt_status: None, connector_transaction_id: None, + issuer_error_code: None, + issuer_error_message: None, }); Ok(Self { response, @@ -1219,6 +1221,8 @@ impl status_code: item.http_code, attempt_status: None, connector_transaction_id: Some(transaction_response.transaction_id.clone()), + issuer_error_code: None, + issuer_error_message: None, }) }); let metadata = transaction_response @@ -1310,6 +1314,8 @@ impl TryFrom TryFrom> status_code: item.http_code, attempt_status: None, connector_transaction_id: Some(transaction_response.transaction_id.clone()), + issuer_error_code: None, + issuer_error_message: None, }) }); @@ -1736,6 +1744,8 @@ fn get_err_response( status_code, attempt_status: None, connector_transaction_id: None, + issuer_error_code: None, + issuer_error_message: None, }) } diff --git a/crates/hyperswitch_connectors/src/connectors/bambora.rs b/crates/hyperswitch_connectors/src/connectors/bambora.rs index c4a9edea65..1bf524392d 100644 --- a/crates/hyperswitch_connectors/src/connectors/bambora.rs +++ b/crates/hyperswitch_connectors/src/connectors/bambora.rs @@ -144,6 +144,8 @@ impl ConnectorCommon for Bambora { reason: Some(response.message), attempt_status: None, connector_transaction_id: None, + issuer_error_code: None, + issuer_error_message: None, }) } } diff --git a/crates/hyperswitch_connectors/src/connectors/bamboraapac.rs b/crates/hyperswitch_connectors/src/connectors/bamboraapac.rs index f745349507..fb9c079912 100644 --- a/crates/hyperswitch_connectors/src/connectors/bamboraapac.rs +++ b/crates/hyperswitch_connectors/src/connectors/bamboraapac.rs @@ -163,6 +163,8 @@ impl ConnectorCommon for Bamboraapac { reason: response_data.declined_message, attempt_status: None, connector_transaction_id: None, + issuer_error_code: None, + issuer_error_message: None, }) } Err(error_msg) => { diff --git a/crates/hyperswitch_connectors/src/connectors/bamboraapac/transformers.rs b/crates/hyperswitch_connectors/src/connectors/bamboraapac/transformers.rs index 5996ba0583..525b0456ce 100644 --- a/crates/hyperswitch_connectors/src/connectors/bamboraapac/transformers.rs +++ b/crates/hyperswitch_connectors/src/connectors/bamboraapac/transformers.rs @@ -346,6 +346,8 @@ impl reason: Some(declined_message), attempt_status: None, connector_transaction_id: None, + issuer_error_code: None, + issuer_error_message: None, }), ..item.data }) @@ -501,6 +503,8 @@ impl reason: None, attempt_status: None, connector_transaction_id: None, + issuer_error_code: None, + issuer_error_message: None, }), ..item.data }) @@ -663,6 +667,8 @@ impl reason: Some(declined_message), attempt_status: None, connector_transaction_id: None, + issuer_error_code: None, + issuer_error_message: None, }), ..item.data }) @@ -944,6 +950,8 @@ impl reason: Some(declined_message), attempt_status: None, connector_transaction_id: None, + issuer_error_code: None, + issuer_error_message: None, }), ..item.data }) diff --git a/crates/hyperswitch_connectors/src/connectors/bankofamerica.rs b/crates/hyperswitch_connectors/src/connectors/bankofamerica.rs index 36d12fe3fc..c1cc1b644a 100644 --- a/crates/hyperswitch_connectors/src/connectors/bankofamerica.rs +++ b/crates/hyperswitch_connectors/src/connectors/bankofamerica.rs @@ -276,6 +276,8 @@ impl ConnectorCommon for Bankofamerica { reason, attempt_status: None, connector_transaction_id: None, + issuer_error_code: None, + issuer_error_message: None, }) } transformers::BankOfAmericaErrorResponse::AuthenticationError(response) => { @@ -286,6 +288,8 @@ impl ConnectorCommon for Bankofamerica { reason: Some(response.response.rmsg), attempt_status: None, connector_transaction_id: None, + issuer_error_code: None, + issuer_error_message: None, }) } } @@ -434,6 +438,8 @@ impl ConnectorIntegration fo .unwrap_or(hyperswitch_interfaces::consts::NO_ERROR_MESSAGE.to_string()), attempt_status: None, connector_transaction_id: None, + issuer_error_code: None, + issuer_error_message: None, }) } } @@ -867,6 +877,8 @@ impl ConnectorIntegration for Ba .unwrap_or(hyperswitch_interfaces::consts::NO_ERROR_MESSAGE.to_string()), attempt_status: None, connector_transaction_id: None, + issuer_error_code: None, + issuer_error_message: None, }) } } diff --git a/crates/hyperswitch_connectors/src/connectors/bankofamerica/transformers.rs b/crates/hyperswitch_connectors/src/connectors/bankofamerica/transformers.rs index 9804f6c4e6..4b40e36a7a 100644 --- a/crates/hyperswitch_connectors/src/connectors/bankofamerica/transformers.rs +++ b/crates/hyperswitch_connectors/src/connectors/bankofamerica/transformers.rs @@ -1445,6 +1445,8 @@ fn map_error_response( status_code: item.http_code, attempt_status: None, connector_transaction_id: Some(error_response.id.clone()), + issuer_error_code: None, + issuer_error_message: None, }); match transaction_status { @@ -1486,10 +1488,10 @@ fn get_payment_response( enums::AttemptStatus, u16, ), -) -> Result { +) -> Result> { let error_response = get_error_response_if_failure((info_response, status, http_code)); match error_response { - Some(error) => Err(error), + Some(error) => Err(Box::new(error)), None => { let mandate_reference = info_response @@ -1549,7 +1551,8 @@ impl info_response.status.clone(), item.data.request.is_auto_capture()?, )); - let response = get_payment_response((&info_response, status, item.http_code)); + let response = get_payment_response((&info_response, status, item.http_code)) + .map_err(|err| *err); let connector_response = match item.data.payment_method { common_enums::PaymentMethod::Card => info_response .processor_information @@ -1648,7 +1651,8 @@ impl match item.response { BankOfAmericaPaymentsResponse::ClientReferenceInformation(info_response) => { let status = map_boa_attempt_status((info_response.status.clone(), true)); - let response = get_payment_response((&info_response, status, item.http_code)); + let response = get_payment_response((&info_response, status, item.http_code)) + .map_err(|err| *err); Ok(Self { status, response, @@ -1684,7 +1688,8 @@ impl match item.response { BankOfAmericaPaymentsResponse::ClientReferenceInformation(info_response) => { let status = map_boa_attempt_status((info_response.status.clone(), false)); - let response = get_payment_response((&info_response, status, item.http_code)); + let response = get_payment_response((&info_response, status, item.http_code)) + .map_err(|err| *err); Ok(Self { status, response, @@ -2244,6 +2249,8 @@ fn get_error_response( status_code, attempt_status, connector_transaction_id: Some(transaction_id.clone()), + issuer_error_code: None, + issuer_error_message: None, } } @@ -2521,6 +2528,8 @@ fn convert_to_error_response_from_error_info( status_code, attempt_status: None, connector_transaction_id: Some(error_response.id.clone()), + issuer_error_code: None, + issuer_error_message: None, } } diff --git a/crates/hyperswitch_connectors/src/connectors/billwerk.rs b/crates/hyperswitch_connectors/src/connectors/billwerk.rs index b5ddef0035..34bf83a7bd 100644 --- a/crates/hyperswitch_connectors/src/connectors/billwerk.rs +++ b/crates/hyperswitch_connectors/src/connectors/billwerk.rs @@ -154,6 +154,8 @@ impl ConnectorCommon for Billwerk { reason: Some(response.error), attempt_status: None, connector_transaction_id: None, + issuer_error_code: None, + issuer_error_message: None, }) } } diff --git a/crates/hyperswitch_connectors/src/connectors/billwerk/transformers.rs b/crates/hyperswitch_connectors/src/connectors/billwerk/transformers.rs index 9fe00bac04..e6499306d0 100644 --- a/crates/hyperswitch_connectors/src/connectors/billwerk/transformers.rs +++ b/crates/hyperswitch_connectors/src/connectors/billwerk/transformers.rs @@ -279,6 +279,8 @@ impl TryFrom ErrorResponse { @@ -177,6 +179,8 @@ impl ConnectorCommon for Bluesnap { reason: Some(error_res.error_description), attempt_status: None, connector_transaction_id: None, + issuer_error_code: None, + issuer_error_message: None, }, bluesnap::BluesnapErrors::General(error_response) => { let (error_res, attempt_status) = if res.status_code == 403 @@ -199,6 +203,8 @@ impl ConnectorCommon for Bluesnap { reason: Some(error_res), attempt_status, connector_transaction_id: None, + issuer_error_code: None, + issuer_error_message: None, } } }; diff --git a/crates/hyperswitch_connectors/src/connectors/boku.rs b/crates/hyperswitch_connectors/src/connectors/boku.rs index 6819597987..330e7b5ab4 100644 --- a/crates/hyperswitch_connectors/src/connectors/boku.rs +++ b/crates/hyperswitch_connectors/src/connectors/boku.rs @@ -163,6 +163,8 @@ impl ConnectorCommon for Boku { reason: response.reason, attempt_status: None, connector_transaction_id: None, + issuer_error_code: None, + issuer_error_message: None, }) } Err(_) => get_xml_deserialized(res, event_builder), @@ -705,6 +707,8 @@ fn get_xml_deserialized( reason: Some(response_data), attempt_status: None, connector_transaction_id: None, + issuer_error_code: None, + issuer_error_message: None, }) } } diff --git a/crates/hyperswitch_connectors/src/connectors/braintree.rs b/crates/hyperswitch_connectors/src/connectors/braintree.rs index e965e96429..67c5475915 100644 --- a/crates/hyperswitch_connectors/src/connectors/braintree.rs +++ b/crates/hyperswitch_connectors/src/connectors/braintree.rs @@ -169,6 +169,8 @@ impl ConnectorCommon for Braintree { reason: Some(response.api_error_response.message), attempt_status: None, connector_transaction_id: None, + issuer_error_code: None, + issuer_error_message: None, }) } Ok(braintree::ErrorResponses::BraintreeErrorResponse(response)) => { @@ -182,6 +184,8 @@ impl ConnectorCommon for Braintree { reason: Some(response.errors), attempt_status: None, connector_transaction_id: None, + issuer_error_code: None, + issuer_error_message: None, }) } Err(error_msg) => { diff --git a/crates/hyperswitch_connectors/src/connectors/braintree/transformers.rs b/crates/hyperswitch_connectors/src/connectors/braintree/transformers.rs index 2a5fabb778..dfde2e0a26 100644 --- a/crates/hyperswitch_connectors/src/connectors/braintree/transformers.rs +++ b/crates/hyperswitch_connectors/src/connectors/braintree/transformers.rs @@ -447,7 +447,8 @@ impl ) -> Result { match item.response { BraintreeAuthResponse::ErrorResponse(error_response) => Ok(Self { - response: build_error_response(&error_response.errors, item.http_code), + response: build_error_response(&error_response.errors, item.http_code) + .map_err(|err| *err), ..item.data }), BraintreeAuthResponse::AuthResponse(auth_response) => { @@ -461,6 +462,8 @@ impl attempt_status: None, connector_transaction_id: Some(transaction_data.id), status_code: item.http_code, + issuer_error_code: None, + issuer_error_message: None, }) } else { Ok(PaymentsResponseData::TransactionResponse { @@ -513,7 +516,7 @@ impl fn build_error_response( response: &[ErrorDetails], http_code: u16, -) -> Result { +) -> Result> { let error_messages = response .iter() .map(|error| error.message.to_string()) @@ -542,15 +545,19 @@ fn get_error_response( error_msg: Option, error_reason: Option, http_code: u16, -) -> Result { - Err(hyperswitch_domain_models::router_data::ErrorResponse { - code: error_code.unwrap_or_else(|| NO_ERROR_CODE.to_string()), - message: error_msg.unwrap_or_else(|| NO_ERROR_MESSAGE.to_string()), - reason: error_reason, - status_code: http_code, - attempt_status: None, - connector_transaction_id: None, - }) +) -> Result> { + Err(Box::new( + hyperswitch_domain_models::router_data::ErrorResponse { + code: error_code.unwrap_or_else(|| NO_ERROR_CODE.to_string()), + message: error_msg.unwrap_or_else(|| NO_ERROR_MESSAGE.to_string()), + reason: error_reason, + status_code: http_code, + attempt_status: None, + connector_transaction_id: None, + issuer_error_code: None, + issuer_error_message: None, + }, + )) } #[derive(Debug, Clone, Deserialize, Serialize, strum::Display)] @@ -624,7 +631,8 @@ impl ) -> Result { match item.response { BraintreePaymentsResponse::ErrorResponse(error_response) => Ok(Self { - response: build_error_response(&error_response.errors.clone(), item.http_code), + response: build_error_response(&error_response.errors.clone(), item.http_code) + .map_err(|err| *err), ..item.data }), BraintreePaymentsResponse::PaymentsResponse(payment_response) => { @@ -638,6 +646,8 @@ impl attempt_status: None, connector_transaction_id: Some(transaction_data.id), status_code: item.http_code, + issuer_error_code: None, + issuer_error_message: None, }) } else { Ok(PaymentsResponseData::TransactionResponse { @@ -708,7 +718,8 @@ impl ) -> Result { match item.response { BraintreeCompleteChargeResponse::ErrorResponse(error_response) => Ok(Self { - response: build_error_response(&error_response.errors.clone(), item.http_code), + response: build_error_response(&error_response.errors.clone(), item.http_code) + .map_err(|err| *err), ..item.data }), BraintreeCompleteChargeResponse::PaymentsResponse(payment_response) => { @@ -722,6 +733,8 @@ impl attempt_status: None, connector_transaction_id: Some(transaction_data.id), status_code: item.http_code, + issuer_error_code: None, + issuer_error_message: None, }) } else { Ok(PaymentsResponseData::TransactionResponse { @@ -773,7 +786,8 @@ impl ) -> Result { match item.response { BraintreeCompleteAuthResponse::ErrorResponse(error_response) => Ok(Self { - response: build_error_response(&error_response.errors, item.http_code), + response: build_error_response(&error_response.errors, item.http_code) + .map_err(|err| *err), ..item.data }), BraintreeCompleteAuthResponse::AuthResponse(auth_response) => { @@ -787,6 +801,8 @@ impl attempt_status: None, connector_transaction_id: Some(transaction_data.id), status_code: item.http_code, + issuer_error_code: None, + issuer_error_message: None, }) } else { Ok(PaymentsResponseData::TransactionResponse { @@ -962,7 +978,7 @@ impl TryFrom> Ok(Self { response: match item.response { BraintreeRefundResponse::ErrorResponse(error_response) => { - build_error_response(&error_response.errors, item.http_code) + build_error_response(&error_response.errors, item.http_code).map_err(|err| *err) } BraintreeRefundResponse::SuccessResponse(refund_data) => { let refund_data = refund_data.data.refund_transaction.refund; @@ -975,6 +991,8 @@ impl TryFrom> attempt_status: None, connector_transaction_id: Some(refund_data.id), status_code: item.http_code, + issuer_error_code: None, + issuer_error_message: None, }) } else { Ok(RefundsResponseData { @@ -1079,7 +1097,8 @@ impl TryFrom> ) -> Result { match item.response { BraintreeRSyncResponse::ErrorResponse(error_response) => Ok(Self { - response: build_error_response(&error_response.errors, item.http_code), + response: build_error_response(&error_response.errors, item.http_code) + .map_err(|err| *err), ..item.data }), BraintreeRSyncResponse::RSyncResponse(rsync_response) => { @@ -1241,6 +1260,7 @@ impl TryFrom { build_error_response(error_response.errors.as_ref(), item.http_code) + .map_err(|err| *err) } BraintreeTokenResponse::TokenResponse(token_response) => { @@ -1332,6 +1352,8 @@ impl TryFrom> attempt_status: None, connector_transaction_id: Some(transaction_data.id), status_code: item.http_code, + issuer_error_code: None, + issuer_error_message: None, }) } else { Ok(PaymentsResponseData::TransactionResponse { @@ -1352,7 +1374,8 @@ impl TryFrom> }) } BraintreeCaptureResponse::ErrorResponse(error_data) => Ok(Self { - response: build_error_response(&error_data.errors, item.http_code), + response: build_error_response(&error_data.errors, item.http_code) + .map_err(|err| *err), ..item.data }), } @@ -1417,6 +1440,7 @@ impl response: match item.response { BraintreeRevokeMandateResponse::ErrorResponse(error_response) => { build_error_response(error_response.errors.as_ref(), item.http_code) + .map_err(|err| *err) } BraintreeRevokeMandateResponse::RevokeMandateResponse(..) => { Ok(MandateRevokeResponseData { @@ -1515,7 +1539,8 @@ impl TryFrom Result { match item.response { BraintreeCancelResponse::ErrorResponse(error_response) => Ok(Self { - response: build_error_response(&error_response.errors, item.http_code), + response: build_error_response(&error_response.errors, item.http_code) + .map_err(|err| *err), ..item.data }), BraintreeCancelResponse::CancelResponse(void_response) => { @@ -1529,6 +1554,8 @@ impl TryFrom TryFrom Result { match item.response { BraintreePSyncResponse::ErrorResponse(error_response) => Ok(Self { - response: build_error_response(&error_response.errors, item.http_code), + response: build_error_response(&error_response.errors, item.http_code) + .map_err(|err| *err), ..item.data }), BraintreePSyncResponse::SuccessResponse(psync_response) => { @@ -1631,6 +1659,8 @@ impl TryFrom reason: Some(error_data.error_description), attempt_status: None, connector_transaction_id: None, + issuer_error_code: None, + issuer_error_message: None, }), ), CashtocodePaymentsResponse::CashtoCodeData(response_data) => { diff --git a/crates/hyperswitch_connectors/src/connectors/chargebee.rs b/crates/hyperswitch_connectors/src/connectors/chargebee.rs index 73eeabe435..bde9a165b2 100644 --- a/crates/hyperswitch_connectors/src/connectors/chargebee.rs +++ b/crates/hyperswitch_connectors/src/connectors/chargebee.rs @@ -144,6 +144,8 @@ impl ConnectorCommon for Chargebee { reason: response.reason, attempt_status: None, connector_transaction_id: None, + issuer_error_code: None, + issuer_error_message: None, }) } } diff --git a/crates/hyperswitch_connectors/src/connectors/checkout.rs b/crates/hyperswitch_connectors/src/connectors/checkout.rs index 6197709847..4d151c1215 100644 --- a/crates/hyperswitch_connectors/src/connectors/checkout.rs +++ b/crates/hyperswitch_connectors/src/connectors/checkout.rs @@ -179,6 +179,8 @@ impl ConnectorCommon for Checkout { .or(response.error_type), attempt_status: None, connector_transaction_id: response.request_id, + issuer_error_code: None, + issuer_error_message: None, }) } } diff --git a/crates/hyperswitch_connectors/src/connectors/checkout/transformers.rs b/crates/hyperswitch_connectors/src/connectors/checkout/transformers.rs index 4630f00b1d..d364e32750 100644 --- a/crates/hyperswitch_connectors/src/connectors/checkout/transformers.rs +++ b/crates/hyperswitch_connectors/src/connectors/checkout/transformers.rs @@ -705,6 +705,8 @@ impl TryFrom> for PaymentsAuthorize reason: item.response.response_summary, attempt_status: None, connector_transaction_id: Some(item.response.id.clone()), + issuer_error_code: None, + issuer_error_message: None, }) } else { None @@ -757,6 +759,8 @@ impl TryFrom> for PaymentsSyncR reason: item.response.response_summary, attempt_status: None, connector_transaction_id: Some(item.response.id.clone()), + issuer_error_code: None, + issuer_error_message: None, }) } else { None diff --git a/crates/hyperswitch_connectors/src/connectors/coinbase.rs b/crates/hyperswitch_connectors/src/connectors/coinbase.rs index cfdac51484..9e998abebb 100644 --- a/crates/hyperswitch_connectors/src/connectors/coinbase.rs +++ b/crates/hyperswitch_connectors/src/connectors/coinbase.rs @@ -135,6 +135,8 @@ impl ConnectorCommon for Coinbase { reason: response.error.code, attempt_status: None, connector_transaction_id: None, + issuer_error_code: None, + issuer_error_message: None, }) } } diff --git a/crates/hyperswitch_connectors/src/connectors/coingate.rs b/crates/hyperswitch_connectors/src/connectors/coingate.rs index 81bb911695..e426dcb238 100644 --- a/crates/hyperswitch_connectors/src/connectors/coingate.rs +++ b/crates/hyperswitch_connectors/src/connectors/coingate.rs @@ -142,6 +142,8 @@ impl ConnectorCommon for Coingate { reason: Some(response.reason), attempt_status: None, connector_transaction_id: None, + issuer_error_code: None, + issuer_error_message: None, }) } } diff --git a/crates/hyperswitch_connectors/src/connectors/cryptopay.rs b/crates/hyperswitch_connectors/src/connectors/cryptopay.rs index 2650d8f1e9..4c24018fcb 100644 --- a/crates/hyperswitch_connectors/src/connectors/cryptopay.rs +++ b/crates/hyperswitch_connectors/src/connectors/cryptopay.rs @@ -193,6 +193,8 @@ impl ConnectorCommon for Cryptopay { reason: response.error.reason, attempt_status: None, connector_transaction_id: None, + issuer_error_code: None, + issuer_error_message: None, }) } } diff --git a/crates/hyperswitch_connectors/src/connectors/cryptopay/transformers.rs b/crates/hyperswitch_connectors/src/connectors/cryptopay/transformers.rs index 98d3dd76cd..67a67c8878 100644 --- a/crates/hyperswitch_connectors/src/connectors/cryptopay/transformers.rs +++ b/crates/hyperswitch_connectors/src/connectors/cryptopay/transformers.rs @@ -175,6 +175,8 @@ impl status_code: item.http_code, attempt_status: None, connector_transaction_id: Some(payment_response.id.clone()), + issuer_error_code: None, + issuer_error_message: None, }) } else { let redirection_data = item diff --git a/crates/hyperswitch_connectors/src/connectors/cybersource.rs b/crates/hyperswitch_connectors/src/connectors/cybersource.rs index 812d0391de..8b5e748906 100644 --- a/crates/hyperswitch_connectors/src/connectors/cybersource.rs +++ b/crates/hyperswitch_connectors/src/connectors/cybersource.rs @@ -239,6 +239,8 @@ impl ConnectorCommon for Cybersource { reason, attempt_status: None, connector_transaction_id: None, + issuer_error_code: None, + issuer_error_message: None, }) } Ok(transformers::CybersourceErrorResponse::AuthenticationError(response)) => { @@ -251,6 +253,8 @@ impl ConnectorCommon for Cybersource { reason: Some(response.response.rmsg), attempt_status: None, connector_transaction_id: None, + issuer_error_code: None, + issuer_error_message: None, }) } Ok(transformers::CybersourceErrorResponse::NotAvailableError(response)) => { @@ -275,6 +279,8 @@ impl ConnectorCommon for Cybersource { reason: Some(error_response), attempt_status: None, connector_transaction_id: None, + issuer_error_code: None, + issuer_error_message: None, }) } Err(error_msg) => { @@ -506,6 +512,8 @@ impl ConnectorIntegration fo .unwrap_or(hyperswitch_interfaces::consts::NO_ERROR_MESSAGE.to_string()), attempt_status: None, connector_transaction_id: None, + issuer_error_code: None, + issuer_error_message: None, }) } } @@ -1058,6 +1070,8 @@ impl ConnectorIntegration for Cyber .unwrap_or(hyperswitch_interfaces::consts::NO_ERROR_MESSAGE.to_string()), attempt_status, connector_transaction_id: None, + issuer_error_code: None, + issuer_error_message: None, }) } } @@ -1294,6 +1310,8 @@ impl ConnectorIntegration for Cy .unwrap_or(hyperswitch_interfaces::consts::NO_ERROR_MESSAGE.to_string()), attempt_status: None, connector_transaction_id: None, + issuer_error_code: None, + issuer_error_message: None, }) } } diff --git a/crates/hyperswitch_connectors/src/connectors/cybersource/transformers.rs b/crates/hyperswitch_connectors/src/connectors/cybersource/transformers.rs index ea5d9b25f8..2a0ebdc9f7 100644 --- a/crates/hyperswitch_connectors/src/connectors/cybersource/transformers.rs +++ b/crates/hyperswitch_connectors/src/connectors/cybersource/transformers.rs @@ -2679,10 +2679,10 @@ fn get_error_response_if_failure( fn get_payment_response( (info_response, status, http_code): (&CybersourcePaymentsResponse, enums::AttemptStatus, u16), -) -> Result { +) -> Result> { let error_response = get_error_response_if_failure((info_response, status, http_code)); match error_response { - Some(error) => Err(error), + Some(error) => Err(Box::new(error)), None => { let incremental_authorization_allowed = Some(status == enums::AttemptStatus::Authorized); @@ -2747,7 +2747,8 @@ impl .unwrap_or(CybersourcePaymentStatus::StatusNotReceived), item.data.request.is_auto_capture()?, ); - let response = get_payment_response((&item.response, status, item.http_code)); + let response = + get_payment_response((&item.response, status, item.http_code)).map_err(|err| *err); let connector_response = item .response .processor_information @@ -2845,6 +2846,8 @@ impl status_code: item.http_code, attempt_status: None, connector_transaction_id: Some(error_response.id.clone()), + issuer_error_code: None, + issuer_error_message: None, }), status: enums::AttemptStatus::AuthenticationFailed, ..item.data @@ -3255,6 +3258,8 @@ impl status_code: item.http_code, attempt_status: None, connector_transaction_id: Some(error_response.id.clone()), + issuer_error_code: None, + issuer_error_message: None, }); Ok(Self { response, @@ -3292,7 +3297,8 @@ impl .unwrap_or(CybersourcePaymentStatus::StatusNotReceived), item.data.request.is_auto_capture()?, ); - let response = get_payment_response((&item.response, status, item.http_code)); + let response = + get_payment_response((&item.response, status, item.http_code)).map_err(|err| *err); let connector_response = item .response .processor_information @@ -3348,7 +3354,8 @@ impl .unwrap_or(CybersourcePaymentStatus::StatusNotReceived), true, ); - let response = get_payment_response((&item.response, status, item.http_code)); + let response = + get_payment_response((&item.response, status, item.http_code)).map_err(|err| *err); Ok(Self { status, response, @@ -3383,7 +3390,8 @@ impl .unwrap_or(CybersourcePaymentStatus::StatusNotReceived), false, ); - let response = get_payment_response((&item.response, status, item.http_code)); + let response = + get_payment_response((&item.response, status, item.http_code)).map_err(|err| *err); Ok(Self { status, response, @@ -4131,6 +4139,8 @@ pub fn get_error_response( status_code, attempt_status, connector_transaction_id: Some(transaction_id), + issuer_error_code: None, + issuer_error_message: None, } } diff --git a/crates/hyperswitch_connectors/src/connectors/datatrans.rs b/crates/hyperswitch_connectors/src/connectors/datatrans.rs index f06d7be869..0f82ae28d8 100644 --- a/crates/hyperswitch_connectors/src/connectors/datatrans.rs +++ b/crates/hyperswitch_connectors/src/connectors/datatrans.rs @@ -153,6 +153,8 @@ impl ConnectorCommon for Datatrans { reason: Some(response), attempt_status: None, connector_transaction_id: None, + issuer_error_code: None, + issuer_error_message: None, }) } else { let response: datatrans::DatatransErrorResponse = res @@ -168,6 +170,8 @@ impl ConnectorCommon for Datatrans { reason: Some(response.error.message.clone()), attempt_status: None, connector_transaction_id: None, + issuer_error_code: None, + issuer_error_message: None, }) } } diff --git a/crates/hyperswitch_connectors/src/connectors/datatrans/transformers.rs b/crates/hyperswitch_connectors/src/connectors/datatrans/transformers.rs index 9297f783d3..8299b0387a 100644 --- a/crates/hyperswitch_connectors/src/connectors/datatrans/transformers.rs +++ b/crates/hyperswitch_connectors/src/connectors/datatrans/transformers.rs @@ -560,6 +560,8 @@ impl attempt_status: None, connector_transaction_id: None, status_code: item.http_code, + issuer_error_code: None, + issuer_error_message: None, }), DatatransResponse::TransactionResponse(response) => { Ok(PaymentsResponseData::TransactionResponse { @@ -629,6 +631,8 @@ impl attempt_status: None, connector_transaction_id: None, status_code: item.http_code, + issuer_error_code: None, + issuer_error_message: None, }), DatatransResponse::TransactionResponse(response) => { Ok(PaymentsResponseData::TransactionResponse { @@ -704,6 +708,8 @@ impl TryFrom> attempt_status: None, connector_transaction_id: None, status_code: item.http_code, + issuer_error_code: None, + issuer_error_message: None, }), ..item.data }), @@ -733,6 +739,8 @@ impl TryFrom> attempt_status: None, connector_transaction_id: None, status_code: item.http_code, + issuer_error_code: None, + issuer_error_message: None, }), DatatransSyncResponse::Response(response) => Ok(RefundsResponseData { connector_refund_id: response.transaction_id.to_string(), @@ -762,6 +770,8 @@ impl TryFrom> attempt_status: None, connector_transaction_id: None, status_code: item.http_code, + issuer_error_code: None, + issuer_error_message: None, }); Ok(Self { response, @@ -785,6 +795,8 @@ impl TryFrom> status_code: item.http_code, attempt_status: None, connector_transaction_id: None, + issuer_error_code: None, + issuer_error_message: None, }) } else { let mandate_reference = sync_response diff --git a/crates/hyperswitch_connectors/src/connectors/deutschebank.rs b/crates/hyperswitch_connectors/src/connectors/deutschebank.rs index b481c3e808..0972eb63b9 100644 --- a/crates/hyperswitch_connectors/src/connectors/deutschebank.rs +++ b/crates/hyperswitch_connectors/src/connectors/deutschebank.rs @@ -174,6 +174,8 @@ impl ConnectorCommon for Deutschebank { reason: Some(response.message), attempt_status: None, connector_transaction_id: None, + issuer_error_code: None, + issuer_error_message: None, }) } } @@ -304,6 +306,8 @@ impl ConnectorIntegration reason: Some(response.message), attempt_status: None, connector_transaction_id: None, + issuer_error_code: None, + issuer_error_message: None, }), deutschebank::DeutschebankError::AccessTokenErrorResponse(response) => { Ok(ErrorResponse { @@ -313,6 +317,8 @@ impl ConnectorIntegration reason: Some(response.description), attempt_status: None, connector_transaction_id: None, + issuer_error_code: None, + issuer_error_message: None, }) } } diff --git a/crates/hyperswitch_connectors/src/connectors/deutschebank/transformers.rs b/crates/hyperswitch_connectors/src/connectors/deutschebank/transformers.rs index bf8a7fc952..bee5d8662e 100644 --- a/crates/hyperswitch_connectors/src/connectors/deutschebank/transformers.rs +++ b/crates/hyperswitch_connectors/src/connectors/deutschebank/transformers.rs @@ -444,7 +444,8 @@ impl reason: Some("METHOD_REQUIRED Flow is not currently supported for deutschebank 3ds payments".to_owned()), status_code: item.http_code, attempt_status: None, - connector_transaction_id: None, + connector_transaction_id: None,issuer_error_code: None, + issuer_error_message: None, }), ..item.data }), @@ -514,6 +515,8 @@ fn get_error_response(error_code: String, error_reason: String, status_code: u16 status_code, attempt_status: None, connector_transaction_id: None, + issuer_error_code: None, + issuer_error_message: None, } } diff --git a/crates/hyperswitch_connectors/src/connectors/digitalvirgo.rs b/crates/hyperswitch_connectors/src/connectors/digitalvirgo.rs index a58a086f5e..55294d6a58 100644 --- a/crates/hyperswitch_connectors/src/connectors/digitalvirgo.rs +++ b/crates/hyperswitch_connectors/src/connectors/digitalvirgo.rs @@ -161,6 +161,8 @@ impl ConnectorCommon for Digitalvirgo { reason: response.description, attempt_status: None, connector_transaction_id: None, + issuer_error_code: None, + issuer_error_message: None, }) } } diff --git a/crates/hyperswitch_connectors/src/connectors/dlocal.rs b/crates/hyperswitch_connectors/src/connectors/dlocal.rs index 60813a4ea0..965575bbe1 100644 --- a/crates/hyperswitch_connectors/src/connectors/dlocal.rs +++ b/crates/hyperswitch_connectors/src/connectors/dlocal.rs @@ -152,6 +152,8 @@ impl ConnectorCommon for Dlocal { reason: response.param, attempt_status: None, connector_transaction_id: None, + issuer_error_code: None, + issuer_error_message: None, }) } } diff --git a/crates/hyperswitch_connectors/src/connectors/elavon/transformers.rs b/crates/hyperswitch_connectors/src/connectors/elavon/transformers.rs index a11c608d69..861ff22e60 100644 --- a/crates/hyperswitch_connectors/src/connectors/elavon/transformers.rs +++ b/crates/hyperswitch_connectors/src/connectors/elavon/transformers.rs @@ -214,6 +214,8 @@ impl attempt_status: None, connector_transaction_id: None, status_code: item.http_code, + issuer_error_code: None, + issuer_error_message: None, }), ElavonPaymentsResponse::Success(response) => { if status == enums::AttemptStatus::Failure { @@ -224,6 +226,8 @@ impl attempt_status: None, connector_transaction_id: Some(response.ssl_txn_id.clone()), status_code: item.http_code, + issuer_error_code: None, + issuer_error_message: None, }) } else { Ok(PaymentsResponseData::TransactionResponse { @@ -428,6 +432,8 @@ impl TryFrom> attempt_status: None, connector_transaction_id: None, status_code: item.http_code, + issuer_error_code: None, + issuer_error_message: None, }), ElavonPaymentsResponse::Success(response) => { if status == enums::AttemptStatus::Failure { @@ -438,6 +444,8 @@ impl TryFrom> attempt_status: None, connector_transaction_id: None, status_code: item.http_code, + issuer_error_code: None, + issuer_error_message: None, }) } else { Ok(PaymentsResponseData::TransactionResponse { @@ -478,6 +486,8 @@ impl TryFrom> attempt_status: None, connector_transaction_id: None, status_code: item.http_code, + issuer_error_code: None, + issuer_error_message: None, }), ElavonPaymentsResponse::Success(response) => { if status == enums::RefundStatus::Failure { @@ -488,6 +498,8 @@ impl TryFrom> attempt_status: None, connector_transaction_id: None, status_code: item.http_code, + issuer_error_code: None, + issuer_error_message: None, }) } else { Ok(RefundsResponseData { diff --git a/crates/hyperswitch_connectors/src/connectors/fiserv.rs b/crates/hyperswitch_connectors/src/connectors/fiserv.rs index 50eebb9951..14374a8e18 100644 --- a/crates/hyperswitch_connectors/src/connectors/fiserv.rs +++ b/crates/hyperswitch_connectors/src/connectors/fiserv.rs @@ -178,6 +178,8 @@ impl ConnectorCommon for Fiserv { status_code: res.status_code, attempt_status: None, connector_transaction_id: None, + issuer_error_code: None, + issuer_error_message: None, }) }) .unwrap_or(ErrorResponse { @@ -187,6 +189,8 @@ impl ConnectorCommon for Fiserv { status_code: res.status_code, attempt_status: None, connector_transaction_id: None, + issuer_error_code: None, + issuer_error_message: None, })) } } diff --git a/crates/hyperswitch_connectors/src/connectors/fiservemea.rs b/crates/hyperswitch_connectors/src/connectors/fiservemea.rs index b124949c07..d129ed6955 100644 --- a/crates/hyperswitch_connectors/src/connectors/fiservemea.rs +++ b/crates/hyperswitch_connectors/src/connectors/fiservemea.rs @@ -236,6 +236,8 @@ impl ConnectorCommon for Fiservemea { }, attempt_status: None, connector_transaction_id: None, + issuer_error_code: None, + issuer_error_message: None, }) } None => Ok(ErrorResponse { @@ -248,6 +250,8 @@ impl ConnectorCommon for Fiservemea { reason: response.response_type, attempt_status: None, connector_transaction_id: None, + issuer_error_code: None, + issuer_error_message: None, }), } } diff --git a/crates/hyperswitch_connectors/src/connectors/fiuu.rs b/crates/hyperswitch_connectors/src/connectors/fiuu.rs index 7e9bb8c120..4069d6af8f 100644 --- a/crates/hyperswitch_connectors/src/connectors/fiuu.rs +++ b/crates/hyperswitch_connectors/src/connectors/fiuu.rs @@ -235,6 +235,8 @@ impl ConnectorCommon for Fiuu { reason: Some(response.error_desc.clone()), attempt_status: None, connector_transaction_id: None, + issuer_error_code: None, + issuer_error_message: None, }) } } diff --git a/crates/hyperswitch_connectors/src/connectors/fiuu/transformers.rs b/crates/hyperswitch_connectors/src/connectors/fiuu/transformers.rs index 8b1296a015..181574b54b 100644 --- a/crates/hyperswitch_connectors/src/connectors/fiuu/transformers.rs +++ b/crates/hyperswitch_connectors/src/connectors/fiuu/transformers.rs @@ -828,6 +828,8 @@ impl status_code: item.http_code, attempt_status: None, connector_transaction_id: None, + issuer_error_code: None, + issuer_error_message: None, }), ..item.data }), @@ -898,6 +900,8 @@ impl status_code: item.http_code, attempt_status: None, connector_transaction_id: Some(data.txn_id), + issuer_error_code: None, + issuer_error_message: None, }) } else { Ok(PaymentsResponseData::TransactionResponse { @@ -944,6 +948,8 @@ impl status_code: item.http_code, attempt_status: None, connector_transaction_id: recurring_response.tran_id.clone(), + issuer_error_code: None, + issuer_error_message: None, }) } else { Ok(PaymentsResponseData::TransactionResponse { @@ -1077,6 +1083,8 @@ impl TryFrom> status_code: item.http_code, attempt_status: None, connector_transaction_id: None, + issuer_error_code: None, + issuer_error_message: None, }), ..item.data }), @@ -1101,6 +1109,8 @@ impl TryFrom> status_code: item.http_code, attempt_status: None, connector_transaction_id: Some(refund_data.refund_id.to_string()), + issuer_error_code: None, + issuer_error_message: None, }), ..item.data }) @@ -1240,6 +1250,8 @@ impl TryFrom> for PaymentsSy reason: response.error_desc, attempt_status: Some(enums::AttemptStatus::Failure), connector_transaction_id: Some(txn_id.clone()), + issuer_error_code: None, + issuer_error_message: None, }) } else { None @@ -1305,6 +1317,8 @@ impl TryFrom> for PaymentsSy reason: response.error_desc.clone(), attempt_status: Some(enums::AttemptStatus::Failure), connector_transaction_id: Some(txn_id.clone()), + issuer_error_code: None, + issuer_error_message: None, }) } else { None @@ -1474,6 +1488,8 @@ impl TryFrom> ), attempt_status: None, connector_transaction_id: Some(item.response.tran_id.clone()), + issuer_error_code: None, + issuer_error_message: None, }) } else { None @@ -1587,6 +1603,8 @@ impl TryFrom> ), attempt_status: None, connector_transaction_id: Some(item.response.tran_id.clone()), + issuer_error_code: None, + issuer_error_message: None, }) } else { None @@ -1682,6 +1700,8 @@ impl TryFrom> status_code: item.http_code, attempt_status: None, connector_transaction_id: None, + issuer_error_code: None, + issuer_error_message: None, }), ..item.data }), diff --git a/crates/hyperswitch_connectors/src/connectors/forte.rs b/crates/hyperswitch_connectors/src/connectors/forte.rs index 1068922faa..2356fae53c 100644 --- a/crates/hyperswitch_connectors/src/connectors/forte.rs +++ b/crates/hyperswitch_connectors/src/connectors/forte.rs @@ -165,6 +165,8 @@ impl ConnectorCommon for Forte { reason: None, attempt_status: None, connector_transaction_id: None, + issuer_error_code: None, + issuer_error_message: None, }) } } diff --git a/crates/hyperswitch_connectors/src/connectors/getnet.rs b/crates/hyperswitch_connectors/src/connectors/getnet.rs index 263b1ad5b4..180a1b683d 100644 --- a/crates/hyperswitch_connectors/src/connectors/getnet.rs +++ b/crates/hyperswitch_connectors/src/connectors/getnet.rs @@ -155,6 +155,8 @@ impl ConnectorCommon for Getnet { reason: response.reason, attempt_status: None, connector_transaction_id: None, + issuer_error_code: None, + issuer_error_message: None, }) } } diff --git a/crates/hyperswitch_connectors/src/connectors/globalpay.rs b/crates/hyperswitch_connectors/src/connectors/globalpay.rs index 6d233bcfc3..641e9fd5f3 100644 --- a/crates/hyperswitch_connectors/src/connectors/globalpay.rs +++ b/crates/hyperswitch_connectors/src/connectors/globalpay.rs @@ -148,6 +148,8 @@ impl ConnectorCommon for Globalpay { reason: None, attempt_status: None, connector_transaction_id: None, + issuer_error_code: None, + issuer_error_message: None, }) } } @@ -376,6 +378,8 @@ impl ConnectorIntegration reason: None, attempt_status: None, connector_transaction_id: None, + issuer_error_code: None, + issuer_error_message: None, }) } } diff --git a/crates/hyperswitch_connectors/src/connectors/globalpay/transformers.rs b/crates/hyperswitch_connectors/src/connectors/globalpay/transformers.rs index 27ff359a7a..57cf5d0f28 100644 --- a/crates/hyperswitch_connectors/src/connectors/globalpay/transformers.rs +++ b/crates/hyperswitch_connectors/src/connectors/globalpay/transformers.rs @@ -268,7 +268,7 @@ fn get_payment_response( status: common_enums::AttemptStatus, response: GlobalpayPaymentsResponse, redirection_data: Option, -) -> Result { +) -> Result> { let mandate_reference = response.payment_method.as_ref().and_then(|pm| { pm.card .as_ref() @@ -281,13 +281,13 @@ fn get_payment_response( }) }); match status { - common_enums::AttemptStatus::Failure => Err(ErrorResponse { + common_enums::AttemptStatus::Failure => Err(Box::new(ErrorResponse { message: response .payment_method .and_then(|pm| pm.message) .unwrap_or_else(|| NO_ERROR_MESSAGE.to_string()), ..Default::default() - }), + })), _ => Ok(PaymentsResponseData::TransactionResponse { resource_id: ResponseId::ConnectorTransactionId(response.id), redirection_data: Box::new(redirection_data), @@ -327,7 +327,8 @@ impl TryFrom> for PaymentsSync attempt_status: None, connector_transaction_id: None, status_code: item.http_code, + issuer_error_code: None, + issuer_error_message: None, }); Ok(Self { status: enums::AttemptStatus::Failure, @@ -606,6 +608,8 @@ impl TryFrom> for PaymentsSync status_code: item.http_code, attempt_status: None, connector_transaction_id: None, + issuer_error_code: None, + issuer_error_message: None, }) } else { Ok(PaymentsResponseData::TransactionResponse { diff --git a/crates/hyperswitch_connectors/src/connectors/iatapay.rs b/crates/hyperswitch_connectors/src/connectors/iatapay.rs index f9ab2f3159..b5ea844fb2 100644 --- a/crates/hyperswitch_connectors/src/connectors/iatapay.rs +++ b/crates/hyperswitch_connectors/src/connectors/iatapay.rs @@ -155,6 +155,8 @@ impl ConnectorCommon for Iatapay { reason: Some(CONNECTOR_UNAUTHORIZED_ERROR.to_string()), attempt_status: None, connector_transaction_id: None, + issuer_error_code: None, + issuer_error_message: None, } } else { let response: iatapay::IatapayErrorResponse = res @@ -171,6 +173,8 @@ impl ConnectorCommon for Iatapay { reason: response.reason, attempt_status: None, connector_transaction_id: None, + issuer_error_code: None, + issuer_error_message: None, } }; Ok(response_error_message) @@ -288,6 +292,8 @@ impl ConnectorIntegration reason: None, attempt_status: None, connector_transaction_id: None, + issuer_error_code: None, + issuer_error_message: None, }) } } diff --git a/crates/hyperswitch_connectors/src/connectors/iatapay/transformers.rs b/crates/hyperswitch_connectors/src/connectors/iatapay/transformers.rs index e41057fb8e..0c5c9fc678 100644 --- a/crates/hyperswitch_connectors/src/connectors/iatapay/transformers.rs +++ b/crates/hyperswitch_connectors/src/connectors/iatapay/transformers.rs @@ -343,6 +343,8 @@ fn get_iatpay_response( status_code, attempt_status: Some(status), connector_transaction_id: response.iata_payment_id.clone(), + issuer_error_code: None, + issuer_error_message: None, }) } else { None @@ -527,6 +529,8 @@ impl TryFrom> for RefundsRout status_code: item.http_code, attempt_status: None, connector_transaction_id: Some(item.response.iata_refund_id.clone()), + issuer_error_code: None, + issuer_error_message: None, }) } else { Ok(RefundsResponseData { @@ -563,6 +567,8 @@ impl TryFrom> for RefundsRouter status_code: item.http_code, attempt_status: None, connector_transaction_id: Some(item.response.iata_refund_id.clone()), + issuer_error_code: None, + issuer_error_message: None, }) } else { Ok(RefundsResponseData { diff --git a/crates/hyperswitch_connectors/src/connectors/inespay.rs b/crates/hyperswitch_connectors/src/connectors/inespay.rs index 41ae798ade..e0bd27d47b 100644 --- a/crates/hyperswitch_connectors/src/connectors/inespay.rs +++ b/crates/hyperswitch_connectors/src/connectors/inespay.rs @@ -151,6 +151,8 @@ impl ConnectorCommon for Inespay { reason: None, attempt_status: None, connector_transaction_id: None, + issuer_error_code: None, + issuer_error_message: None, }) } } diff --git a/crates/hyperswitch_connectors/src/connectors/inespay/transformers.rs b/crates/hyperswitch_connectors/src/connectors/inespay/transformers.rs index 3922929892..508e91438e 100644 --- a/crates/hyperswitch_connectors/src/connectors/inespay/transformers.rs +++ b/crates/hyperswitch_connectors/src/connectors/inespay/transformers.rs @@ -142,6 +142,8 @@ impl TryFrom TryFrom> attempt_status: None, connector_transaction_id: None, status_code: item.http_code, + issuer_error_code: None, + issuer_error_message: None, }), ..item.data }), @@ -403,6 +409,8 @@ impl TryFrom> for Refunds attempt_status: None, connector_transaction_id: None, status_code: item.http_code, + issuer_error_code: None, + issuer_error_message: None, }), }; Ok(Self { diff --git a/crates/hyperswitch_connectors/src/connectors/itaubank.rs b/crates/hyperswitch_connectors/src/connectors/itaubank.rs index 34956ace64..e31f86b038 100644 --- a/crates/hyperswitch_connectors/src/connectors/itaubank.rs +++ b/crates/hyperswitch_connectors/src/connectors/itaubank.rs @@ -176,6 +176,8 @@ impl ConnectorCommon for Itaubank { reason, attempt_status: None, connector_transaction_id: None, + issuer_error_code: None, + issuer_error_message: None, }) } } @@ -296,6 +298,8 @@ impl ConnectorIntegration reason: response.detail.or(response.user_message), attempt_status: None, connector_transaction_id: None, + issuer_error_code: None, + issuer_error_message: None, }) } } diff --git a/crates/hyperswitch_connectors/src/connectors/jpmorgan.rs b/crates/hyperswitch_connectors/src/connectors/jpmorgan.rs index 9d6037877f..68529f725a 100644 --- a/crates/hyperswitch_connectors/src/connectors/jpmorgan.rs +++ b/crates/hyperswitch_connectors/src/connectors/jpmorgan.rs @@ -167,6 +167,8 @@ impl ConnectorCommon for Jpmorgan { reason: Some(response_message), attempt_status: None, connector_transaction_id: None, + issuer_error_code: None, + issuer_error_message: None, }) } } diff --git a/crates/hyperswitch_connectors/src/connectors/juspaythreedsserver.rs b/crates/hyperswitch_connectors/src/connectors/juspaythreedsserver.rs index cbe7881c53..6dd867421a 100644 --- a/crates/hyperswitch_connectors/src/connectors/juspaythreedsserver.rs +++ b/crates/hyperswitch_connectors/src/connectors/juspaythreedsserver.rs @@ -187,6 +187,8 @@ impl ConnectorCommon for Juspaythreedsserver { reason: response.reason, attempt_status: None, connector_transaction_id: None, + issuer_error_code: None, + issuer_error_message: None, }) } } diff --git a/crates/hyperswitch_connectors/src/connectors/klarna.rs b/crates/hyperswitch_connectors/src/connectors/klarna.rs index 86ad19d7dc..50a830fdba 100644 --- a/crates/hyperswitch_connectors/src/connectors/klarna.rs +++ b/crates/hyperswitch_connectors/src/connectors/klarna.rs @@ -126,6 +126,8 @@ impl ConnectorCommon for Klarna { reason, attempt_status: None, connector_transaction_id: None, + issuer_error_code: None, + issuer_error_message: None, }) } } diff --git a/crates/hyperswitch_connectors/src/connectors/mifinity.rs b/crates/hyperswitch_connectors/src/connectors/mifinity.rs index 3b597597e3..eaaa94b429 100644 --- a/crates/hyperswitch_connectors/src/connectors/mifinity.rs +++ b/crates/hyperswitch_connectors/src/connectors/mifinity.rs @@ -154,6 +154,8 @@ impl ConnectorCommon for Mifinity { reason: Some(CONNECTOR_UNAUTHORIZED_ERROR.to_string()), attempt_status: None, connector_transaction_id: None, + issuer_error_code: None, + issuer_error_message: None, }) } else { let response: Result< @@ -189,6 +191,8 @@ impl ConnectorCommon for Mifinity { ), attempt_status: None, connector_transaction_id: None, + issuer_error_code: None, + issuer_error_message: None, }) } diff --git a/crates/hyperswitch_connectors/src/connectors/mollie.rs b/crates/hyperswitch_connectors/src/connectors/mollie.rs index 325c031c33..b043dbdd8c 100644 --- a/crates/hyperswitch_connectors/src/connectors/mollie.rs +++ b/crates/hyperswitch_connectors/src/connectors/mollie.rs @@ -135,6 +135,8 @@ impl ConnectorCommon for Mollie { reason: response.field, attempt_status: None, connector_transaction_id: None, + issuer_error_code: None, + issuer_error_message: None, }) } } diff --git a/crates/hyperswitch_connectors/src/connectors/moneris.rs b/crates/hyperswitch_connectors/src/connectors/moneris.rs index c8f542c1ba..3562a2e838 100644 --- a/crates/hyperswitch_connectors/src/connectors/moneris.rs +++ b/crates/hyperswitch_connectors/src/connectors/moneris.rs @@ -174,6 +174,8 @@ impl ConnectorCommon for Moneris { reason: Some(reason), attempt_status: None, connector_transaction_id: None, + issuer_error_code: None, + issuer_error_message: None, }) } } @@ -298,6 +300,8 @@ impl ConnectorIntegration reason: response.error_description, attempt_status: None, connector_transaction_id: None, + issuer_error_code: None, + issuer_error_message: None, }) } } diff --git a/crates/hyperswitch_connectors/src/connectors/multisafepay/transformers.rs b/crates/hyperswitch_connectors/src/connectors/multisafepay/transformers.rs index 3e632e048a..e11ac59e75 100644 --- a/crates/hyperswitch_connectors/src/connectors/multisafepay/transformers.rs +++ b/crates/hyperswitch_connectors/src/connectors/multisafepay/transformers.rs @@ -1045,6 +1045,8 @@ pub fn populate_error_reason( status_code: http_code, attempt_status, connector_transaction_id, + issuer_error_code: None, + issuer_error_message: None, } } // REFUND : @@ -1150,6 +1152,8 @@ impl TryFrom> status_code: item.http_code, attempt_status, connector_transaction_id: None, + issuer_error_code: None, + issuer_error_message: None, }), ..item.data }) diff --git a/crates/hyperswitch_connectors/src/connectors/nexinets.rs b/crates/hyperswitch_connectors/src/connectors/nexinets.rs index f93eef6572..69a8543286 100644 --- a/crates/hyperswitch_connectors/src/connectors/nexinets.rs +++ b/crates/hyperswitch_connectors/src/connectors/nexinets.rs @@ -162,6 +162,8 @@ impl ConnectorCommon for Nexinets { reason: Some(connector_reason), attempt_status: None, connector_transaction_id: None, + issuer_error_code: None, + issuer_error_message: None, }) } } diff --git a/crates/hyperswitch_connectors/src/connectors/nexixpay.rs b/crates/hyperswitch_connectors/src/connectors/nexixpay.rs index 8a9c804cbf..264bca6b5a 100644 --- a/crates/hyperswitch_connectors/src/connectors/nexixpay.rs +++ b/crates/hyperswitch_connectors/src/connectors/nexixpay.rs @@ -203,6 +203,8 @@ impl ConnectorCommon for Nexixpay { reason: concatenated_descriptions, attempt_status: None, connector_transaction_id: None, + issuer_error_code: None, + issuer_error_message: None, }) } } diff --git a/crates/hyperswitch_connectors/src/connectors/nomupay.rs b/crates/hyperswitch_connectors/src/connectors/nomupay.rs index a6a5b0357e..075b955be4 100644 --- a/crates/hyperswitch_connectors/src/connectors/nomupay.rs +++ b/crates/hyperswitch_connectors/src/connectors/nomupay.rs @@ -285,6 +285,8 @@ impl ConnectorCommon for Nomupay { reason: None, attempt_status: None, connector_transaction_id: None, + issuer_error_code: None, + issuer_error_message: None, }), (None, None, Some(nomupay_inner_error), _, _) => { match ( @@ -298,6 +300,8 @@ impl ConnectorCommon for Nomupay { reason: None, attempt_status: None, connector_transaction_id: None, + issuer_error_code: None, + issuer_error_message: None, }), (_, Some(validation_errors)) => Ok(ErrorResponse { status_code: res.status_code, @@ -314,6 +318,8 @@ impl ConnectorCommon for Nomupay { ), attempt_status: None, connector_transaction_id: None, + issuer_error_code: None, + issuer_error_message: None, }), (None, None) => Ok(ErrorResponse { status_code: res.status_code, @@ -322,6 +328,8 @@ impl ConnectorCommon for Nomupay { reason: None, attempt_status: None, connector_transaction_id: None, + issuer_error_code: None, + issuer_error_message: None, }), } } @@ -335,6 +343,8 @@ impl ConnectorCommon for Nomupay { reason: None, attempt_status: None, connector_transaction_id: None, + issuer_error_code: None, + issuer_error_message: None, }), _ => Ok(ErrorResponse { status_code: res.status_code, @@ -343,6 +353,8 @@ impl ConnectorCommon for Nomupay { reason: None, attempt_status: None, connector_transaction_id: None, + issuer_error_code: None, + issuer_error_message: None, }), } } diff --git a/crates/hyperswitch_connectors/src/connectors/noon.rs b/crates/hyperswitch_connectors/src/connectors/noon.rs index c4f2eef275..3f3de60006 100644 --- a/crates/hyperswitch_connectors/src/connectors/noon.rs +++ b/crates/hyperswitch_connectors/src/connectors/noon.rs @@ -178,6 +178,8 @@ impl ConnectorCommon for Noon { reason: Some(noon_error_response.message), attempt_status, connector_transaction_id: None, + issuer_error_code: None, + issuer_error_message: None, }) } Err(error_message) => { diff --git a/crates/hyperswitch_connectors/src/connectors/noon/transformers.rs b/crates/hyperswitch_connectors/src/connectors/noon/transformers.rs index b2128b990c..81dc018635 100644 --- a/crates/hyperswitch_connectors/src/connectors/noon/transformers.rs +++ b/crates/hyperswitch_connectors/src/connectors/noon/transformers.rs @@ -596,6 +596,8 @@ impl TryFrom { let connector_response_reference_id = @@ -826,6 +828,8 @@ impl TryFrom> for RefundsRout reason: Some(response.message.clone()), attempt_status: None, connector_transaction_id: Some(response.result.transaction.id.clone()), + issuer_error_code: None, + issuer_error_message: None, }) } else { Ok(RefundsResponseData { @@ -892,6 +896,8 @@ impl TryFrom> for RefundsRo reason: Some(response.message.clone()), attempt_status: None, connector_transaction_id: Some(noon_transaction.id.clone()), + issuer_error_code: None, + issuer_error_message: None, }) } else { Ok(RefundsResponseData { diff --git a/crates/hyperswitch_connectors/src/connectors/novalnet.rs b/crates/hyperswitch_connectors/src/connectors/novalnet.rs index 0a47c8ccfb..a6f2e2fc64 100644 --- a/crates/hyperswitch_connectors/src/connectors/novalnet.rs +++ b/crates/hyperswitch_connectors/src/connectors/novalnet.rs @@ -153,6 +153,8 @@ impl ConnectorCommon for Novalnet { reason: response.reason, attempt_status: None, connector_transaction_id: None, + issuer_error_code: None, + issuer_error_message: None, }) } } diff --git a/crates/hyperswitch_connectors/src/connectors/novalnet/transformers.rs b/crates/hyperswitch_connectors/src/connectors/novalnet/transformers.rs index 44f84bf475..607acb37fb 100644 --- a/crates/hyperswitch_connectors/src/connectors/novalnet/transformers.rs +++ b/crates/hyperswitch_connectors/src/connectors/novalnet/transformers.rs @@ -589,6 +589,8 @@ pub fn get_error_response(result: ResultData, status_code: u16) -> ErrorResponse status_code, attempt_status: None, connector_transaction_id: None, + issuer_error_code: None, + issuer_error_message: None, } } diff --git a/crates/hyperswitch_connectors/src/connectors/nuvei/transformers.rs b/crates/hyperswitch_connectors/src/connectors/nuvei/transformers.rs index 0bfd3af7e9..cbc4a244d8 100644 --- a/crates/hyperswitch_connectors/src/connectors/nuvei/transformers.rs +++ b/crates/hyperswitch_connectors/src/connectors/nuvei/transformers.rs @@ -1543,17 +1543,14 @@ fn build_error_response( http_code: u16, ) -> Option> { match response.status { - NuveiPaymentStatus::Error => Some(get_error_response( - response.err_code, - &response.reason, - http_code, - )), + NuveiPaymentStatus::Error => Some( + get_error_response(response.err_code, &response.reason, http_code).map_err(|err| *err), + ), _ => { - let err = Some(get_error_response( - response.gw_error_code, - &response.gw_error_reason, - http_code, - )); + let err = Some( + get_error_response(response.gw_error_code, &response.gw_error_reason, http_code) + .map_err(|err| *err), + ); match response.transaction_status { Some(NuveiTransactionStatus::Error) | Some(NuveiTransactionStatus::Declined) => err, _ => match response @@ -1709,7 +1706,8 @@ impl TryFrom> item.response .transaction_id .ok_or(errors::ConnectorError::MissingConnectorTransactionID)?, - ), + ) + .map_err(|err| *err), ..item.data }) } @@ -1729,7 +1727,8 @@ impl TryFrom> item.response .transaction_id .ok_or(errors::ConnectorError::MissingConnectorTransactionID)?, - ), + ) + .map_err(|err| *err), ..item.data }) } @@ -1783,7 +1782,7 @@ fn get_refund_response( response: NuveiPaymentsResponse, http_code: u16, txn_id: String, -) -> Result { +) -> Result> { let refund_status = response .transaction_status .clone() @@ -1809,8 +1808,8 @@ fn get_error_response( error_code: Option, error_msg: &Option, http_code: u16, -) -> Result { - Err(ErrorResponse { +) -> Result> { + Err(Box::new(ErrorResponse { code: error_code .map(|c| c.to_string()) .unwrap_or_else(|| NO_ERROR_CODE.to_string()), @@ -1821,7 +1820,9 @@ fn get_error_response( status_code: http_code, attempt_status: None, connector_transaction_id: None, - }) + issuer_error_code: None, + issuer_error_message: None, + })) } #[derive(Debug, Default, Serialize, Deserialize)] diff --git a/crates/hyperswitch_connectors/src/connectors/opayo.rs b/crates/hyperswitch_connectors/src/connectors/opayo.rs index b2aadda37f..eef0da72a2 100644 --- a/crates/hyperswitch_connectors/src/connectors/opayo.rs +++ b/crates/hyperswitch_connectors/src/connectors/opayo.rs @@ -139,6 +139,8 @@ impl ConnectorCommon for Opayo { reason: response.reason, attempt_status: None, connector_transaction_id: None, + issuer_error_code: None, + issuer_error_message: None, }) } } diff --git a/crates/hyperswitch_connectors/src/connectors/opennode.rs b/crates/hyperswitch_connectors/src/connectors/opennode.rs index fefd2f7776..56e30ac342 100644 --- a/crates/hyperswitch_connectors/src/connectors/opennode.rs +++ b/crates/hyperswitch_connectors/src/connectors/opennode.rs @@ -135,6 +135,8 @@ impl ConnectorCommon for Opennode { reason: None, attempt_status: None, connector_transaction_id: None, + issuer_error_code: None, + issuer_error_message: None, }) } } diff --git a/crates/hyperswitch_connectors/src/connectors/paybox.rs b/crates/hyperswitch_connectors/src/connectors/paybox.rs index 395fc73808..0c8577a29d 100644 --- a/crates/hyperswitch_connectors/src/connectors/paybox.rs +++ b/crates/hyperswitch_connectors/src/connectors/paybox.rs @@ -156,6 +156,8 @@ impl ConnectorCommon for Paybox { reason: response.reason, attempt_status: None, connector_transaction_id: None, + issuer_error_code: None, + issuer_error_message: None, }) } } diff --git a/crates/hyperswitch_connectors/src/connectors/paybox/transformers.rs b/crates/hyperswitch_connectors/src/connectors/paybox/transformers.rs index ef4e308d96..7da6b6e95e 100644 --- a/crates/hyperswitch_connectors/src/connectors/paybox/transformers.rs +++ b/crates/hyperswitch_connectors/src/connectors/paybox/transformers.rs @@ -715,6 +715,8 @@ impl TryFrom TryFrom TryFrom TryFrom> status_code: item.http_code, attempt_status: None, connector_transaction_id: Some(item.response.transaction_number), + issuer_error_code: None, + issuer_error_message: None, }), ..item.data }), @@ -964,6 +974,8 @@ impl TryFrom> status_code: item.http_code, attempt_status: None, connector_transaction_id: Some(item.response.transaction_number), + issuer_error_code: None, + issuer_error_message: None, }), ..item.data }), @@ -1033,6 +1045,8 @@ impl status_code: item.http_code, attempt_status: None, connector_transaction_id: Some(response.transaction_number), + issuer_error_code: None, + issuer_error_message: None, }), ..item.data }), diff --git a/crates/hyperswitch_connectors/src/connectors/payeezy.rs b/crates/hyperswitch_connectors/src/connectors/payeezy.rs index 5621b9d123..b6266d30d2 100644 --- a/crates/hyperswitch_connectors/src/connectors/payeezy.rs +++ b/crates/hyperswitch_connectors/src/connectors/payeezy.rs @@ -149,6 +149,8 @@ impl ConnectorCommon for Payeezy { reason: None, attempt_status: None, connector_transaction_id: None, + issuer_error_code: None, + issuer_error_message: None, }) } } diff --git a/crates/hyperswitch_connectors/src/connectors/payme.rs b/crates/hyperswitch_connectors/src/connectors/payme.rs index 9c1a94ad3c..80dd60c172 100644 --- a/crates/hyperswitch_connectors/src/connectors/payme.rs +++ b/crates/hyperswitch_connectors/src/connectors/payme.rs @@ -149,6 +149,8 @@ impl ConnectorCommon for Payme { )), attempt_status: None, connector_transaction_id: None, + issuer_error_code: None, + issuer_error_message: None, }) } Err(error_msg) => { diff --git a/crates/hyperswitch_connectors/src/connectors/payme/transformers.rs b/crates/hyperswitch_connectors/src/connectors/payme/transformers.rs index 8dd83d1ebd..180d22b2a7 100644 --- a/crates/hyperswitch_connectors/src/connectors/payme/transformers.rs +++ b/crates/hyperswitch_connectors/src/connectors/payme/transformers.rs @@ -232,6 +232,8 @@ fn get_pay_sale_error_response( status_code: http_code, attempt_status: None, connector_transaction_id: Some(pay_sale_response.payme_sale_id.clone()), + issuer_error_code: None, + issuer_error_message: None, } } @@ -314,6 +316,8 @@ fn get_sale_query_error_response( status_code: http_code, attempt_status: None, connector_transaction_id: Some(sale_query_response.sale_payme_id.clone()), + issuer_error_code: None, + issuer_error_message: None, } } @@ -1033,6 +1037,8 @@ impl TryFrom> status_code: item.http_code, attempt_status: None, connector_transaction_id: payme_response.payme_transaction_id.clone(), + issuer_error_code: None, + issuer_error_message: None, }) } else { Ok(RefundsResponseData { @@ -1104,6 +1110,8 @@ impl TryFrom> for PaymentsCa status_code: item.http_code, attempt_status: None, connector_transaction_id: payme_response.payme_transaction_id.clone(), + issuer_error_code: None, + issuer_error_message: None, }) } else { // Since we are not receiving payme_sale_id, we are not populating the transaction response @@ -1158,6 +1166,8 @@ impl TryFrom reason: Some(response.error_description), attempt_status: None, connector_transaction_id: None, + issuer_error_code: None, + issuer_error_message: None, }) } } @@ -1235,6 +1241,8 @@ impl ConnectorIntegration TryFrom TryFrom> attempt_status: None, connector_transaction_id: None, status_code: item.http_code, + issuer_error_code: None, + issuer_error_message: None, }), ..item.data }) @@ -388,6 +394,8 @@ impl TryFrom> attempt_status: None, connector_transaction_id: None, status_code: item.http_code, + issuer_error_code: None, + issuer_error_message: None, }), ..item.data }) diff --git a/crates/hyperswitch_connectors/src/connectors/payu.rs b/crates/hyperswitch_connectors/src/connectors/payu.rs index cd8c99b615..6d09c85d91 100644 --- a/crates/hyperswitch_connectors/src/connectors/payu.rs +++ b/crates/hyperswitch_connectors/src/connectors/payu.rs @@ -139,6 +139,8 @@ impl ConnectorCommon for Payu { reason: response.status.code_literal, attempt_status: None, connector_transaction_id: None, + issuer_error_code: None, + issuer_error_message: None, }) } } @@ -339,6 +341,8 @@ impl ConnectorIntegration reason: None, attempt_status: None, connector_transaction_id: None, + issuer_error_code: None, + issuer_error_message: None, }) } } diff --git a/crates/hyperswitch_connectors/src/connectors/placetopay.rs b/crates/hyperswitch_connectors/src/connectors/placetopay.rs index 6e593c53e1..54d8ffadf3 100644 --- a/crates/hyperswitch_connectors/src/connectors/placetopay.rs +++ b/crates/hyperswitch_connectors/src/connectors/placetopay.rs @@ -134,6 +134,8 @@ impl ConnectorCommon for Placetopay { reason: Some(response.status.message), attempt_status: None, connector_transaction_id: None, + issuer_error_code: None, + issuer_error_message: None, }) } } diff --git a/crates/hyperswitch_connectors/src/connectors/powertranz.rs b/crates/hyperswitch_connectors/src/connectors/powertranz.rs index 6d88ac368a..52db1eb49d 100644 --- a/crates/hyperswitch_connectors/src/connectors/powertranz.rs +++ b/crates/hyperswitch_connectors/src/connectors/powertranz.rs @@ -147,6 +147,8 @@ impl ConnectorCommon for Powertranz { reason: None, attempt_status: None, connector_transaction_id: None, + issuer_error_code: None, + issuer_error_message: None, }) } } diff --git a/crates/hyperswitch_connectors/src/connectors/powertranz/transformers.rs b/crates/hyperswitch_connectors/src/connectors/powertranz/transformers.rs index 03eaa27281..04df8ee5e5 100644 --- a/crates/hyperswitch_connectors/src/connectors/powertranz/transformers.rs +++ b/crates/hyperswitch_connectors/src/connectors/powertranz/transformers.rs @@ -459,6 +459,8 @@ fn build_error_response(item: &PowertranzBaseResponse, status_code: u16) -> Opti ), attempt_status: None, connector_transaction_id: None, + issuer_error_code: None, + issuer_error_message: None, } }) } else if !ISO_SUCCESS_CODES.contains(&item.iso_response_code.as_str()) { @@ -470,6 +472,8 @@ fn build_error_response(item: &PowertranzBaseResponse, status_code: u16) -> Opti reason: Some(item.response_message.clone()), attempt_status: None, connector_transaction_id: None, + issuer_error_code: None, + issuer_error_message: None, }) } else { None diff --git a/crates/hyperswitch_connectors/src/connectors/prophetpay.rs b/crates/hyperswitch_connectors/src/connectors/prophetpay.rs index 245eaf73e7..2518f08c69 100644 --- a/crates/hyperswitch_connectors/src/connectors/prophetpay.rs +++ b/crates/hyperswitch_connectors/src/connectors/prophetpay.rs @@ -141,6 +141,8 @@ impl ConnectorCommon for Prophetpay { reason: Some(response.to_string()), attempt_status: None, connector_transaction_id: None, + issuer_error_code: None, + issuer_error_message: None, }) } } diff --git a/crates/hyperswitch_connectors/src/connectors/prophetpay/transformers.rs b/crates/hyperswitch_connectors/src/connectors/prophetpay/transformers.rs index cb93caded2..28f0e4981b 100644 --- a/crates/hyperswitch_connectors/src/connectors/prophetpay/transformers.rs +++ b/crates/hyperswitch_connectors/src/connectors/prophetpay/transformers.rs @@ -425,6 +425,8 @@ impl status_code: item.http_code, attempt_status: None, connector_transaction_id: None, + issuer_error_code: None, + issuer_error_message: None, }), ..item.data }) @@ -473,6 +475,8 @@ impl TryFrom TryFrom> status_code: item.http_code, attempt_status: None, connector_transaction_id: None, + issuer_error_code: None, + issuer_error_message: None, }), ..item.data }) @@ -669,6 +677,8 @@ impl TryFrom> status_code: item.http_code, attempt_status: None, connector_transaction_id: None, + issuer_error_code: None, + issuer_error_message: None, }), ..item.data }) diff --git a/crates/hyperswitch_connectors/src/connectors/rapyd.rs b/crates/hyperswitch_connectors/src/connectors/rapyd.rs index d5473b260f..b777aff4d9 100644 --- a/crates/hyperswitch_connectors/src/connectors/rapyd.rs +++ b/crates/hyperswitch_connectors/src/connectors/rapyd.rs @@ -140,6 +140,8 @@ impl ConnectorCommon for Rapyd { reason: response_data.status.message, attempt_status: None, connector_transaction_id: None, + issuer_error_code: None, + issuer_error_message: None, }) } Err(error_msg) => { diff --git a/crates/hyperswitch_connectors/src/connectors/rapyd/transformers.rs b/crates/hyperswitch_connectors/src/connectors/rapyd/transformers.rs index 7d4517e00b..236d9e55b5 100644 --- a/crates/hyperswitch_connectors/src/connectors/rapyd/transformers.rs +++ b/crates/hyperswitch_connectors/src/connectors/rapyd/transformers.rs @@ -451,6 +451,8 @@ impl TryFrom { @@ -495,6 +497,8 @@ impl TryFrom { @@ -170,6 +172,8 @@ impl ConnectorCommon for Razorpay { reason: Some(error_string.clone()), attempt_status: None, connector_transaction_id: None, + issuer_error_code: None, + issuer_error_message: None, }) } } diff --git a/crates/hyperswitch_connectors/src/connectors/razorpay/transformers.rs b/crates/hyperswitch_connectors/src/connectors/razorpay/transformers.rs index af9e67f8db..214102e42f 100644 --- a/crates/hyperswitch_connectors/src/connectors/razorpay/transformers.rs +++ b/crates/hyperswitch_connectors/src/connectors/razorpay/transformers.rs @@ -817,6 +817,8 @@ impl TryFrom> status_code: item.http_code, attempt_status: None, connector_transaction_id: Some(item.response.refund.unique_request_id.clone()), + issuer_error_code: None, + issuer_error_message: None, }), }; Ok(Self { diff --git a/crates/hyperswitch_connectors/src/connectors/recurly.rs b/crates/hyperswitch_connectors/src/connectors/recurly.rs index edf5141a11..450a5ed309 100644 --- a/crates/hyperswitch_connectors/src/connectors/recurly.rs +++ b/crates/hyperswitch_connectors/src/connectors/recurly.rs @@ -163,6 +163,8 @@ impl ConnectorCommon for Recurly { reason: response.reason, attempt_status: None, connector_transaction_id: None, + issuer_error_code: None, + issuer_error_message: None, }) } } diff --git a/crates/hyperswitch_connectors/src/connectors/redsys.rs b/crates/hyperswitch_connectors/src/connectors/redsys.rs index 501182dec0..97f4b4c4b4 100644 --- a/crates/hyperswitch_connectors/src/connectors/redsys.rs +++ b/crates/hyperswitch_connectors/src/connectors/redsys.rs @@ -144,6 +144,8 @@ impl ConnectorCommon for Redsys { reason: response.reason, attempt_status: None, connector_transaction_id: None, + issuer_error_code: None, + issuer_error_message: None, }) } } diff --git a/crates/hyperswitch_connectors/src/connectors/shift4.rs b/crates/hyperswitch_connectors/src/connectors/shift4.rs index 0bf8c4094b..b85c2472e5 100644 --- a/crates/hyperswitch_connectors/src/connectors/shift4.rs +++ b/crates/hyperswitch_connectors/src/connectors/shift4.rs @@ -140,6 +140,8 @@ impl ConnectorCommon for Shift4 { reason: None, attempt_status: None, connector_transaction_id: None, + issuer_error_code: None, + issuer_error_message: None, }) } } diff --git a/crates/hyperswitch_connectors/src/connectors/square.rs b/crates/hyperswitch_connectors/src/connectors/square.rs index 9615d4afdd..6ac3420219 100644 --- a/crates/hyperswitch_connectors/src/connectors/square.rs +++ b/crates/hyperswitch_connectors/src/connectors/square.rs @@ -158,6 +158,8 @@ impl ConnectorCommon for Square { reason: Some(reason), attempt_status: None, connector_transaction_id: None, + issuer_error_code: None, + issuer_error_message: None, }) } } diff --git a/crates/hyperswitch_connectors/src/connectors/stax.rs b/crates/hyperswitch_connectors/src/connectors/stax.rs index 27be4d309d..57b8ce1a28 100644 --- a/crates/hyperswitch_connectors/src/connectors/stax.rs +++ b/crates/hyperswitch_connectors/src/connectors/stax.rs @@ -135,6 +135,8 @@ impl ConnectorCommon for Stax { ), attempt_status: None, connector_transaction_id: None, + issuer_error_code: None, + issuer_error_message: None, }) } } diff --git a/crates/hyperswitch_connectors/src/connectors/stripebilling.rs b/crates/hyperswitch_connectors/src/connectors/stripebilling.rs index e05fb8b8e3..f3d63ed9ea 100644 --- a/crates/hyperswitch_connectors/src/connectors/stripebilling.rs +++ b/crates/hyperswitch_connectors/src/connectors/stripebilling.rs @@ -141,6 +141,8 @@ impl ConnectorCommon for Stripebilling { reason: response.reason, attempt_status: None, connector_transaction_id: None, + issuer_error_code: None, + issuer_error_message: None, }) } } diff --git a/crates/hyperswitch_connectors/src/connectors/taxjar.rs b/crates/hyperswitch_connectors/src/connectors/taxjar.rs index 30b92d9ceb..4420384e87 100644 --- a/crates/hyperswitch_connectors/src/connectors/taxjar.rs +++ b/crates/hyperswitch_connectors/src/connectors/taxjar.rs @@ -144,6 +144,8 @@ impl ConnectorCommon for Taxjar { reason: Some(response.detail), attempt_status: None, connector_transaction_id: None, + issuer_error_code: None, + issuer_error_message: None, }) } } diff --git a/crates/hyperswitch_connectors/src/connectors/thunes.rs b/crates/hyperswitch_connectors/src/connectors/thunes.rs index b26c0e67fe..3e2e2fec33 100644 --- a/crates/hyperswitch_connectors/src/connectors/thunes.rs +++ b/crates/hyperswitch_connectors/src/connectors/thunes.rs @@ -144,6 +144,8 @@ impl ConnectorCommon for Thunes { reason: response.reason, attempt_status: None, connector_transaction_id: None, + issuer_error_code: None, + issuer_error_message: None, }) } } diff --git a/crates/hyperswitch_connectors/src/connectors/trustpay.rs b/crates/hyperswitch_connectors/src/connectors/trustpay.rs index b3f2c1f9c3..fed5c10946 100644 --- a/crates/hyperswitch_connectors/src/connectors/trustpay.rs +++ b/crates/hyperswitch_connectors/src/connectors/trustpay.rs @@ -177,6 +177,8 @@ impl ConnectorCommon for Trustpay { .or(response_data.payment_description), attempt_status: None, connector_transaction_id: response_data.instance_id, + issuer_error_code: None, + issuer_error_message: None, }) } Err(error_msg) => { @@ -333,6 +335,8 @@ impl ConnectorIntegration reason: response.result_info.additional_info, attempt_status: None, connector_transaction_id: None, + issuer_error_code: None, + issuer_error_message: None, }) } } diff --git a/crates/hyperswitch_connectors/src/connectors/trustpay/transformers.rs b/crates/hyperswitch_connectors/src/connectors/trustpay/transformers.rs index e8da94fae3..0b94b81619 100644 --- a/crates/hyperswitch_connectors/src/connectors/trustpay/transformers.rs +++ b/crates/hyperswitch_connectors/src/connectors/trustpay/transformers.rs @@ -732,6 +732,8 @@ fn handle_cards_response( status_code, attempt_status: None, connector_transaction_id: Some(response.instance_id.clone()), + issuer_error_code: None, + issuer_error_message: None, }) } else { None @@ -797,6 +799,8 @@ fn handle_bank_redirects_error_response( status_code, attempt_status: None, connector_transaction_id: None, + issuer_error_code: None, + issuer_error_message: None, }); let payment_response_data = PaymentsResponseData::TransactionResponse { resource_id: ResponseId::NoResponseId, @@ -849,6 +853,8 @@ fn handle_bank_redirects_sync_response( .payment_request_id .clone(), ), + issuer_error_code: None, + issuer_error_message: None, }) } else { None @@ -903,6 +909,8 @@ pub fn handle_webhook_response( status_code, attempt_status: None, connector_transaction_id: payment_information.references.payment_request_id.clone(), + issuer_error_code: None, + issuer_error_message: None, }) } else { None @@ -1011,6 +1019,8 @@ impl TryFrom reason: Some(response.message), attempt_status: None, connector_transaction_id: None, + issuer_error_code: None, + issuer_error_message: None, }) } } diff --git a/crates/hyperswitch_connectors/src/connectors/volt/transformers.rs b/crates/hyperswitch_connectors/src/connectors/volt/transformers.rs index 3841b7e33b..33d174d5db 100644 --- a/crates/hyperswitch_connectors/src/connectors/volt/transformers.rs +++ b/crates/hyperswitch_connectors/src/connectors/volt/transformers.rs @@ -354,6 +354,8 @@ impl TryFrom TryFrom { @@ -234,6 +236,8 @@ impl ConnectorCommon for Wellsfargo { reason: Some(response.response.rmsg), attempt_status: None, connector_transaction_id: None, + issuer_error_code: None, + issuer_error_message: None, }) } Ok(transformers::WellsfargoErrorResponse::NotAvailableError(response)) => { @@ -258,6 +262,8 @@ impl ConnectorCommon for Wellsfargo { reason: Some(error_response), attempt_status: None, connector_transaction_id: None, + issuer_error_code: None, + issuer_error_message: None, }) } Err(error_msg) => { @@ -482,6 +488,8 @@ impl ConnectorIntegration fo .unwrap_or(hyperswitch_interfaces::consts::NO_ERROR_MESSAGE.to_string()), attempt_status: None, connector_transaction_id: None, + issuer_error_code: None, + issuer_error_message: None, }) } } @@ -890,6 +902,8 @@ impl ConnectorIntegration for We .unwrap_or(hyperswitch_interfaces::consts::NO_ERROR_MESSAGE.to_string()), attempt_status: None, connector_transaction_id: None, + issuer_error_code: None, + issuer_error_message: None, }) } } diff --git a/crates/hyperswitch_connectors/src/connectors/wellsfargo/transformers.rs b/crates/hyperswitch_connectors/src/connectors/wellsfargo/transformers.rs index 10c381fa85..b346d39686 100644 --- a/crates/hyperswitch_connectors/src/connectors/wellsfargo/transformers.rs +++ b/crates/hyperswitch_connectors/src/connectors/wellsfargo/transformers.rs @@ -1708,10 +1708,10 @@ fn get_error_response_if_failure( fn get_payment_response( (info_response, status, http_code): (&WellsfargoPaymentsResponse, enums::AttemptStatus, u16), -) -> Result { +) -> Result> { let error_response = get_error_response_if_failure((info_response, status, http_code)); match error_response { - Some(error) => Err(error), + Some(error) => Err(Box::new(error)), None => { let incremental_authorization_allowed = Some(status == enums::AttemptStatus::Authorized); @@ -1776,7 +1776,8 @@ impl .unwrap_or(WellsfargoPaymentStatus::StatusNotReceived), item.data.request.is_auto_capture()?, ); - let response = get_payment_response((&item.response, status, item.http_code)); + let response = + get_payment_response((&item.response, status, item.http_code)).map_err(|err| *err); let connector_response = item .response .processor_information @@ -1832,7 +1833,8 @@ impl .unwrap_or(WellsfargoPaymentStatus::StatusNotReceived), true, ); - let response = get_payment_response((&item.response, status, item.http_code)); + let response = + get_payment_response((&item.response, status, item.http_code)).map_err(|err| *err); Ok(Self { status, response, @@ -1862,7 +1864,8 @@ impl .unwrap_or(WellsfargoPaymentStatus::StatusNotReceived), false, ); - let response = get_payment_response((&item.response, status, item.http_code)); + let response = + get_payment_response((&item.response, status, item.http_code)).map_err(|err| *err); Ok(Self { status, response, @@ -2376,6 +2379,8 @@ pub fn get_error_response( status_code, attempt_status, connector_transaction_id: Some(transaction_id.clone()), + issuer_error_code: None, + issuer_error_message: None, } } pub fn get_error_reason( diff --git a/crates/hyperswitch_connectors/src/connectors/worldpay.rs b/crates/hyperswitch_connectors/src/connectors/worldpay.rs index 41b2207b17..b261343c5b 100644 --- a/crates/hyperswitch_connectors/src/connectors/worldpay.rs +++ b/crates/hyperswitch_connectors/src/connectors/worldpay.rs @@ -156,6 +156,8 @@ impl ConnectorCommon for Worldpay { reason: response.validation_errors.map(|e| e.to_string()), attempt_status: Some(enums::AttemptStatus::Failure), connector_transaction_id: None, + issuer_error_code: None, + issuer_error_message: None, }) } } @@ -483,6 +485,8 @@ impl ConnectorIntegration for Wor reason: response.validation_errors.map(|e| e.to_string()), attempt_status: None, connector_transaction_id: None, + issuer_error_code: None, + issuer_error_message: None, }) } diff --git a/crates/hyperswitch_connectors/src/connectors/worldpay/transformers.rs b/crates/hyperswitch_connectors/src/connectors/worldpay/transformers.rs index 65c884601d..61621b3cc9 100644 --- a/crates/hyperswitch_connectors/src/connectors/worldpay/transformers.rs +++ b/crates/hyperswitch_connectors/src/connectors/worldpay/transformers.rs @@ -786,6 +786,8 @@ impl status_code: router_data.http_code, attempt_status: Some(status), connector_transaction_id: optional_correlation_id, + issuer_error_code: None, + issuer_error_message: None, }), (_, Some((code, message))) => Err(ErrorResponse { code, @@ -794,6 +796,8 @@ impl status_code: router_data.http_code, attempt_status: Some(status), connector_transaction_id: optional_correlation_id, + issuer_error_code: None, + issuer_error_message: None, }), }; Ok(Self { diff --git a/crates/hyperswitch_connectors/src/connectors/xendit.rs b/crates/hyperswitch_connectors/src/connectors/xendit.rs index f1872e31ae..cd65b25fda 100644 --- a/crates/hyperswitch_connectors/src/connectors/xendit.rs +++ b/crates/hyperswitch_connectors/src/connectors/xendit.rs @@ -154,6 +154,8 @@ impl ConnectorCommon for Xendit { status_code: res.status_code, attempt_status: None, connector_transaction_id: None, + issuer_error_code: None, + issuer_error_message: None, }) } } diff --git a/crates/hyperswitch_connectors/src/connectors/xendit/transformers.rs b/crates/hyperswitch_connectors/src/connectors/xendit/transformers.rs index 47936d4306..30b023e6dc 100644 --- a/crates/hyperswitch_connectors/src/connectors/xendit/transformers.rs +++ b/crates/hyperswitch_connectors/src/connectors/xendit/transformers.rs @@ -330,6 +330,8 @@ impl attempt_status: None, connector_transaction_id: Some(item.response.id.clone()), status_code: item.http_code, + issuer_error_code: None, + issuer_error_message: None, }) } else { let charges = match item.data.request.split_payments.as_ref() { @@ -439,6 +441,8 @@ impl attempt_status: None, connector_transaction_id: None, status_code: item.http_code, + issuer_error_code: None, + issuer_error_message: None, }) } else { Ok(PaymentsResponseData::TransactionResponse { @@ -572,6 +576,8 @@ impl TryFrom> for PaymentsSyncRou attempt_status: None, connector_transaction_id: Some(payment_response.id.clone()), status_code: item.http_code, + issuer_error_code: None, + issuer_error_message: None, }) } else { Ok(PaymentsResponseData::TransactionResponse { diff --git a/crates/hyperswitch_connectors/src/connectors/zen.rs b/crates/hyperswitch_connectors/src/connectors/zen.rs index 70703b3164..71ca8c7758 100644 --- a/crates/hyperswitch_connectors/src/connectors/zen.rs +++ b/crates/hyperswitch_connectors/src/connectors/zen.rs @@ -146,6 +146,8 @@ impl ConnectorCommon for Zen { reason: None, attempt_status: None, connector_transaction_id: None, + issuer_error_code: None, + issuer_error_message: None, }) } } diff --git a/crates/hyperswitch_connectors/src/connectors/zen/transformers.rs b/crates/hyperswitch_connectors/src/connectors/zen/transformers.rs index 305c8518c8..bec1f6be0a 100644 --- a/crates/hyperswitch_connectors/src/connectors/zen/transformers.rs +++ b/crates/hyperswitch_connectors/src/connectors/zen/transformers.rs @@ -939,6 +939,8 @@ fn get_zen_response( status_code, attempt_status: Some(status), connector_transaction_id: Some(response.id.clone()), + issuer_error_code: None, + issuer_error_message: None, }) } else { None @@ -1085,6 +1087,8 @@ fn get_zen_refund_response( status_code, attempt_status: None, connector_transaction_id: Some(response.id.clone()), + issuer_error_code: None, + issuer_error_message: None, }) } else { None diff --git a/crates/hyperswitch_connectors/src/connectors/zsl.rs b/crates/hyperswitch_connectors/src/connectors/zsl.rs index d7c0152b7a..7ed2a66082 100644 --- a/crates/hyperswitch_connectors/src/connectors/zsl.rs +++ b/crates/hyperswitch_connectors/src/connectors/zsl.rs @@ -123,6 +123,8 @@ impl ConnectorCommon for Zsl { reason: Some(error_reason), attempt_status: Some(common_enums::AttemptStatus::Failure), connector_transaction_id: None, + issuer_error_code: None, + issuer_error_message: None, }) } } diff --git a/crates/hyperswitch_connectors/src/connectors/zsl/transformers.rs b/crates/hyperswitch_connectors/src/connectors/zsl/transformers.rs index 8a39901e5d..66bd3eda1d 100644 --- a/crates/hyperswitch_connectors/src/connectors/zsl/transformers.rs +++ b/crates/hyperswitch_connectors/src/connectors/zsl/transformers.rs @@ -349,6 +349,8 @@ impl TryFrom TryFrom TryFrom for router_data::ErrorResponse { }, attempt_status: None, connector_transaction_id: None, + issuer_error_code: None, + issuer_error_message: None, } } } diff --git a/crates/hyperswitch_domain_models/src/payments/payment_attempt.rs b/crates/hyperswitch_domain_models/src/payments/payment_attempt.rs index 7092605695..2dc4eec15f 100644 --- a/crates/hyperswitch_domain_models/src/payments/payment_attempt.rs +++ b/crates/hyperswitch_domain_models/src/payments/payment_attempt.rs @@ -846,6 +846,8 @@ pub struct PaymentAttempt { pub capture_before: Option, pub card_discovery: Option, pub charges: Option, + pub issuer_error_code: Option, + pub issuer_error_message: Option, } #[cfg(feature = "v1")] @@ -1239,6 +1241,8 @@ pub enum PaymentAttemptUpdate { connector_transaction_id: Option, payment_method_data: Option, authentication_type: Option, + issuer_error_code: Option, + issuer_error_message: Option, }, CaptureUpdate { amount_to_capture: Option, @@ -1542,6 +1546,8 @@ impl PaymentAttemptUpdate { connector_transaction_id, payment_method_data, authentication_type, + issuer_error_code, + issuer_error_message, } => DieselPaymentAttemptUpdate::ErrorUpdate { connector, status, @@ -1555,6 +1561,8 @@ impl PaymentAttemptUpdate { connector_transaction_id, payment_method_data, authentication_type, + issuer_error_code, + issuer_error_message, }, Self::CaptureUpdate { multiple_capture_count, @@ -1824,6 +1832,8 @@ impl behaviour::Conversion for PaymentAttempt { processor_transaction_data, card_discovery: self.card_discovery, charges: self.charges, + issuer_error_code: self.issuer_error_code, + issuer_error_message: self.issuer_error_message, // Below fields are deprecated. Please add any new fields above this line. connector_transaction_data: None, }) @@ -1912,6 +1922,8 @@ impl behaviour::Conversion for PaymentAttempt { capture_before: storage_model.capture_before, card_discovery: storage_model.card_discovery, charges: storage_model.charges, + issuer_error_code: storage_model.issuer_error_code, + issuer_error_message: storage_model.issuer_error_message, }) } .await diff --git a/crates/hyperswitch_domain_models/src/router_data.rs b/crates/hyperswitch_domain_models/src/router_data.rs index 7f1278414e..6618d2fbc8 100644 --- a/crates/hyperswitch_domain_models/src/router_data.rs +++ b/crates/hyperswitch_domain_models/src/router_data.rs @@ -399,6 +399,8 @@ pub struct ErrorResponse { pub status_code: u16, pub attempt_status: Option, pub connector_transaction_id: Option, + pub issuer_error_code: Option, + pub issuer_error_message: Option, } impl Default for ErrorResponse { @@ -410,6 +412,8 @@ impl Default for ErrorResponse { status_code: http::StatusCode::INTERNAL_SERVER_ERROR.as_u16(), attempt_status: None, connector_transaction_id: None, + issuer_error_code: None, + issuer_error_message: None, } } } @@ -423,6 +427,8 @@ impl ErrorResponse { status_code: http::StatusCode::INTERNAL_SERVER_ERROR.as_u16(), attempt_status: None, connector_transaction_id: None, + issuer_error_code: None, + issuer_error_message: None, } } } @@ -601,6 +607,8 @@ impl status_code: _, attempt_status, connector_transaction_id, + issuer_error_code: _, + issuer_error_message: _, } = error_response.clone(); let attempt_status = attempt_status.unwrap_or(self.status); @@ -798,6 +806,8 @@ impl status_code: _, attempt_status, connector_transaction_id, + issuer_error_code: _, + issuer_error_message: _, } = error_response.clone(); let attempt_status = attempt_status.unwrap_or(self.status); @@ -1013,6 +1023,8 @@ impl status_code: _, attempt_status, connector_transaction_id, + issuer_error_code: _, + issuer_error_message: _, } = error_response.clone(); let attempt_status = attempt_status.unwrap_or(common_enums::AttemptStatus::Failure); @@ -1256,6 +1268,8 @@ impl status_code: _, attempt_status, connector_transaction_id, + issuer_error_code: _, + issuer_error_message: _, } = error_response.clone(); let attempt_status = attempt_status.unwrap_or(self.status); diff --git a/crates/hyperswitch_interfaces/src/api.rs b/crates/hyperswitch_interfaces/src/api.rs index cf9b2ff976..ddc22aa4a5 100644 --- a/crates/hyperswitch_interfaces/src/api.rs +++ b/crates/hyperswitch_interfaces/src/api.rs @@ -203,6 +203,8 @@ pub trait ConnectorIntegration: status_code: res.status_code, attempt_status: None, connector_transaction_id: None, + issuer_error_code: None, + issuer_error_message: None, }) } @@ -291,6 +293,8 @@ pub trait ConnectorCommon { reason: None, attempt_status: None, connector_transaction_id: None, + issuer_error_code: None, + issuer_error_message: None, }) } } diff --git a/crates/hyperswitch_interfaces/src/connector_integration_v2.rs b/crates/hyperswitch_interfaces/src/connector_integration_v2.rs index bc18f5c663..e0974f5d04 100644 --- a/crates/hyperswitch_interfaces/src/connector_integration_v2.rs +++ b/crates/hyperswitch_interfaces/src/connector_integration_v2.rs @@ -158,6 +158,8 @@ pub trait ConnectorIntegrationV2: status_code: res.status_code, attempt_status: None, connector_transaction_id: None, + issuer_error_code: None, + issuer_error_message: None, }) } diff --git a/crates/router/src/connector/adyenplatform.rs b/crates/router/src/connector/adyenplatform.rs index f95e9cd4d6..5ff89721cb 100644 --- a/crates/router/src/connector/adyenplatform.rs +++ b/crates/router/src/connector/adyenplatform.rs @@ -99,6 +99,8 @@ impl ConnectorCommon for Adyenplatform { reason: response.detail, attempt_status: None, connector_transaction_id: None, + issuer_error_code: None, + issuer_error_message: None, }) } } diff --git a/crates/router/src/connector/dummyconnector.rs b/crates/router/src/connector/dummyconnector.rs index 226067cef9..f2058c17f6 100644 --- a/crates/router/src/connector/dummyconnector.rs +++ b/crates/router/src/connector/dummyconnector.rs @@ -125,6 +125,8 @@ impl ConnectorCommon for DummyConnector { reason: response.error.reason, attempt_status: None, connector_transaction_id: None, + issuer_error_code: None, + issuer_error_message: None, }) } } diff --git a/crates/router/src/connector/ebanx.rs b/crates/router/src/connector/ebanx.rs index 01db54c1f6..b38297ed5c 100644 --- a/crates/router/src/connector/ebanx.rs +++ b/crates/router/src/connector/ebanx.rs @@ -124,6 +124,8 @@ impl ConnectorCommon for Ebanx { reason: response.message, attempt_status: None, connector_transaction_id: None, + issuer_error_code: None, + issuer_error_message: None, }) } } diff --git a/crates/router/src/connector/gpayments.rs b/crates/router/src/connector/gpayments.rs index 1febbfa788..2d3b1c37d5 100644 --- a/crates/router/src/connector/gpayments.rs +++ b/crates/router/src/connector/gpayments.rs @@ -123,6 +123,8 @@ impl ConnectorCommon for Gpayments { reason: response.error_detail, attempt_status: None, connector_transaction_id: None, + issuer_error_code: None, + issuer_error_message: None, }) } } diff --git a/crates/router/src/connector/netcetera.rs b/crates/router/src/connector/netcetera.rs index 459ac93e06..f1fc94bd48 100644 --- a/crates/router/src/connector/netcetera.rs +++ b/crates/router/src/connector/netcetera.rs @@ -111,6 +111,8 @@ impl ConnectorCommon for Netcetera { reason: response.error_details.error_detail, attempt_status: None, connector_transaction_id: None, + issuer_error_code: None, + issuer_error_message: None, }) } } diff --git a/crates/router/src/connector/netcetera/transformers.rs b/crates/router/src/connector/netcetera/transformers.rs index 886dbc18ad..1169f29563 100644 --- a/crates/router/src/connector/netcetera/transformers.rs +++ b/crates/router/src/connector/netcetera/transformers.rs @@ -110,6 +110,8 @@ impl status_code: item.http_code, attempt_status: None, connector_transaction_id: None, + issuer_error_code: None, + issuer_error_message: None, }) } }; @@ -179,6 +181,8 @@ impl status_code: item.http_code, attempt_status: None, connector_transaction_id: None, + issuer_error_code: None, + issuer_error_message: None, }), }; Ok(Self { diff --git a/crates/router/src/connector/nmi.rs b/crates/router/src/connector/nmi.rs index 73aaec55e5..d0cc0f156d 100644 --- a/crates/router/src/connector/nmi.rs +++ b/crates/router/src/connector/nmi.rs @@ -103,6 +103,8 @@ impl ConnectorCommon for Nmi { code: response.response_code, attempt_status: None, connector_transaction_id: Some(response.transactionid), + issuer_error_code: None, + issuer_error_message: None, }) } } diff --git a/crates/router/src/connector/nmi/transformers.rs b/crates/router/src/connector/nmi/transformers.rs index d6f1cb1962..da2649cc44 100644 --- a/crates/router/src/connector/nmi/transformers.rs +++ b/crates/router/src/connector/nmi/transformers.rs @@ -224,6 +224,8 @@ impl status_code: item.http_code, attempt_status: None, connector_transaction_id: Some(item.response.transactionid), + issuer_error_code: None, + issuer_error_message: None, }), enums::AttemptStatus::Failure, ), @@ -401,6 +403,8 @@ impl ForeignFrom<(NmiCompleteResponse, u16)> for types::ErrorResponse { status_code: http_code, attempt_status: None, connector_transaction_id: Some(response.transactionid), + issuer_error_code: None, + issuer_error_message: None, } } } @@ -905,6 +909,8 @@ impl ForeignFrom<(StandardResponse, u16)> for types::ErrorResponse { status_code: http_code, attempt_status: None, connector_transaction_id: Some(response.transactionid), + issuer_error_code: None, + issuer_error_message: None, } } } diff --git a/crates/router/src/connector/payone.rs b/crates/router/src/connector/payone.rs index 58b179e579..2e7656f08c 100644 --- a/crates/router/src/connector/payone.rs +++ b/crates/router/src/connector/payone.rs @@ -210,6 +210,8 @@ impl ConnectorCommon for Payone { ), attempt_status: None, connector_transaction_id: None, + issuer_error_code: None, + issuer_error_message: None, }), None => Ok(ErrorResponse { status_code: res.status_code, @@ -218,6 +220,8 @@ impl ConnectorCommon for Payone { reason: None, attempt_status: None, connector_transaction_id: None, + issuer_error_code: None, + issuer_error_message: None, }), } } diff --git a/crates/router/src/connector/plaid.rs b/crates/router/src/connector/plaid.rs index f24d7bd8d6..b5428fba4d 100644 --- a/crates/router/src/connector/plaid.rs +++ b/crates/router/src/connector/plaid.rs @@ -133,6 +133,8 @@ impl ConnectorCommon for Plaid { reason: response.display_message, attempt_status: None, connector_transaction_id: None, + issuer_error_code: None, + issuer_error_message: None, }) } } diff --git a/crates/router/src/connector/plaid/transformers.rs b/crates/router/src/connector/plaid/transformers.rs index 4e4fb1863e..ebab8c185a 100644 --- a/crates/router/src/connector/plaid/transformers.rs +++ b/crates/router/src/connector/plaid/transformers.rs @@ -302,6 +302,8 @@ impl status_code: item.http_code, attempt_status: None, connector_transaction_id: Some(item.response.payment_id), + issuer_error_code: None, + issuer_error_message: None, }) } else { Ok(types::PaymentsResponseData::TransactionResponse { @@ -388,6 +390,8 @@ impl TryFrom> status_code: item.http_code, attempt_status: None, connector_transaction_id: Some(item.response.id), + issuer_error_code: None, + issuer_error_message: None, }) } else { Ok(types::RefundsResponseData { @@ -3193,6 +3195,8 @@ impl TryFrom> status_code: item.http_code, attempt_status: None, connector_transaction_id: Some(item.response.id), + issuer_error_code: None, + issuer_error_message: None, }) } else { Ok(types::RefundsResponseData { @@ -3549,6 +3553,8 @@ impl TryFrom, u16, String)> for types::PaymentsRes status_code: http_code, attempt_status: None, connector_transaction_id: Some(response_id), + issuer_error_code: None, + issuer_error_message: None, }) } } diff --git a/crates/router/src/connector/threedsecureio.rs b/crates/router/src/connector/threedsecureio.rs index aec8f78045..09d232c747 100644 --- a/crates/router/src/connector/threedsecureio.rs +++ b/crates/router/src/connector/threedsecureio.rs @@ -122,6 +122,8 @@ impl ConnectorCommon for Threedsecureio { reason: response.error_description, attempt_status: None, connector_transaction_id: None, + issuer_error_code: None, + issuer_error_message: None, }) } Err(err) => { diff --git a/crates/router/src/connector/threedsecureio/transformers.rs b/crates/router/src/connector/threedsecureio/transformers.rs index dc1a90f36e..faf72a2951 100644 --- a/crates/router/src/connector/threedsecureio/transformers.rs +++ b/crates/router/src/connector/threedsecureio/transformers.rs @@ -124,6 +124,8 @@ impl status_code: item.http_code, attempt_status: None, connector_transaction_id: None, + issuer_error_code: None, + issuer_error_message: None, }) } }; @@ -205,6 +207,8 @@ impl status_code: item.http_code, attempt_status: None, connector_transaction_id: None, + issuer_error_code: None, + issuer_error_message: None, }) } ThreedsecureioErrorResponseWrapper::ErrorString(error) => { @@ -215,6 +219,8 @@ impl status_code: item.http_code, attempt_status: None, connector_transaction_id: None, + issuer_error_code: None, + issuer_error_message: None, }) } }, diff --git a/crates/router/src/connector/utils.rs b/crates/router/src/connector/utils.rs index 8a186e0291..5009eaf4da 100644 --- a/crates/router/src/connector/utils.rs +++ b/crates/router/src/connector/utils.rs @@ -2621,6 +2621,8 @@ impl status_code: http_code, attempt_status, connector_transaction_id, + issuer_error_code: None, + issuer_error_message: None, } } } diff --git a/crates/router/src/connector/wellsfargopayout.rs b/crates/router/src/connector/wellsfargopayout.rs index 33111ee7be..5caf3c689b 100644 --- a/crates/router/src/connector/wellsfargopayout.rs +++ b/crates/router/src/connector/wellsfargopayout.rs @@ -132,6 +132,8 @@ impl ConnectorCommon for Wellsfargopayout { reason: response.reason, attempt_status: None, connector_transaction_id: None, + issuer_error_code: None, + issuer_error_message: None, }) } } diff --git a/crates/router/src/connector/wise.rs b/crates/router/src/connector/wise.rs index e4493f5016..a1d75f18b2 100644 --- a/crates/router/src/connector/wise.rs +++ b/crates/router/src/connector/wise.rs @@ -113,6 +113,8 @@ impl ConnectorCommon for Wise { reason: None, attempt_status: None, connector_transaction_id: None, + issuer_error_code: None, + issuer_error_message: None, }) } else { Ok(types::ErrorResponse { @@ -122,6 +124,8 @@ impl ConnectorCommon for Wise { reason: None, attempt_status: None, connector_transaction_id: None, + issuer_error_code: None, + issuer_error_message: None, }) } } @@ -132,6 +136,8 @@ impl ConnectorCommon for Wise { reason: None, attempt_status: None, connector_transaction_id: None, + issuer_error_code: None, + issuer_error_message: None, }), } } @@ -338,6 +344,8 @@ impl services::ConnectorIntegration( connector_transaction_id: err.connector_transaction_id, payment_method_data: additional_payment_method_data, authentication_type: auth_update, + issuer_error_code: err.issuer_error_code, + issuer_error_message: err.issuer_error_message, }), ) } @@ -1473,6 +1475,8 @@ async fn payment_response_update_tracker( connector_transaction_id, payment_method_data: None, authentication_type: auth_update, + issuer_error_code: None, + issuer_error_message: None, }), ) } diff --git a/crates/router/src/core/payments/retry.rs b/crates/router/src/core/payments/retry.rs index 5fdf14dbf5..24a3ac2ec8 100644 --- a/crates/router/src/core/payments/retry.rs +++ b/crates/router/src/core/payments/retry.rs @@ -537,6 +537,8 @@ where connector_transaction_id: error_response.connector_transaction_id.clone(), payment_method_data: additional_payment_method_data, authentication_type: auth_update, + issuer_error_code: error_response.issuer_error_code.clone(), + issuer_error_message: error_response.issuer_error_message.clone(), }; #[cfg(feature = "v1")] diff --git a/crates/router/src/core/payments/transformers.rs b/crates/router/src/core/payments/transformers.rs index d528a320e6..91afa38b15 100644 --- a/crates/router/src/core/payments/transformers.rs +++ b/crates/router/src/core/payments/transformers.rs @@ -2570,6 +2570,8 @@ where capture_before: payment_attempt.capture_before, extended_authorization_applied: payment_attempt.extended_authorization_applied, card_discovery: payment_attempt.card_discovery, + issuer_error_code: payment_attempt.issuer_error_code, + issuer_error_message: payment_attempt.issuer_error_message, }; services::ApplicationResponse::JsonWithHeaders((payments_response, headers)) @@ -2828,7 +2830,9 @@ impl ForeignFrom<(storage::PaymentIntent, storage::PaymentAttempt)> for api::Pay order_tax_amount: None, connector_mandate_id:None, shipping_cost: None, - card_discovery: pa.card_discovery + card_discovery: pa.card_discovery, + issuer_error_code: pa.issuer_error_code, + issuer_error_message: pa.issuer_error_message, } } } diff --git a/crates/router/src/core/payouts/access_token.rs b/crates/router/src/core/payouts/access_token.rs index e5e9b47e4f..52c31e8fa9 100644 --- a/crates/router/src/core/payouts/access_token.rs +++ b/crates/router/src/core/payouts/access_token.rs @@ -172,6 +172,8 @@ pub async fn refresh_connector_auth( status_code: 504, attempt_status: None, connector_transaction_id: None, + issuer_error_code: None, + issuer_error_message: None, }; Ok(Err(error_response)) diff --git a/crates/router/src/core/refunds.rs b/crates/router/src/core/refunds.rs index b850420dfd..7d663a48a1 100644 --- a/crates/router/src/core/refunds.rs +++ b/crates/router/src/core/refunds.rs @@ -238,6 +238,8 @@ pub async fn trigger_refund_to_gateway( processor_refund_data: None, unified_code: None, unified_message: None, + issuer_error_code: None, + issuer_error_message: None, }) } errors::ConnectorError::NotSupported { message, connector } => { @@ -252,6 +254,8 @@ pub async fn trigger_refund_to_gateway( processor_refund_data: None, unified_code: None, unified_message: None, + issuer_error_code: None, + issuer_error_message: None, }) } _ => None, @@ -335,6 +339,8 @@ pub async fn trigger_refund_to_gateway( processor_refund_data: None, unified_code: Some(unified_code), unified_message: Some(unified_message), + issuer_error_code: err.issuer_error_code, + issuer_error_message: err.issuer_error_message, } } Ok(response) => { @@ -366,6 +372,8 @@ pub async fn trigger_refund_to_gateway( processor_refund_data, unified_code: None, unified_message: None, + issuer_error_code: None, + issuer_error_message: None, } } Ok(()) => { @@ -680,6 +688,8 @@ pub async fn sync_refund_with_gateway( processor_refund_data: None, unified_code: None, unified_message: None, + issuer_error_code: error_message.issuer_error_code, + issuer_error_message: error_message.issuer_error_message, } } Ok(response) => match router_data_res.integrity_check.clone() { @@ -710,6 +720,8 @@ pub async fn sync_refund_with_gateway( processor_refund_data, unified_code: None, unified_message: None, + issuer_error_code: None, + issuer_error_message: None, } } Ok(()) => { @@ -1265,6 +1277,8 @@ impl ForeignFrom for api::RefundResponse { split_refunds: refund.split_refunds, unified_code: refund.unified_code, unified_message: refund.unified_message, + issuer_error_code: refund.issuer_error_code, + issuer_error_message: refund.issuer_error_message, } } } diff --git a/crates/router/src/db/refund.rs b/crates/router/src/db/refund.rs index 07bdfa3f77..1f54eeb5fd 100644 --- a/crates/router/src/db/refund.rs +++ b/crates/router/src/db/refund.rs @@ -439,6 +439,8 @@ mod storage { unified_message: None, processor_refund_data: new.processor_refund_data.clone(), processor_transaction_data: new.processor_transaction_data.clone(), + issuer_error_code: None, + issuer_error_message: None, // Below fields are deprecated. Please add any new fields above this line. connector_refund_data: None, connector_transaction_data: None, @@ -939,6 +941,8 @@ impl RefundInterface for MockDb { unified_message: None, processor_refund_data: new.processor_refund_data.clone(), processor_transaction_data: new.processor_transaction_data.clone(), + issuer_error_code: None, + issuer_error_message: None, // Below fields are deprecated. Please add any new fields above this line. connector_refund_data: None, connector_transaction_data: None, diff --git a/crates/router/src/services/api.rs b/crates/router/src/services/api.rs index df33e803ab..e8af5b3b77 100644 --- a/crates/router/src/services/api.rs +++ b/crates/router/src/services/api.rs @@ -170,6 +170,8 @@ where reason: None, attempt_status: None, connector_transaction_id: None, + issuer_error_code: None, + issuer_error_message: None, }) } else { None @@ -359,6 +361,8 @@ where status_code: 504, attempt_status: None, connector_transaction_id: None, + issuer_error_code: None, + issuer_error_message: None, }; router_data.response = Err(error_response); router_data.connector_http_status_code = Some(504); diff --git a/crates/router/src/utils.rs b/crates/router/src/utils.rs index f9ef488092..59ee4e4fb3 100644 --- a/crates/router/src/utils.rs +++ b/crates/router/src/utils.rs @@ -699,6 +699,8 @@ pub fn handle_json_response_deserialization_failure( reason: Some(response_data), attempt_status: None, connector_transaction_id: None, + issuer_error_code: None, + issuer_error_message: None, }) } } diff --git a/crates/router/src/workflows/payment_sync.rs b/crates/router/src/workflows/payment_sync.rs index 64c4853d14..dac001bac9 100644 --- a/crates/router/src/workflows/payment_sync.rs +++ b/crates/router/src/workflows/payment_sync.rs @@ -154,6 +154,8 @@ impl ProcessTrackerWorkflow for PaymentsSyncWorkflow { connector_transaction_id: None, payment_method_data: None, authentication_type: None, + issuer_error_code: None, + issuer_error_message: None, }; payment_data.payment_attempt = db diff --git a/crates/router/tests/payments.rs b/crates/router/tests/payments.rs index 94dcba750a..0e57540e0e 100644 --- a/crates/router/tests/payments.rs +++ b/crates/router/tests/payments.rs @@ -454,6 +454,8 @@ async fn payments_create_core() { connector_mandate_id: None, shipping_cost: None, card_discovery: None, + issuer_error_code: None, + issuer_error_message: None, }; let expected_response = services::ApplicationResponse::JsonWithHeaders((expected_response, vec![])); @@ -721,6 +723,8 @@ async fn payments_create_core_adyen_no_redirect() { connector_mandate_id: None, shipping_cost: None, card_discovery: None, + issuer_error_code: None, + issuer_error_message: None, }, vec![], )); diff --git a/crates/router/tests/payments2.rs b/crates/router/tests/payments2.rs index 66cd41dbc7..19281b4501 100644 --- a/crates/router/tests/payments2.rs +++ b/crates/router/tests/payments2.rs @@ -215,6 +215,8 @@ async fn payments_create_core() { connector_mandate_id: None, shipping_cost: None, card_discovery: None, + issuer_error_code: None, + issuer_error_message: None, }; let expected_response = @@ -491,6 +493,8 @@ async fn payments_create_core_adyen_no_redirect() { connector_mandate_id: None, shipping_cost: None, card_discovery: None, + issuer_error_code: None, + issuer_error_message: None, }, vec![], )); diff --git a/crates/storage_impl/src/mock_db/payment_attempt.rs b/crates/storage_impl/src/mock_db/payment_attempt.rs index 1e4efb2b35..2a637a77e2 100644 --- a/crates/storage_impl/src/mock_db/payment_attempt.rs +++ b/crates/storage_impl/src/mock_db/payment_attempt.rs @@ -229,6 +229,8 @@ impl PaymentAttemptInterface for MockDb { capture_before: payment_attempt.capture_before, card_discovery: payment_attempt.card_discovery, charges: None, + issuer_error_code: None, + issuer_error_message: None, }; payment_attempts.push(payment_attempt.clone()); Ok(payment_attempt) diff --git a/crates/storage_impl/src/payments/payment_attempt.rs b/crates/storage_impl/src/payments/payment_attempt.rs index 076b120c2d..aaa709e7fa 100644 --- a/crates/storage_impl/src/payments/payment_attempt.rs +++ b/crates/storage_impl/src/payments/payment_attempt.rs @@ -647,6 +647,8 @@ impl PaymentAttemptInterface for KVRouterStore { capture_before: payment_attempt.capture_before, card_discovery: payment_attempt.card_discovery, charges: None, + issuer_error_code: None, + issuer_error_message: None, }; let field = format!("pa_{}", created_attempt.attempt_id); @@ -1648,6 +1650,8 @@ impl DataModelExt for PaymentAttempt { processor_transaction_data, card_discovery: self.card_discovery, charges: self.charges, + issuer_error_code: self.issuer_error_code, + issuer_error_message: self.issuer_error_message, // Below fields are deprecated. Please add any new fields above this line. connector_transaction_data: None, } @@ -1731,6 +1735,8 @@ impl DataModelExt for PaymentAttempt { capture_before: storage_model.capture_before, card_discovery: storage_model.card_discovery, charges: storage_model.charges, + issuer_error_code: storage_model.issuer_error_code, + issuer_error_message: storage_model.issuer_error_message, } } } diff --git a/migrations/2025-03-10-060950_add_issuer_code_and_message_in_payment_attempt/down.sql b/migrations/2025-03-10-060950_add_issuer_code_and_message_in_payment_attempt/down.sql new file mode 100644 index 0000000000..06abb6aefb --- /dev/null +++ b/migrations/2025-03-10-060950_add_issuer_code_and_message_in_payment_attempt/down.sql @@ -0,0 +1,7 @@ +ALTER TABLE payment_attempt +DROP COLUMN IF EXISTS issuer_error_code, +DROP COLUMN IF EXISTS issuer_error_message; + +ALTER TABLE refund +DROP COLUMN IF EXISTS issuer_error_code, +DROP COLUMN IF EXISTS issuer_error_message; \ No newline at end of file diff --git a/migrations/2025-03-10-060950_add_issuer_code_and_message_in_payment_attempt/up.sql b/migrations/2025-03-10-060950_add_issuer_code_and_message_in_payment_attempt/up.sql new file mode 100644 index 0000000000..80c1bc3742 --- /dev/null +++ b/migrations/2025-03-10-060950_add_issuer_code_and_message_in_payment_attempt/up.sql @@ -0,0 +1,7 @@ +ALTER TABLE payment_attempt +ADD COLUMN IF NOT EXISTS issuer_error_code VARCHAR(64) DEFAULT NULL, +ADD COLUMN IF NOT EXISTS issuer_error_message TEXT DEFAULT NULL; + +ALTER TABLE refund +ADD COLUMN IF NOT EXISTS issuer_error_code VARCHAR(64) DEFAULT NULL, +ADD COLUMN IF NOT EXISTS issuer_error_message TEXT DEFAULT NULL; \ No newline at end of file diff --git a/v2_migrations/2025-01-13-081847_drop_v1_columns/up.sql b/v2_migrations/2025-01-13-081847_drop_v1_columns/up.sql index b0a3f007ee..cbb2b264d4 100644 --- a/v2_migrations/2025-01-13-081847_drop_v1_columns/up.sql +++ b/v2_migrations/2025-01-13-081847_drop_v1_columns/up.sql @@ -89,7 +89,9 @@ ALTER TABLE payment_attempt DROP COLUMN attempt_id, DROP COLUMN authentication_data, DROP COLUMN payment_method_billing_address_id, DROP COLUMN connector_mandate_detail, - DROP COLUMN charge_id; + DROP COLUMN charge_id, + DROP COLUMN issuer_error_code, + DROP COLUMN issuer_error_message; ALTER TABLE payment_methods @@ -113,7 +115,9 @@ DROP TYPE IF EXISTS "PaymentMethodIssuerCode"; -- Run below queries only when V1 is deprecated ALTER TABLE refund DROP COLUMN connector_refund_data, - DROP COLUMN connector_transaction_data; + DROP COLUMN connector_transaction_data, + DROP COLUMN issuer_error_code, + DROP COLUMN issuer_error_message; -- Run below queries only when V1 is deprecated ALTER TABLE captures DROP COLUMN connector_capture_data;