mirror of
				https://github.com/juspay/hyperswitch.git
				synced 2025-10-31 18:17:13 +08:00 
			
		
		
		
	feat(router): handle authorization for frictionless flow in external 3ds flow (#4471)
This commit is contained in:
		 Sai Harsha Vardhan
					Sai Harsha Vardhan
				
			
				
					committed by
					
						 GitHub
						GitHub
					
				
			
			
				
	
			
			
			 GitHub
						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