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:
Prasunna Soppa
2023-12-14 18:42:58 +05:30
committed by GitHub
parent f4578463d5
commit 71a86a804e

View File

@ -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,