mirror of
https://github.com/juspay/hyperswitch.git
synced 2025-10-30 09:38:33 +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