@@ -784,62 +784,109 @@ pub async fn add_payment_method_token<F: Clone, T: types::Tokenizable + Clone>(
784
784
tokenization_action : & payments:: TokenizationAction ,
785
785
router_data : & mut types:: RouterData < F , T , types:: PaymentsResponseData > ,
786
786
pm_token_request_data : types:: PaymentMethodTokenizationData ,
787
- ) -> RouterResult < Option < String > > {
788
- match tokenization_action {
789
- payments:: TokenizationAction :: TokenizeInConnector
790
- | payments:: TokenizationAction :: TokenizeInConnectorAndApplepayPreDecrypt ( _) => {
791
- let connector_integration: services:: BoxedPaymentConnectorIntegrationInterface <
792
- api:: PaymentMethodToken ,
793
- types:: PaymentMethodTokenizationData ,
794
- types:: PaymentsResponseData ,
795
- > = connector. connector . get_connector_integration ( ) ;
796
-
797
- let pm_token_response_data: Result < types:: PaymentsResponseData , types:: ErrorResponse > =
798
- Err ( types:: ErrorResponse :: default ( ) ) ;
799
-
800
- let pm_token_router_data =
801
- helpers:: router_data_type_conversion :: < _ , api:: PaymentMethodToken , _ , _ , _ , _ > (
802
- router_data. clone ( ) ,
803
- pm_token_request_data,
804
- pm_token_response_data,
787
+ should_continue_payment : bool ,
788
+ ) -> RouterResult < types:: PaymentMethodTokenResult > {
789
+ if should_continue_payment {
790
+ match tokenization_action {
791
+ payments:: TokenizationAction :: TokenizeInConnector
792
+ | payments:: TokenizationAction :: TokenizeInConnectorAndApplepayPreDecrypt ( _) => {
793
+ let connector_integration: services:: BoxedPaymentConnectorIntegrationInterface <
794
+ api:: PaymentMethodToken ,
795
+ types:: PaymentMethodTokenizationData ,
796
+ types:: PaymentsResponseData ,
797
+ > = connector. connector . get_connector_integration ( ) ;
798
+
799
+ let pm_token_response_data: Result <
800
+ types:: PaymentsResponseData ,
801
+ types:: ErrorResponse ,
802
+ > = Err ( types:: ErrorResponse :: default ( ) ) ;
803
+
804
+ let pm_token_router_data =
805
+ helpers:: router_data_type_conversion :: < _ , api:: PaymentMethodToken , _ , _ , _ , _ > (
806
+ router_data. clone ( ) ,
807
+ pm_token_request_data,
808
+ pm_token_response_data,
809
+ ) ;
810
+
811
+ router_data
812
+ . request
813
+ . set_session_token ( pm_token_router_data. session_token . clone ( ) ) ;
814
+
815
+ let resp = services:: execute_connector_processing_step (
816
+ state,
817
+ connector_integration,
818
+ & pm_token_router_data,
819
+ payments:: CallConnectorAction :: Trigger ,
820
+ None ,
821
+ )
822
+ . await
823
+ . to_payment_failed_response ( ) ?;
824
+
825
+ metrics:: CONNECTOR_PAYMENT_METHOD_TOKENIZATION . add (
826
+ & metrics:: CONTEXT ,
827
+ 1 ,
828
+ & add_attributes ( [
829
+ ( "connector" , connector. connector_name . to_string ( ) ) ,
830
+ ( "payment_method" , router_data. payment_method . to_string ( ) ) ,
831
+ ] ) ,
805
832
) ;
806
833
807
- router_data
808
- . request
809
- . set_session_token ( pm_token_router_data. session_token . clone ( ) ) ;
810
-
811
- let resp = services:: execute_connector_processing_step (
812
- state,
813
- connector_integration,
814
- & pm_token_router_data,
815
- payments:: CallConnectorAction :: Trigger ,
816
- None ,
817
- )
818
- . await
819
- . to_payment_failed_response ( ) ?;
820
-
821
- metrics:: CONNECTOR_PAYMENT_METHOD_TOKENIZATION . add (
822
- & metrics:: CONTEXT ,
823
- 1 ,
824
- & add_attributes ( [
825
- ( "connector" , connector. connector_name . to_string ( ) ) ,
826
- ( "payment_method" , router_data. payment_method . to_string ( ) ) ,
827
- ] ) ,
828
- ) ;
829
-
830
- let pm_token = match resp. response {
831
- Ok ( response) => match response {
832
- types:: PaymentsResponseData :: TokenizationResponse { token } => Some ( token) ,
833
- _ => None ,
834
- } ,
835
- Err ( err) => {
834
+ let payment_token_resp = resp. response . map ( |res| {
835
+ if let types:: PaymentsResponseData :: TokenizationResponse { token } = res {
836
+ Some ( token)
837
+ } else {
838
+ None
839
+ }
840
+ } ) ;
841
+
842
+ Ok ( types:: PaymentMethodTokenResult {
843
+ payment_method_token_result : payment_token_resp,
844
+ is_payment_method_tokenization_performed : true ,
845
+ } )
846
+ }
847
+ _ => Ok ( types:: PaymentMethodTokenResult {
848
+ payment_method_token_result : Ok ( None ) ,
849
+ is_payment_method_tokenization_performed : false ,
850
+ } ) ,
851
+ }
852
+ } else {
853
+ logger:: debug!( "Skipping connector tokenization based on should_continue_payment flag" ) ;
854
+ Ok ( types:: PaymentMethodTokenResult {
855
+ payment_method_token_result : Ok ( None ) ,
856
+ is_payment_method_tokenization_performed : false ,
857
+ } )
858
+ }
859
+ }
860
+
861
+ pub fn update_router_data_with_payment_method_token_result < F : Clone , T > (
862
+ payment_method_token_result : types:: PaymentMethodTokenResult ,
863
+ router_data : & mut types:: RouterData < F , T , types:: PaymentsResponseData > ,
864
+ is_retry_payment : bool ,
865
+ should_continue_further : bool ,
866
+ ) -> bool {
867
+ if payment_method_token_result. is_payment_method_tokenization_performed {
868
+ match payment_method_token_result. payment_method_token_result {
869
+ Ok ( pm_token_result) => {
870
+ router_data. payment_method_token = pm_token_result. map ( |pm_token| {
871
+ hyperswitch_domain_models:: router_data:: PaymentMethodToken :: Token (
872
+ masking:: Secret :: new ( pm_token) ,
873
+ )
874
+ } ) ;
875
+
876
+ true
877
+ }
878
+ Err ( err) => {
879
+ if is_retry_payment {
880
+ router_data. response = Err ( err) ;
881
+ false
882
+ } else {
836
883
logger:: debug!( payment_method_tokenization_error=?err) ;
837
- None
884
+ true
838
885
}
839
- } ;
840
- Ok ( pm_token)
886
+ }
841
887
}
842
- _ => Ok ( None ) ,
888
+ } else {
889
+ should_continue_further
843
890
}
844
891
}
845
892
0 commit comments