mirror of
https://github.com/juspay/hyperswitch.git
synced 2025-10-29 00:49:42 +08:00
fix(connector): change capture status to pending when waiting for settlement (#420)
This commit is contained in:
@ -247,12 +247,14 @@ impl ConnectorIntegration<api::Capture, types::PaymentsCaptureData, types::Payme
|
|||||||
.parse_struct("Cybersource PaymentResponse")
|
.parse_struct("Cybersource PaymentResponse")
|
||||||
.change_context(errors::ConnectorError::ResponseDeserializationFailed)?;
|
.change_context(errors::ConnectorError::ResponseDeserializationFailed)?;
|
||||||
logger::debug!(cybersourcepayments_create_response=?response);
|
logger::debug!(cybersourcepayments_create_response=?response);
|
||||||
types::ResponseRouterData {
|
types::RouterData::try_from((
|
||||||
response,
|
types::ResponseRouterData {
|
||||||
data: data.clone(),
|
response,
|
||||||
http_code: res.status_code,
|
data: data.clone(),
|
||||||
}
|
http_code: res.status_code,
|
||||||
.try_into()
|
},
|
||||||
|
true,
|
||||||
|
))
|
||||||
.change_context(errors::ConnectorError::ResponseHandlingFailed)
|
.change_context(errors::ConnectorError::ResponseHandlingFailed)
|
||||||
}
|
}
|
||||||
fn get_error_response(
|
fn get_error_response(
|
||||||
@ -328,12 +330,16 @@ impl ConnectorIntegration<api::PSync, types::PaymentsSyncData, types::PaymentsRe
|
|||||||
.parse_struct("Cybersource PaymentSyncResponse")
|
.parse_struct("Cybersource PaymentSyncResponse")
|
||||||
.change_context(errors::ConnectorError::ResponseDeserializationFailed)?;
|
.change_context(errors::ConnectorError::ResponseDeserializationFailed)?;
|
||||||
logger::debug!(cybersourcepayments_create_response=?response);
|
logger::debug!(cybersourcepayments_create_response=?response);
|
||||||
types::ResponseRouterData {
|
let is_auto_capture =
|
||||||
response,
|
data.request.capture_method == Some(storage_models::enums::CaptureMethod::Automatic);
|
||||||
data: data.clone(),
|
types::RouterData::try_from((
|
||||||
http_code: res.status_code,
|
types::ResponseRouterData {
|
||||||
}
|
response,
|
||||||
.try_into()
|
data: data.clone(),
|
||||||
|
http_code: res.status_code,
|
||||||
|
},
|
||||||
|
is_auto_capture,
|
||||||
|
))
|
||||||
.change_context(errors::ConnectorError::ResponseHandlingFailed)
|
.change_context(errors::ConnectorError::ResponseHandlingFailed)
|
||||||
}
|
}
|
||||||
fn get_error_response(
|
fn get_error_response(
|
||||||
@ -412,12 +418,16 @@ impl ConnectorIntegration<api::Authorize, types::PaymentsAuthorizeData, types::P
|
|||||||
.parse_struct("Cybersource PaymentResponse")
|
.parse_struct("Cybersource PaymentResponse")
|
||||||
.change_context(errors::ConnectorError::ResponseDeserializationFailed)?;
|
.change_context(errors::ConnectorError::ResponseDeserializationFailed)?;
|
||||||
logger::debug!(cybersourcepayments_create_response=?response);
|
logger::debug!(cybersourcepayments_create_response=?response);
|
||||||
types::ResponseRouterData {
|
let is_auto_capture =
|
||||||
response,
|
data.request.capture_method == Some(storage_models::enums::CaptureMethod::Automatic);
|
||||||
data: data.clone(),
|
types::RouterData::try_from((
|
||||||
http_code: res.status_code,
|
types::ResponseRouterData {
|
||||||
}
|
response,
|
||||||
.try_into()
|
data: data.clone(),
|
||||||
|
http_code: res.status_code,
|
||||||
|
},
|
||||||
|
is_auto_capture,
|
||||||
|
))
|
||||||
.change_context(errors::ConnectorError::ResponseHandlingFailed)
|
.change_context(errors::ConnectorError::ResponseHandlingFailed)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -489,12 +499,14 @@ impl ConnectorIntegration<api::Void, types::PaymentsCancelData, types::PaymentsR
|
|||||||
.parse_struct("Cybersource PaymentResponse")
|
.parse_struct("Cybersource PaymentResponse")
|
||||||
.change_context(errors::ConnectorError::ResponseDeserializationFailed)?;
|
.change_context(errors::ConnectorError::ResponseDeserializationFailed)?;
|
||||||
logger::debug!(cybersourcepayments_create_response=?response);
|
logger::debug!(cybersourcepayments_create_response=?response);
|
||||||
types::ResponseRouterData {
|
types::RouterData::try_from((
|
||||||
response,
|
types::ResponseRouterData {
|
||||||
data: data.clone(),
|
response,
|
||||||
http_code: res.status_code,
|
data: data.clone(),
|
||||||
}
|
http_code: res.status_code,
|
||||||
.try_into()
|
},
|
||||||
|
false,
|
||||||
|
))
|
||||||
.change_context(errors::ConnectorError::ResponseHandlingFailed)
|
.change_context(errors::ConnectorError::ResponseHandlingFailed)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -641,7 +653,7 @@ impl ConnectorIntegration<api::RSync, types::RefundsData, types::RefundsResponse
|
|||||||
) -> CustomResult<types::RefundSyncRouterData, errors::ConnectorError> {
|
) -> CustomResult<types::RefundSyncRouterData, errors::ConnectorError> {
|
||||||
let response: cybersource::CybersourceTransactionResponse = res
|
let response: cybersource::CybersourceTransactionResponse = res
|
||||||
.response
|
.response
|
||||||
.parse_struct("Cybersource PaymentSyncResponse")
|
.parse_struct("Cybersource RefundsSyncResponse")
|
||||||
.change_context(errors::ConnectorError::ResponseDeserializationFailed)?;
|
.change_context(errors::ConnectorError::ResponseDeserializationFailed)?;
|
||||||
logger::debug!(cybersourcepayments_create_response=?response);
|
logger::debug!(cybersourcepayments_create_response=?response);
|
||||||
types::ResponseRouterData {
|
types::ResponseRouterData {
|
||||||
|
|||||||
@ -280,21 +280,27 @@ pub struct CybersourceErrorInformation {
|
|||||||
}
|
}
|
||||||
|
|
||||||
impl<F, T>
|
impl<F, T>
|
||||||
TryFrom<
|
TryFrom<(
|
||||||
types::ResponseRouterData<F, CybersourcePaymentsResponse, T, types::PaymentsResponseData>,
|
types::ResponseRouterData<F, CybersourcePaymentsResponse, T, types::PaymentsResponseData>,
|
||||||
> for types::RouterData<F, T, types::PaymentsResponseData>
|
bool,
|
||||||
|
)> for types::RouterData<F, T, types::PaymentsResponseData>
|
||||||
{
|
{
|
||||||
type Error = error_stack::Report<errors::ParsingError>;
|
type Error = error_stack::Report<errors::ParsingError>;
|
||||||
fn try_from(
|
fn try_from(
|
||||||
item: types::ResponseRouterData<
|
data: (
|
||||||
F,
|
types::ResponseRouterData<
|
||||||
CybersourcePaymentsResponse,
|
F,
|
||||||
T,
|
CybersourcePaymentsResponse,
|
||||||
types::PaymentsResponseData,
|
T,
|
||||||
>,
|
types::PaymentsResponseData,
|
||||||
|
>,
|
||||||
|
bool,
|
||||||
|
),
|
||||||
) -> Result<Self, Self::Error> {
|
) -> Result<Self, Self::Error> {
|
||||||
|
let item = data.0;
|
||||||
|
let is_capture = data.1;
|
||||||
Ok(Self {
|
Ok(Self {
|
||||||
status: item.response.status.into(),
|
status: get_payment_status(is_capture, item.response.status.into()),
|
||||||
response: match item.response.error_information {
|
response: match item.response.error_information {
|
||||||
Some(error) => Err(types::ErrorResponse {
|
Some(error) => Err(types::ErrorResponse {
|
||||||
code: consts::NO_ERROR_CODE.to_string(),
|
code: consts::NO_ERROR_CODE.to_string(),
|
||||||
@ -328,27 +334,44 @@ pub struct ApplicationInformation {
|
|||||||
status: CybersourcePaymentStatus,
|
status: CybersourcePaymentStatus,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn get_payment_status(is_capture: bool, status: enums::AttemptStatus) -> enums::AttemptStatus {
|
||||||
|
let is_authorized = matches!(status, enums::AttemptStatus::Authorized);
|
||||||
|
if is_capture && is_authorized {
|
||||||
|
return enums::AttemptStatus::Pending;
|
||||||
|
}
|
||||||
|
status
|
||||||
|
}
|
||||||
|
|
||||||
impl<F, T>
|
impl<F, T>
|
||||||
TryFrom<
|
TryFrom<(
|
||||||
types::ResponseRouterData<
|
types::ResponseRouterData<
|
||||||
F,
|
F,
|
||||||
CybersourceTransactionResponse,
|
CybersourceTransactionResponse,
|
||||||
T,
|
T,
|
||||||
types::PaymentsResponseData,
|
types::PaymentsResponseData,
|
||||||
>,
|
>,
|
||||||
> for types::RouterData<F, T, types::PaymentsResponseData>
|
bool,
|
||||||
|
)> for types::RouterData<F, T, types::PaymentsResponseData>
|
||||||
{
|
{
|
||||||
type Error = error_stack::Report<errors::ParsingError>;
|
type Error = error_stack::Report<errors::ParsingError>;
|
||||||
fn try_from(
|
fn try_from(
|
||||||
item: types::ResponseRouterData<
|
data: (
|
||||||
F,
|
types::ResponseRouterData<
|
||||||
CybersourceTransactionResponse,
|
F,
|
||||||
T,
|
CybersourceTransactionResponse,
|
||||||
types::PaymentsResponseData,
|
T,
|
||||||
>,
|
types::PaymentsResponseData,
|
||||||
|
>,
|
||||||
|
bool,
|
||||||
|
),
|
||||||
) -> Result<Self, Self::Error> {
|
) -> Result<Self, Self::Error> {
|
||||||
|
let item = data.0;
|
||||||
|
let is_capture = data.1;
|
||||||
Ok(Self {
|
Ok(Self {
|
||||||
status: item.response.application_information.status.into(),
|
status: get_payment_status(
|
||||||
|
is_capture,
|
||||||
|
item.response.application_information.status.into(),
|
||||||
|
),
|
||||||
response: Ok(types::PaymentsResponseData::TransactionResponse {
|
response: Ok(types::PaymentsResponseData::TransactionResponse {
|
||||||
resource_id: types::ResponseId::ConnectorTransactionId(item.response.id),
|
resource_id: types::ResponseId::ConnectorTransactionId(item.response.id),
|
||||||
redirection_data: None,
|
redirection_data: None,
|
||||||
|
|||||||
Reference in New Issue
Block a user