mirror of
https://github.com/juspay/hyperswitch.git
synced 2025-11-03 13:30:39 +08:00
fix(connector): [Klarna] Handle error response with both error_messages and error_message fields (#1783)
This commit is contained in:
@ -8,6 +8,7 @@ use transformers as klarna;
|
|||||||
use crate::{
|
use crate::{
|
||||||
configs::settings,
|
configs::settings,
|
||||||
connector::utils as connector_utils,
|
connector::utils as connector_utils,
|
||||||
|
consts,
|
||||||
core::errors::{self, CustomResult},
|
core::errors::{self, CustomResult},
|
||||||
headers,
|
headers,
|
||||||
services::{
|
services::{
|
||||||
@ -50,6 +51,27 @@ impl ConnectorCommon for Klarna {
|
|||||||
auth.basic_token.into_masked(),
|
auth.basic_token.into_masked(),
|
||||||
)])
|
)])
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn build_error_response(
|
||||||
|
&self,
|
||||||
|
res: types::Response,
|
||||||
|
) -> CustomResult<types::ErrorResponse, errors::ConnectorError> {
|
||||||
|
let response: klarna::KlarnaErrorResponse = res
|
||||||
|
.response
|
||||||
|
.parse_struct("KlarnaErrorResponse")
|
||||||
|
.change_context(errors::ConnectorError::ResponseDeserializationFailed)?;
|
||||||
|
// KlarnaErrorResponse will either have error_messages or error_message field Ref: https://docs.klarna.com/api/errors/
|
||||||
|
let reason = response
|
||||||
|
.error_messages
|
||||||
|
.map(|messages| messages.join(" & "))
|
||||||
|
.or(response.error_message);
|
||||||
|
Ok(types::ErrorResponse {
|
||||||
|
status_code: res.status_code,
|
||||||
|
code: response.error_code,
|
||||||
|
message: consts::NO_ERROR_MESSAGE.to_string(),
|
||||||
|
reason,
|
||||||
|
})
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl api::Payment for Klarna {}
|
impl api::Payment for Klarna {}
|
||||||
@ -174,16 +196,7 @@ impl
|
|||||||
&self,
|
&self,
|
||||||
res: types::Response,
|
res: types::Response,
|
||||||
) -> CustomResult<types::ErrorResponse, errors::ConnectorError> {
|
) -> CustomResult<types::ErrorResponse, errors::ConnectorError> {
|
||||||
let response: klarna::KlarnaErrorResponse = res
|
self.build_error_response(res)
|
||||||
.response
|
|
||||||
.parse_struct("KlarnaErrorResponse")
|
|
||||||
.change_context(errors::ConnectorError::ResponseDeserializationFailed)?;
|
|
||||||
Ok(types::ErrorResponse {
|
|
||||||
status_code: res.status_code,
|
|
||||||
code: response.error_code,
|
|
||||||
message: response.error_messages.join(" & "),
|
|
||||||
reason: None,
|
|
||||||
})
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -338,16 +351,7 @@ impl
|
|||||||
&self,
|
&self,
|
||||||
res: types::Response,
|
res: types::Response,
|
||||||
) -> CustomResult<types::ErrorResponse, errors::ConnectorError> {
|
) -> CustomResult<types::ErrorResponse, errors::ConnectorError> {
|
||||||
let response: klarna::KlarnaErrorResponse = res
|
self.build_error_response(res)
|
||||||
.response
|
|
||||||
.parse_struct("KlarnaErrorResponse")
|
|
||||||
.change_context(errors::ConnectorError::ResponseDeserializationFailed)?;
|
|
||||||
Ok(types::ErrorResponse {
|
|
||||||
status_code: res.status_code,
|
|
||||||
code: response.error_code,
|
|
||||||
message: response.error_messages.join(" & "),
|
|
||||||
reason: None,
|
|
||||||
})
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -189,5 +189,6 @@ impl From<KlarnaFraudStatus> for enums::AttemptStatus {
|
|||||||
#[derive(Deserialize)]
|
#[derive(Deserialize)]
|
||||||
pub struct KlarnaErrorResponse {
|
pub struct KlarnaErrorResponse {
|
||||||
pub error_code: String,
|
pub error_code: String,
|
||||||
pub error_messages: Vec<String>,
|
pub error_messages: Option<Vec<String>>,
|
||||||
|
pub error_message: Option<String>,
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user