mirror of
https://github.com/juspay/hyperswitch.git
synced 2025-11-02 04:04:43 +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 {
|
||||
apple_pay: Option<ApplepayPaymentMethod>,
|
||||
},
|
||||
PayLater {},
|
||||
PayLater {
|
||||
klarna_sdk: Option<KlarnaSdkPaymentMethod>,
|
||||
},
|
||||
BankTransfer {},
|
||||
Crypto {},
|
||||
BankDebit {},
|
||||
@ -1828,6 +1830,12 @@ pub enum AdditionalPaymentData {
|
||||
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)]
|
||||
#[serde(rename_all = "snake_case")]
|
||||
pub enum BankRedirectData {
|
||||
@ -2761,7 +2769,7 @@ where
|
||||
| PaymentMethodDataResponse::Crypto {}
|
||||
| PaymentMethodDataResponse::MandatePayment {}
|
||||
| PaymentMethodDataResponse::GiftCard {}
|
||||
| PaymentMethodDataResponse::PayLater {}
|
||||
| PaymentMethodDataResponse::PayLater(_)
|
||||
| PaymentMethodDataResponse::Paypal {}
|
||||
| PaymentMethodDataResponse::RealTimePayment {}
|
||||
| PaymentMethodDataResponse::Upi {}
|
||||
@ -2787,7 +2795,7 @@ pub enum PaymentMethodDataResponse {
|
||||
Card(Box<CardResponse>),
|
||||
BankTransfer {},
|
||||
Wallet {},
|
||||
PayLater {},
|
||||
PayLater(Box<PaylaterResponse>),
|
||||
Paypal {},
|
||||
BankRedirect {},
|
||||
Crypto {},
|
||||
@ -2802,6 +2810,17 @@ pub enum PaymentMethodDataResponse {
|
||||
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)]
|
||||
pub struct PaymentMethodDataResponseWithBilling {
|
||||
// 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 {
|
||||
fn from(payment_method_data: AdditionalPaymentData) -> Self {
|
||||
match payment_method_data {
|
||||
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::BankRedirect { .. } => Self::BankRedirect {},
|
||||
AdditionalPaymentData::Crypto {} => Self::Crypto {},
|
||||
|
||||
@ -173,6 +173,14 @@ pub enum AdditionalPaymentMethodConnectorResponse {
|
||||
/// Various payment checks that are done for a payment
|
||||
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)]
|
||||
|
||||
@ -1,6 +1,7 @@
|
||||
use api_models::payments;
|
||||
use common_utils::pii;
|
||||
use error_stack::{report, ResultExt};
|
||||
use hyperswitch_domain_models::router_data::KlarnaSdkResponse;
|
||||
use masking::{ExposeInterface, Secret};
|
||||
use serde::{Deserialize, Serialize};
|
||||
|
||||
@ -84,6 +85,23 @@ pub struct KlarnaPaymentsRequest {
|
||||
pub struct KlarnaPaymentsResponse {
|
||||
order_id: String,
|
||||
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)]
|
||||
@ -236,6 +254,17 @@ impl TryFrom<types::PaymentsResponseRouterData<KlarnaPaymentsResponse>>
|
||||
fn try_from(
|
||||
item: types::PaymentsResponseRouterData<KlarnaPaymentsResponse>,
|
||||
) -> 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 {
|
||||
response: Ok(types::PaymentsResponseData::TransactionResponse {
|
||||
resource_id: types::ResponseId::ConnectorTransactionId(
|
||||
@ -253,6 +282,7 @@ impl TryFrom<types::PaymentsResponseRouterData<KlarnaPaymentsResponse>>
|
||||
item.response.fraud_status,
|
||||
item.data.request.is_auto_capture()?,
|
||||
)),
|
||||
connector_response: Some(connector_response),
|
||||
..item.data
|
||||
})
|
||||
}
|
||||
|
||||
@ -18,6 +18,7 @@ use futures::future::Either;
|
||||
use hyperswitch_domain_models::{
|
||||
mandates::MandateData,
|
||||
payments::{payment_attempt::PaymentAttempt, PaymentIntent},
|
||||
router_data::KlarnaSdkResponse,
|
||||
};
|
||||
use josekit::jwe;
|
||||
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::PaymentMethodData::PayLater(_) => {
|
||||
api_models::payments::AdditionalPaymentData::PayLater {}
|
||||
api_models::payments::AdditionalPaymentData::PayLater { klarna_sdk: None }
|
||||
}
|
||||
api_models::payments::PaymentMethodData::BankTransfer(_) => {
|
||||
api_models::payments::AdditionalPaymentData::BankTransfer {}
|
||||
@ -4501,6 +4502,15 @@ pub fn add_connector_response_to_additional_payment_data(
|
||||
..*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,
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user