mirror of
				https://github.com/juspay/hyperswitch.git
				synced 2025-10-31 10:06:32 +08:00 
			
		
		
		
	fix(connector): [CashToCode]Fix cashtocode redirection for evoucher pm type (#3131)
Co-authored-by: Nitesh Balla <nitesh.balla@juspay.in> Co-authored-by: Arjun Karthik <m.arjunkarthik@gmail.com>
This commit is contained in:
		| @ -1,6 +1,7 @@ | |||||||
| use std::collections::HashMap; | use std::collections::HashMap; | ||||||
|  |  | ||||||
| use common_utils::{ext_traits::ValueExt, pii::Email}; | pub use common_utils::request::Method; | ||||||
|  | use common_utils::{errors::CustomResult, ext_traits::ValueExt, pii::Email}; | ||||||
| use error_stack::{IntoReport, ResultExt}; | use error_stack::{IntoReport, ResultExt}; | ||||||
| use masking::Secret; | use masking::Secret; | ||||||
| use serde::{Deserialize, Serialize}; | use serde::{Deserialize, Serialize}; | ||||||
| @ -185,7 +186,7 @@ pub enum CashtocodePaymentsResponse { | |||||||
| #[derive(Debug, Deserialize)] | #[derive(Debug, Deserialize)] | ||||||
| #[serde(rename_all = "camelCase")] | #[serde(rename_all = "camelCase")] | ||||||
| pub struct CashtocodePaymentsResponseData { | pub struct CashtocodePaymentsResponseData { | ||||||
|     pub pay_url: String, |     pub pay_url: url::Url, | ||||||
| } | } | ||||||
|  |  | ||||||
| #[derive(Debug, Clone, Deserialize)] | #[derive(Debug, Clone, Deserialize)] | ||||||
| @ -195,17 +196,44 @@ pub struct CashtocodePaymentsSyncResponse { | |||||||
|     pub amount: i64, |     pub amount: i64, | ||||||
| } | } | ||||||
|  |  | ||||||
| impl<F, T> | fn get_redirect_form_data( | ||||||
|  |     payment_method_type: &enums::PaymentMethodType, | ||||||
|  |     response_data: CashtocodePaymentsResponseData, | ||||||
|  | ) -> CustomResult<services::RedirectForm, errors::ConnectorError> { | ||||||
|  |     match payment_method_type { | ||||||
|  |         enums::PaymentMethodType::ClassicReward => Ok(services::RedirectForm::Form { | ||||||
|  |             //redirect form is manually constructed because the connector for this pm type expects query params in the url | ||||||
|  |             endpoint: response_data.pay_url.to_string(), | ||||||
|  |             method: services::Method::Post, | ||||||
|  |             form_fields: Default::default(), | ||||||
|  |         }), | ||||||
|  |         enums::PaymentMethodType::Evoucher => Ok(services::RedirectForm::from(( | ||||||
|  |             //here the pay url gets parsed, and query params are sent as formfields as the connector expects | ||||||
|  |             response_data.pay_url, | ||||||
|  |             services::Method::Get, | ||||||
|  |         ))), | ||||||
|  |         _ => Err(errors::ConnectorError::NotImplemented( | ||||||
|  |             utils::get_unimplemented_payment_method_error_message("CashToCode"), | ||||||
|  |         ))?, | ||||||
|  |     } | ||||||
|  | } | ||||||
|  |  | ||||||
|  | impl<F> | ||||||
|     TryFrom< |     TryFrom< | ||||||
|         types::ResponseRouterData<F, CashtocodePaymentsResponse, T, types::PaymentsResponseData>, |         types::ResponseRouterData< | ||||||
|     > for types::RouterData<F, T, types::PaymentsResponseData> |             F, | ||||||
|  |             CashtocodePaymentsResponse, | ||||||
|  |             types::PaymentsAuthorizeData, | ||||||
|  |             types::PaymentsResponseData, | ||||||
|  |         >, | ||||||
|  |     > for types::RouterData<F, types::PaymentsAuthorizeData, types::PaymentsResponseData> | ||||||
| { | { | ||||||
|     type Error = error_stack::Report<errors::ConnectorError>; |     type Error = error_stack::Report<errors::ConnectorError>; | ||||||
|     fn try_from( |     fn try_from( | ||||||
|         item: types::ResponseRouterData< |         item: types::ResponseRouterData< | ||||||
|             F, |             F, | ||||||
|             CashtocodePaymentsResponse, |             CashtocodePaymentsResponse, | ||||||
|             T, |             types::PaymentsAuthorizeData, | ||||||
|             types::PaymentsResponseData, |             types::PaymentsResponseData, | ||||||
|         >, |         >, | ||||||
|     ) -> Result<Self, Self::Error> { |     ) -> Result<Self, Self::Error> { | ||||||
| @ -222,11 +250,13 @@ impl<F, T> | |||||||
|                 }), |                 }), | ||||||
|             ), |             ), | ||||||
|             CashtocodePaymentsResponse::CashtoCodeData(response_data) => { |             CashtocodePaymentsResponse::CashtoCodeData(response_data) => { | ||||||
|                 let redirection_data = services::RedirectForm::Form { |                 let payment_method_type = item | ||||||
|                     endpoint: response_data.pay_url, |                     .data | ||||||
|                     method: services::Method::Post, |                     .request | ||||||
|                     form_fields: Default::default(), |                     .payment_method_type | ||||||
|                 }; |                     .as_ref() | ||||||
|  |                     .ok_or(errors::ConnectorError::MissingPaymentMethodType)?; | ||||||
|  |                 let redirection_data = get_redirect_form_data(payment_method_type, response_data)?; | ||||||
|                 ( |                 ( | ||||||
|                     enums::AttemptStatus::AuthenticationPending, |                     enums::AttemptStatus::AuthenticationPending, | ||||||
|                     Ok(types::PaymentsResponseData::TransactionResponse { |                     Ok(types::PaymentsResponseData::TransactionResponse { | ||||||
| @ -272,10 +302,10 @@ impl<F, T> | |||||||
|         >, |         >, | ||||||
|     ) -> Result<Self, Self::Error> { |     ) -> Result<Self, Self::Error> { | ||||||
|         Ok(Self { |         Ok(Self { | ||||||
|             status: enums::AttemptStatus::Charged, |             status: enums::AttemptStatus::Charged, // Charged status is hardcoded because cashtocode do not support Psync, and we only receive webhooks when payment is succeeded, this tryFrom is used for CallConnectorAction. | ||||||
|             response: Ok(types::PaymentsResponseData::TransactionResponse { |             response: Ok(types::PaymentsResponseData::TransactionResponse { | ||||||
|                 resource_id: types::ResponseId::ConnectorTransactionId( |                 resource_id: types::ResponseId::ConnectorTransactionId( | ||||||
|                     item.data.attempt_id.clone(), |                     item.data.attempt_id.clone(), //in response they only send PayUrl, so we use attempt_id as connector_transaction_id | ||||||
|                 ), |                 ), | ||||||
|                 redirection_data: None, |                 redirection_data: None, | ||||||
|                 mandate_reference: None, |                 mandate_reference: None, | ||||||
|  | |||||||
		Reference in New Issue
	
	Block a user
	 Prasunna Soppa
					Prasunna Soppa