Skip to content

Commit d95a64d

Browse files
authored
feat(connector): [Paypal] Implement 3DS for Cards (#2443)
1 parent 53b4816 commit d95a64d

File tree

2 files changed

+242
-25
lines changed

2 files changed

+242
-25
lines changed

crates/router/src/connector/paypal.rs

Lines changed: 35 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,8 @@ use error_stack::{IntoReport, ResultExt};
88
use masking::PeekInterface;
99
use transformers as paypal;
1010

11-
use self::transformers::PaypalMeta;
11+
use self::transformers::{PaypalAuthResponse, PaypalMeta};
12+
use super::utils::PaymentsCompleteAuthorizeRequestData;
1213
use crate::{
1314
configs::settings,
1415
connector::{
@@ -391,24 +392,27 @@ impl ConnectorIntegration<api::Authorize, types::PaymentsAuthorizeData, types::P
391392
data: &types::PaymentsAuthorizeRouterData,
392393
res: Response,
393394
) -> CustomResult<types::PaymentsAuthorizeRouterData, errors::ConnectorError> {
394-
match data.payment_method {
395-
diesel_models::enums::PaymentMethod::Wallet
396-
| diesel_models::enums::PaymentMethod::BankRedirect => {
397-
let response: paypal::PaypalRedirectResponse = res
398-
.response
399-
.parse_struct("paypal PaymentsRedirectResponse")
400-
.change_context(errors::ConnectorError::ResponseDeserializationFailed)?;
395+
let response: PaypalAuthResponse =
396+
res.response
397+
.parse_struct("paypal PaypalAuthResponse")
398+
.change_context(errors::ConnectorError::ResponseDeserializationFailed)?;
399+
400+
match response {
401+
PaypalAuthResponse::PaypalOrdersResponse(response) => {
401402
types::RouterData::try_from(types::ResponseRouterData {
402403
response,
403404
data: data.clone(),
404405
http_code: res.status_code,
405406
})
406407
}
407-
_ => {
408-
let response: paypal::PaypalOrdersResponse = res
409-
.response
410-
.parse_struct("paypal PaymentsOrderResponse")
411-
.change_context(errors::ConnectorError::ResponseDeserializationFailed)?;
408+
PaypalAuthResponse::PaypalRedirectResponse(response) => {
409+
types::RouterData::try_from(types::ResponseRouterData {
410+
response,
411+
data: data.clone(),
412+
http_code: res.status_code,
413+
})
414+
}
415+
PaypalAuthResponse::PaypalThreeDsResponse(response) => {
412416
types::RouterData::try_from(types::ResponseRouterData {
413417
response,
414418
data: data.clone(),
@@ -450,10 +454,10 @@ impl
450454
req: &types::PaymentsCompleteAuthorizeRouterData,
451455
connectors: &settings::Connectors,
452456
) -> CustomResult<String, errors::ConnectorError> {
453-
let paypal_meta: PaypalMeta = to_connector_meta(req.request.connector_meta.clone())?;
454-
let complete_authorize_url = match paypal_meta.psync_flow {
455-
transformers::PaypalPaymentIntent::Authorize => "authorize".to_string(),
456-
transformers::PaypalPaymentIntent::Capture => "capture".to_string(),
457+
let complete_authorize_url = if req.request.is_auto_capture()? {
458+
"capture".to_string()
459+
} else {
460+
"authorize".to_string()
457461
};
458462
Ok(format!(
459463
"{}v2/checkout/orders/{}/{complete_authorize_url}",
@@ -493,7 +497,7 @@ impl
493497
) -> CustomResult<types::PaymentsCompleteAuthorizeRouterData, errors::ConnectorError> {
494498
let response: paypal::PaypalOrdersResponse = res
495499
.response
496-
.parse_struct("paypal PaymentsOrderResponse")
500+
.parse_struct("paypal PaypalOrdersResponse")
497501
.change_context(errors::ConnectorError::ResponseDeserializationFailed)?;
498502
types::RouterData::try_from(types::ResponseRouterData {
499503
response,
@@ -559,6 +563,19 @@ impl ConnectorIntegration<api::PSync, types::PaymentsSyncData, types::PaymentsRe
559563
)?;
560564
format!("v2/payments/captures/{capture_id}")
561565
}
566+
// only set when payment is done through card 3DS
567+
//because no authorize or capture id is generated during payment authorize call for card 3DS
568+
transformers::PaypalPaymentIntent::Authenticate => {
569+
format!(
570+
"v2/checkout/orders/{}",
571+
req.request
572+
.connector_transaction_id
573+
.get_connector_transaction_id()
574+
.change_context(
575+
errors::ConnectorError::MissingConnectorTransactionID
576+
)?
577+
)
578+
}
562579
};
563580
Ok(format!("{}{psync_url}", self.base_url(connectors)))
564581
}

0 commit comments

Comments
 (0)