diff --git a/crates/router/src/connector/payme.rs b/crates/router/src/connector/payme.rs index 0c4543cd8a2..5873609e372 100644 --- a/crates/router/src/connector/payme.rs +++ b/crates/router/src/connector/payme.rs @@ -5,13 +5,13 @@ use std::fmt::Debug; use api_models::enums::AuthenticationType; use common_utils::{crypto, request::RequestContent}; use diesel_models::enums; -use error_stack::{IntoReport, ResultExt}; +use error_stack::{IntoReport, Report, ResultExt}; use masking::ExposeInterface; use transformers as payme; use crate::{ configs::settings, - connector::{utils as connector_utils, utils::PaymentsPreProcessingData}, + connector::utils::{self as connector_utils, PaymentsPreProcessingData}, core::{ errors::{self, CustomResult}, payments, @@ -24,7 +24,7 @@ use crate::{ api::{self, ConnectorCommon, ConnectorCommonExt}, domain, ErrorResponse, Response, }, - utils::BytesExt, + utils::{handle_json_response_deserialization_failure, BytesExt}, }; #[derive(Debug, Clone)] @@ -83,29 +83,37 @@ impl ConnectorCommon for Payme { res: Response, event_builder: Option<&mut ConnectorEvent>, ) -> CustomResult { - let response: payme::PaymeErrorResponse = - res.response - .parse_struct("PaymeErrorResponse") - .change_context(errors::ConnectorError::ResponseDeserializationFailed)?; - - event_builder.map(|i| i.set_error_response_body(&response)); - router_env::logger::info!(connector_response=?response); - - let status_code = match res.status_code { - 500..=511 => 200, - _ => res.status_code, - }; - Ok(ErrorResponse { - status_code, - code: response.status_error_code.to_string(), - message: response.status_error_details.clone(), - reason: Some(format!( - "{}, additional info: {}", - response.status_error_details, response.status_additional_info - )), - attempt_status: None, - connector_transaction_id: None, - }) + let response: Result< + payme::PaymeErrorResponse, + Report, + > = res.response.parse_struct("PaymeErrorResponse"); + + match response { + Ok(response_data) => { + event_builder.map(|i| i.set_error_response_body(&response_data)); + router_env::logger::info!(connector_response=?response_data); + let status_code = match res.status_code { + 500..=511 => 200, + _ => res.status_code, + }; + Ok(ErrorResponse { + status_code, + code: response_data.status_error_code.to_string(), + message: response_data.status_error_details.clone(), + reason: Some(format!( + "{}, additional info: {}", + response_data.status_error_details, response_data.status_additional_info + )), + attempt_status: None, + connector_transaction_id: None, + }) + } + Err(error_msg) => { + event_builder.map(|event| event.set_error(serde_json::json!({"error": res.response.escape_ascii().to_string(), "status_code": res.status_code}))); + router_env::logger::error!(deserialization_error =? error_msg); + handle_json_response_deserialization_failure(res, "payme".to_owned()) + } + } } } diff --git a/crates/router/src/core/payments/operations/payment_response.rs b/crates/router/src/core/payments/operations/payment_response.rs index 099eae71800..33e8ff26edc 100644 --- a/crates/router/src/core/payments/operations/payment_response.rs +++ b/crates/router/src/core/payments/operations/payment_response.rs @@ -483,6 +483,13 @@ async fn payment_response_update_tracker( 200..=299 => storage::enums::AttemptStatus::Failure, _ => router_data.status, } + } else if flow_name == "Capture" { + match err.status_code { + 500..=511 => storage::enums::AttemptStatus::Pending, + // don't update the status for 429 error status + 429 => router_data.status, + _ => storage::enums::AttemptStatus::Failure, + } } else { match err.status_code { 500..=511 => storage::enums::AttemptStatus::Pending,