mirror of
https://github.com/juspay/hyperswitch.git
synced 2025-10-30 01:27:31 +08:00
feat(router): handle authorization for frictionless flow in external 3ds flow (#4471)
This commit is contained in:
committed by
GitHub
parent
01ec7c64a4
commit
79d8949413
@ -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(),
|
||||||
|
|||||||
@ -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 {
|
||||||
|
|||||||
Reference in New Issue
Block a user