mirror of
https://github.com/juspay/hyperswitch.git
synced 2025-11-01 19:42:27 +08:00
refactor(payment_method): [Klarna] store and populate payment_type for klarna_sdk Paylater in response (#4956)
This commit is contained in:
@ -1814,7 +1814,9 @@ pub enum AdditionalPaymentData {
|
|||||||
Wallet {
|
Wallet {
|
||||||
apple_pay: Option<ApplepayPaymentMethod>,
|
apple_pay: Option<ApplepayPaymentMethod>,
|
||||||
},
|
},
|
||||||
PayLater {},
|
PayLater {
|
||||||
|
klarna_sdk: Option<KlarnaSdkPaymentMethod>,
|
||||||
|
},
|
||||||
BankTransfer {},
|
BankTransfer {},
|
||||||
Crypto {},
|
Crypto {},
|
||||||
BankDebit {},
|
BankDebit {},
|
||||||
@ -1828,6 +1830,12 @@ pub enum AdditionalPaymentData {
|
|||||||
CardToken {},
|
CardToken {},
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[derive(Debug, Clone, Eq, PartialEq, serde::Deserialize, serde::Serialize)]
|
||||||
|
|
||||||
|
pub struct KlarnaSdkPaymentMethod {
|
||||||
|
pub payment_type: Option<String>,
|
||||||
|
}
|
||||||
|
|
||||||
#[derive(Debug, Clone, Eq, PartialEq, serde::Deserialize, serde::Serialize, ToSchema)]
|
#[derive(Debug, Clone, Eq, PartialEq, serde::Deserialize, serde::Serialize, ToSchema)]
|
||||||
#[serde(rename_all = "snake_case")]
|
#[serde(rename_all = "snake_case")]
|
||||||
pub enum BankRedirectData {
|
pub enum BankRedirectData {
|
||||||
@ -2761,7 +2769,7 @@ where
|
|||||||
| PaymentMethodDataResponse::Crypto {}
|
| PaymentMethodDataResponse::Crypto {}
|
||||||
| PaymentMethodDataResponse::MandatePayment {}
|
| PaymentMethodDataResponse::MandatePayment {}
|
||||||
| PaymentMethodDataResponse::GiftCard {}
|
| PaymentMethodDataResponse::GiftCard {}
|
||||||
| PaymentMethodDataResponse::PayLater {}
|
| PaymentMethodDataResponse::PayLater(_)
|
||||||
| PaymentMethodDataResponse::Paypal {}
|
| PaymentMethodDataResponse::Paypal {}
|
||||||
| PaymentMethodDataResponse::RealTimePayment {}
|
| PaymentMethodDataResponse::RealTimePayment {}
|
||||||
| PaymentMethodDataResponse::Upi {}
|
| PaymentMethodDataResponse::Upi {}
|
||||||
@ -2787,7 +2795,7 @@ pub enum PaymentMethodDataResponse {
|
|||||||
Card(Box<CardResponse>),
|
Card(Box<CardResponse>),
|
||||||
BankTransfer {},
|
BankTransfer {},
|
||||||
Wallet {},
|
Wallet {},
|
||||||
PayLater {},
|
PayLater(Box<PaylaterResponse>),
|
||||||
Paypal {},
|
Paypal {},
|
||||||
BankRedirect {},
|
BankRedirect {},
|
||||||
Crypto {},
|
Crypto {},
|
||||||
@ -2802,6 +2810,17 @@ pub enum PaymentMethodDataResponse {
|
|||||||
CardToken {},
|
CardToken {},
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[derive(Eq, PartialEq, Clone, Debug, serde::Serialize, serde::Deserialize)]
|
||||||
|
pub struct PaylaterResponse {
|
||||||
|
klarna_sdk: Option<KlarnaSdkPaymentMethodResponse>,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Debug, Clone, Eq, PartialEq, serde::Deserialize, serde::Serialize)]
|
||||||
|
|
||||||
|
pub struct KlarnaSdkPaymentMethodResponse {
|
||||||
|
pub payment_type: Option<String>,
|
||||||
|
}
|
||||||
|
|
||||||
#[derive(Debug, Clone, Eq, PartialEq, serde::Deserialize, ToSchema, serde::Serialize)]
|
#[derive(Debug, Clone, Eq, PartialEq, serde::Deserialize, ToSchema, serde::Serialize)]
|
||||||
pub struct PaymentMethodDataResponseWithBilling {
|
pub struct PaymentMethodDataResponseWithBilling {
|
||||||
// The struct is flattened in order to provide backwards compatibility
|
// The struct is flattened in order to provide backwards compatibility
|
||||||
@ -3900,11 +3919,24 @@ impl From<AdditionalCardInfo> for CardResponse {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl From<KlarnaSdkPaymentMethod> for PaylaterResponse {
|
||||||
|
fn from(klarna_sdk: KlarnaSdkPaymentMethod) -> Self {
|
||||||
|
Self {
|
||||||
|
klarna_sdk: Some(KlarnaSdkPaymentMethodResponse {
|
||||||
|
payment_type: klarna_sdk.payment_type,
|
||||||
|
}),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
impl From<AdditionalPaymentData> for PaymentMethodDataResponse {
|
impl From<AdditionalPaymentData> for PaymentMethodDataResponse {
|
||||||
fn from(payment_method_data: AdditionalPaymentData) -> Self {
|
fn from(payment_method_data: AdditionalPaymentData) -> Self {
|
||||||
match payment_method_data {
|
match payment_method_data {
|
||||||
AdditionalPaymentData::Card(card) => Self::Card(Box::new(CardResponse::from(*card))),
|
AdditionalPaymentData::Card(card) => Self::Card(Box::new(CardResponse::from(*card))),
|
||||||
AdditionalPaymentData::PayLater {} => Self::PayLater {},
|
AdditionalPaymentData::PayLater { klarna_sdk } => match klarna_sdk {
|
||||||
|
Some(sdk) => Self::PayLater(Box::new(PaylaterResponse::from(sdk))),
|
||||||
|
None => Self::PayLater(Box::new(PaylaterResponse { klarna_sdk: None })),
|
||||||
|
},
|
||||||
AdditionalPaymentData::Wallet { .. } => Self::Wallet {},
|
AdditionalPaymentData::Wallet { .. } => Self::Wallet {},
|
||||||
AdditionalPaymentData::BankRedirect { .. } => Self::BankRedirect {},
|
AdditionalPaymentData::BankRedirect { .. } => Self::BankRedirect {},
|
||||||
AdditionalPaymentData::Crypto {} => Self::Crypto {},
|
AdditionalPaymentData::Crypto {} => Self::Crypto {},
|
||||||
|
|||||||
@ -173,6 +173,14 @@ pub enum AdditionalPaymentMethodConnectorResponse {
|
|||||||
/// Various payment checks that are done for a payment
|
/// Various payment checks that are done for a payment
|
||||||
payment_checks: Option<serde_json::Value>,
|
payment_checks: Option<serde_json::Value>,
|
||||||
},
|
},
|
||||||
|
PayLater {
|
||||||
|
klarna_sdk: Option<KlarnaSdkResponse>,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)]
|
||||||
|
pub struct KlarnaSdkResponse {
|
||||||
|
pub payment_type: Option<String>,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Clone, Debug, serde::Serialize)]
|
#[derive(Clone, Debug, serde::Serialize)]
|
||||||
|
|||||||
@ -1,6 +1,7 @@
|
|||||||
use api_models::payments;
|
use api_models::payments;
|
||||||
use common_utils::pii;
|
use common_utils::pii;
|
||||||
use error_stack::{report, ResultExt};
|
use error_stack::{report, ResultExt};
|
||||||
|
use hyperswitch_domain_models::router_data::KlarnaSdkResponse;
|
||||||
use masking::{ExposeInterface, Secret};
|
use masking::{ExposeInterface, Secret};
|
||||||
use serde::{Deserialize, Serialize};
|
use serde::{Deserialize, Serialize};
|
||||||
|
|
||||||
@ -84,6 +85,23 @@ pub struct KlarnaPaymentsRequest {
|
|||||||
pub struct KlarnaPaymentsResponse {
|
pub struct KlarnaPaymentsResponse {
|
||||||
order_id: String,
|
order_id: String,
|
||||||
fraud_status: KlarnaFraudStatus,
|
fraud_status: KlarnaFraudStatus,
|
||||||
|
authorized_payment_method: Option<AuthorizedPaymentMethod>,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Debug, Clone, Deserialize, Serialize)]
|
||||||
|
pub struct AuthorizedPaymentMethod {
|
||||||
|
#[serde(rename = "type")]
|
||||||
|
payment_type: String,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl From<AuthorizedPaymentMethod> for types::AdditionalPaymentMethodConnectorResponse {
|
||||||
|
fn from(item: AuthorizedPaymentMethod) -> Self {
|
||||||
|
Self::PayLater {
|
||||||
|
klarna_sdk: Some(KlarnaSdkResponse {
|
||||||
|
payment_type: Some(item.payment_type),
|
||||||
|
}),
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug, Serialize)]
|
#[derive(Debug, Serialize)]
|
||||||
@ -236,6 +254,17 @@ impl TryFrom<types::PaymentsResponseRouterData<KlarnaPaymentsResponse>>
|
|||||||
fn try_from(
|
fn try_from(
|
||||||
item: types::PaymentsResponseRouterData<KlarnaPaymentsResponse>,
|
item: types::PaymentsResponseRouterData<KlarnaPaymentsResponse>,
|
||||||
) -> Result<Self, Self::Error> {
|
) -> Result<Self, Self::Error> {
|
||||||
|
let connector_response = types::ConnectorResponseData::with_additional_payment_method_data(
|
||||||
|
match item.response.authorized_payment_method {
|
||||||
|
Some(authorized_payment_method) => {
|
||||||
|
types::AdditionalPaymentMethodConnectorResponse::from(authorized_payment_method)
|
||||||
|
}
|
||||||
|
None => {
|
||||||
|
types::AdditionalPaymentMethodConnectorResponse::PayLater { klarna_sdk: None }
|
||||||
|
}
|
||||||
|
},
|
||||||
|
);
|
||||||
|
|
||||||
Ok(Self {
|
Ok(Self {
|
||||||
response: Ok(types::PaymentsResponseData::TransactionResponse {
|
response: Ok(types::PaymentsResponseData::TransactionResponse {
|
||||||
resource_id: types::ResponseId::ConnectorTransactionId(
|
resource_id: types::ResponseId::ConnectorTransactionId(
|
||||||
@ -253,6 +282,7 @@ impl TryFrom<types::PaymentsResponseRouterData<KlarnaPaymentsResponse>>
|
|||||||
item.response.fraud_status,
|
item.response.fraud_status,
|
||||||
item.data.request.is_auto_capture()?,
|
item.data.request.is_auto_capture()?,
|
||||||
)),
|
)),
|
||||||
|
connector_response: Some(connector_response),
|
||||||
..item.data
|
..item.data
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|||||||
@ -18,6 +18,7 @@ use futures::future::Either;
|
|||||||
use hyperswitch_domain_models::{
|
use hyperswitch_domain_models::{
|
||||||
mandates::MandateData,
|
mandates::MandateData,
|
||||||
payments::{payment_attempt::PaymentAttempt, PaymentIntent},
|
payments::{payment_attempt::PaymentAttempt, PaymentIntent},
|
||||||
|
router_data::KlarnaSdkResponse,
|
||||||
};
|
};
|
||||||
use josekit::jwe;
|
use josekit::jwe;
|
||||||
use masking::{ExposeInterface, PeekInterface};
|
use masking::{ExposeInterface, PeekInterface};
|
||||||
@ -3857,7 +3858,7 @@ pub async fn get_additional_payment_data(
|
|||||||
_ => api_models::payments::AdditionalPaymentData::Wallet { apple_pay: None },
|
_ => api_models::payments::AdditionalPaymentData::Wallet { apple_pay: None },
|
||||||
},
|
},
|
||||||
api_models::payments::PaymentMethodData::PayLater(_) => {
|
api_models::payments::PaymentMethodData::PayLater(_) => {
|
||||||
api_models::payments::AdditionalPaymentData::PayLater {}
|
api_models::payments::AdditionalPaymentData::PayLater { klarna_sdk: None }
|
||||||
}
|
}
|
||||||
api_models::payments::PaymentMethodData::BankTransfer(_) => {
|
api_models::payments::PaymentMethodData::BankTransfer(_) => {
|
||||||
api_models::payments::AdditionalPaymentData::BankTransfer {}
|
api_models::payments::AdditionalPaymentData::BankTransfer {}
|
||||||
@ -4501,6 +4502,15 @@ pub fn add_connector_response_to_additional_payment_data(
|
|||||||
..*additional_card_data.clone()
|
..*additional_card_data.clone()
|
||||||
},
|
},
|
||||||
)),
|
)),
|
||||||
|
(
|
||||||
|
api_models::payments::AdditionalPaymentData::PayLater { .. },
|
||||||
|
AdditionalPaymentMethodConnectorResponse::PayLater {
|
||||||
|
klarna_sdk: Some(KlarnaSdkResponse { payment_type }),
|
||||||
|
},
|
||||||
|
) => api_models::payments::AdditionalPaymentData::PayLater {
|
||||||
|
klarna_sdk: Some(api_models::payments::KlarnaSdkPaymentMethod { payment_type }),
|
||||||
|
},
|
||||||
|
|
||||||
_ => additional_payment_data,
|
_ => additional_payment_data,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user