fix(connector): [Paypal] Parse response for Cards with no 3DS check (#3021)

This commit is contained in:
Sakil Mostak
2023-12-01 15:26:41 +05:30
committed by GitHub
parent 2ac5b2cd76
commit d883cd1897
2 changed files with 102 additions and 69 deletions

View File

@ -570,42 +570,95 @@ impl
.parse_struct("paypal PaypalPreProcessingResponse")
.change_context(errors::ConnectorError::ResponseDeserializationFailed)?;
// permutation for status to continue payment
match (
response
.payment_source
.card
.authentication_result
.three_d_secure
.enrollment_status
.as_ref(),
response
.payment_source
.card
.authentication_result
.three_d_secure
.authentication_status
.as_ref(),
response
.payment_source
.card
.authentication_result
.liability_shift
.clone(),
) {
(
Some(paypal::EnrollementStatus::Ready),
Some(paypal::AuthenticationStatus::Success),
paypal::LiabilityShift::Possible,
)
| (
Some(paypal::EnrollementStatus::Ready),
Some(paypal::AuthenticationStatus::Attempted),
paypal::LiabilityShift::Possible,
)
| (Some(paypal::EnrollementStatus::NotReady), None, paypal::LiabilityShift::No)
| (Some(paypal::EnrollementStatus::Unavailable), None, paypal::LiabilityShift::No)
| (Some(paypal::EnrollementStatus::Bypassed), None, paypal::LiabilityShift::No) => {
match response {
// if card supports 3DS check for liability
paypal::PaypalPreProcessingResponse::PaypalLiabilityResponse(liability_response) => {
// permutation for status to continue payment
match (
liability_response
.payment_source
.card
.authentication_result
.three_d_secure
.enrollment_status
.as_ref(),
liability_response
.payment_source
.card
.authentication_result
.three_d_secure
.authentication_status
.as_ref(),
liability_response
.payment_source
.card
.authentication_result
.liability_shift
.clone(),
) {
(
Some(paypal::EnrollementStatus::Ready),
Some(paypal::AuthenticationStatus::Success),
paypal::LiabilityShift::Possible,
)
| (
Some(paypal::EnrollementStatus::Ready),
Some(paypal::AuthenticationStatus::Attempted),
paypal::LiabilityShift::Possible,
)
| (Some(paypal::EnrollementStatus::NotReady), None, paypal::LiabilityShift::No)
| (Some(paypal::EnrollementStatus::Unavailable), None, paypal::LiabilityShift::No)
| (Some(paypal::EnrollementStatus::Bypassed), None, paypal::LiabilityShift::No) => {
Ok(types::PaymentsPreProcessingRouterData {
status: storage_enums::AttemptStatus::AuthenticationSuccessful,
response: Ok(types::PaymentsResponseData::TransactionResponse {
resource_id: types::ResponseId::NoResponseId,
redirection_data: None,
mandate_reference: None,
connector_metadata: None,
network_txn_id: None,
connector_response_reference_id: None,
incremental_authorization_allowed: None,
}),
..data.clone()
})
}
_ => Ok(types::PaymentsPreProcessingRouterData {
response: Err(ErrorResponse {
attempt_status: Some(enums::AttemptStatus::Failure),
code: consts::NO_ERROR_CODE.to_string(),
message: consts::NO_ERROR_MESSAGE.to_string(),
connector_transaction_id: None,
reason: Some(format!("{} Connector Responsded with LiabilityShift: {:?}, EnrollmentStatus: {:?}, and AuthenticationStatus: {:?}",
consts::CANNOT_CONTINUE_AUTH,
liability_response
.payment_source
.card
.authentication_result
.liability_shift,
liability_response
.payment_source
.card
.authentication_result
.three_d_secure
.enrollment_status
.unwrap_or(paypal::EnrollementStatus::Null),
liability_response
.payment_source
.card
.authentication_result
.three_d_secure
.authentication_status
.unwrap_or(paypal::AuthenticationStatus::Null),
)),
status_code: res.status_code,
}),
..data.clone()
}),
}
}
// if card does not supports 3DS check for liability
paypal::PaypalPreProcessingResponse::PaypalNonLiablityResponse(_) => {
Ok(types::PaymentsPreProcessingRouterData {
status: storage_enums::AttemptStatus::AuthenticationSuccessful,
response: Ok(types::PaymentsResponseData::TransactionResponse {
@ -620,38 +673,6 @@ impl
..data.clone()
})
}
_ => Ok(types::PaymentsPreProcessingRouterData {
response: Err(ErrorResponse {
attempt_status: Some(enums::AttemptStatus::Failure),
code: consts::NO_ERROR_CODE.to_string(),
message: consts::NO_ERROR_MESSAGE.to_string(),
connector_transaction_id: None,
reason: Some(format!("{} Connector Responsded with LiabilityShift: {:?}, EnrollmentStatus: {:?}, and AuthenticationStatus: {:?}",
consts::CANNOT_CONTINUE_AUTH,
response
.payment_source
.card
.authentication_result
.liability_shift,
response
.payment_source
.card
.authentication_result
.three_d_secure
.enrollment_status
.unwrap_or(paypal::EnrollementStatus::Null),
response
.payment_source
.card
.authentication_result
.three_d_secure
.authentication_status
.unwrap_or(paypal::AuthenticationStatus::Null),
)),
status_code: res.status_code,
}),
..data.clone()
}),
}
}

View File

@ -926,10 +926,22 @@ pub struct PaypalThreeDsResponse {
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct PaypalPreProcessingResponse {
#[serde(untagged)]
pub enum PaypalPreProcessingResponse {
PaypalLiabilityResponse(PaypalLiabilityResponse),
PaypalNonLiablityResponse(PaypalNonLiablityResponse),
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct PaypalLiabilityResponse {
pub payment_source: CardParams,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct PaypalNonLiablityResponse {
payment_source: CardsData,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct CardParams {
pub card: AuthResult,