feat(router): handle authorization for frictionless flow in external 3ds flow (#4471)

This commit is contained in:
Sai Harsha Vardhan
2024-04-29 15:17:29 +05:30
committed by GitHub
parent 01ec7c64a4
commit 79d8949413
2 changed files with 21 additions and 2 deletions

View File

@ -1160,6 +1160,20 @@ impl<Ctx: PaymentMethodRetrieve> PaymentRedirectFlow<Ctx> for PaymentAuthenticat
) )
.await .await
.to_not_found_response(errors::ApiErrorResponse::PaymentNotFound)?; .to_not_found_response(errors::ApiErrorResponse::PaymentNotFound)?;
let authentication_id = payment_attempt
.authentication_id
.ok_or(errors::ApiErrorResponse::InternalServerError)
.attach_printable("missing authentication_id in payment_attempt")?;
let authentication = state
.store
.find_authentication_by_merchant_id_authentication_id(
merchant_id.clone(),
authentication_id.clone(),
)
.await
.to_not_found_response(errors::ApiErrorResponse::AuthenticationNotFound {
id: authentication_id,
})?;
// Fetching merchant_connector_account to check if pull_mechanism is enabled for 3ds connector // Fetching merchant_connector_account to check if pull_mechanism is enabled for 3ds connector
let authentication_merchant_connector_account = helpers::get_merchant_connector_account( let authentication_merchant_connector_account = helpers::get_merchant_connector_account(
state, state,
@ -1183,7 +1197,10 @@ impl<Ctx: PaymentMethodRetrieve> PaymentRedirectFlow<Ctx> for PaymentAuthenticat
.get_metadata() .get_metadata()
.map(|metadata| metadata.expose()), .map(|metadata| metadata.expose()),
); );
let response = if is_pull_mechanism_enabled { let response = if is_pull_mechanism_enabled
|| authentication.authentication_type
== Some(common_enums::DecoupledAuthenticationType::Frictionless)
{
let payment_confirm_req = api::PaymentsRequest { let payment_confirm_req = api::PaymentsRequest {
payment_id: Some(req.resource_id.clone()), payment_id: Some(req.resource_id.clone()),
merchant_id: req.merchant_id.clone(), merchant_id: req.merchant_id.clone(),

View File

@ -490,8 +490,10 @@ pub async fn external_authentication_incoming_webhook_flow<Ctx: PaymentMethodRet
// Check if it's a payment authentication flow, payment_id would be there only for payment authentication flows // Check if it's a payment authentication flow, payment_id would be there only for payment authentication flows
if let Some(payment_id) = updated_authentication.payment_id { if let Some(payment_id) = updated_authentication.payment_id {
let is_pull_mechanism_enabled = helper_utils::check_if_pull_mechanism_for_external_3ds_enabled_from_connector_metadata(merchant_connector_account.metadata.map(|metadata| metadata.expose())); let is_pull_mechanism_enabled = helper_utils::check_if_pull_mechanism_for_external_3ds_enabled_from_connector_metadata(merchant_connector_account.metadata.map(|metadata| metadata.expose()));
// Merchant doesn't have pull mechanism enabled, so we have to authorize whenever we receive a ARes webhook // Merchant doesn't have pull mechanism enabled and if it's challenge flow, we have to authorize whenever we receive a ARes webhook
if !is_pull_mechanism_enabled if !is_pull_mechanism_enabled
&& updated_authentication.authentication_type
== Some(common_enums::DecoupledAuthenticationType::Challenge)
&& event_type == webhooks::IncomingWebhookEvent::ExternalAuthenticationARes && event_type == webhooks::IncomingWebhookEvent::ExternalAuthenticationARes
{ {
let payment_confirm_req = api::PaymentsRequest { let payment_confirm_req = api::PaymentsRequest {