mirror of
https://github.com/juspay/hyperswitch.git
synced 2025-10-28 04:04:55 +08:00
feat: list payment_methods with the required fields in each method (#1310)
Co-authored-by: Sangamesh Kulkarni <59434228+Sangamesh26@users.noreply.github.com> Co-authored-by: Prasunna Soppa <prasunna.soppa@juspay.in>
This commit is contained in:
@ -286,3 +286,12 @@ refund_duration = 1000 # Fake delay duration for dummy connector refun
|
||||
refund_tolerance = 100 # Fake delay tolerance for dummy connector refund
|
||||
refund_retrieve_duration = 500 # Fake delay duration for dummy connector refund sync
|
||||
refund_retrieve_tolerance = 100 # Fake delay tolerance for dummy connector refund sync
|
||||
|
||||
# Required fields info used while listing the payment_method_data
|
||||
[required_fields.pay_later] # payment_method = "pay_later"
|
||||
afterpay_clearpay = {fields = {stripe = [ # payment_method_type = afterpay_clearpay, connector = "stripe"
|
||||
# Required fields vector with its respective display name in front-end and field_type
|
||||
{ required_field = "shipping.address.first_name", display_name = "first_name", field_type = "text" },
|
||||
{ required_field = "shipping.address.last_name", display_name = "last_name", field_type = "text" },
|
||||
{ required_field = "shipping.address.country", display_name = "country", field_type = { drop_down = { options = [ "US", "IN" ] } } },
|
||||
] } }
|
||||
|
||||
@ -974,6 +974,26 @@ pub struct UnresolvedResponseReason {
|
||||
pub message: String,
|
||||
}
|
||||
|
||||
/// Possible field type of required fields in payment_method_data
|
||||
#[derive(
|
||||
Clone,
|
||||
Debug,
|
||||
Eq,
|
||||
PartialEq,
|
||||
serde::Deserialize,
|
||||
serde::Serialize,
|
||||
strum::Display,
|
||||
strum::EnumString,
|
||||
ToSchema,
|
||||
Hash,
|
||||
)]
|
||||
#[serde(rename_all = "snake_case")]
|
||||
#[strum(serialize_all = "snake_case")]
|
||||
pub enum FieldType {
|
||||
Text,
|
||||
DropDown { options: Vec<String> },
|
||||
}
|
||||
|
||||
#[derive(
|
||||
Debug,
|
||||
serde::Deserialize,
|
||||
|
||||
@ -1,3 +1,5 @@
|
||||
use std::collections::HashSet;
|
||||
|
||||
use cards::CardNumber;
|
||||
use common_utils::{crypto::OptionalEncryptableName, pii};
|
||||
use serde::de;
|
||||
@ -214,6 +216,23 @@ pub struct ResponsePaymentMethodTypes {
|
||||
pub bank_debits: Option<BankDebitTypes>,
|
||||
/// The Bank transfer payment method information, if applicable for a payment method type.
|
||||
pub bank_transfers: Option<BankTransferTypes>,
|
||||
|
||||
/// Required fields for the payment_method_type.
|
||||
pub required_fields: Option<HashSet<RequiredFieldInfo>>,
|
||||
}
|
||||
|
||||
/// Required fields info used while listing the payment_method_data
|
||||
#[derive(Debug, serde::Deserialize, serde::Serialize, Clone, PartialEq, Eq, ToSchema, Hash)]
|
||||
pub struct RequiredFieldInfo {
|
||||
/// Required field for a payment_method through a payment_method_type
|
||||
pub required_field: String,
|
||||
|
||||
/// Display name of the required field in the front-end
|
||||
pub display_name: String,
|
||||
|
||||
/// Possible field type of required field
|
||||
#[schema(value_type = FieldType)]
|
||||
pub field_type: api_enums::FieldType,
|
||||
}
|
||||
|
||||
#[derive(Debug, Clone, serde::Deserialize, serde::Serialize, ToSchema)]
|
||||
|
||||
@ -1,3 +1,9 @@
|
||||
use std::collections::HashMap;
|
||||
|
||||
use api_models::{enums, payment_methods::RequiredFieldInfo};
|
||||
|
||||
use super::settings::{ConnectorFields, PaymentMethodType};
|
||||
|
||||
impl Default for super::settings::Server {
|
||||
fn default() -> Self {
|
||||
Self {
|
||||
@ -137,6 +143,811 @@ impl Default for super::settings::DrainerSettings {
|
||||
}
|
||||
}
|
||||
|
||||
impl Default for super::settings::RequiredFields {
|
||||
fn default() -> Self {
|
||||
Self(HashMap::from([
|
||||
(
|
||||
enums::PaymentMethod::Card,
|
||||
PaymentMethodType(HashMap::from([(
|
||||
enums::PaymentMethodType::Debit,
|
||||
ConnectorFields {
|
||||
fields: HashMap::from([
|
||||
(
|
||||
enums::Connector::Aci,
|
||||
vec![RequiredFieldInfo {
|
||||
required_field: "card.card_holder_name".to_string(),
|
||||
display_name: "card_holder_name".to_string(),
|
||||
field_type: enums::FieldType::Text,
|
||||
}],
|
||||
),
|
||||
(
|
||||
enums::Connector::Bluesnap,
|
||||
vec![
|
||||
RequiredFieldInfo {
|
||||
required_field: "email".to_string(),
|
||||
display_name: "email".to_string(),
|
||||
field_type: enums::FieldType::Text,
|
||||
},
|
||||
RequiredFieldInfo {
|
||||
required_field: "billing.address.first_name".to_string(),
|
||||
display_name: "first_name".to_string(),
|
||||
field_type: enums::FieldType::Text,
|
||||
},
|
||||
RequiredFieldInfo {
|
||||
required_field: "billing.address.last_name".to_string(),
|
||||
display_name: "last_name".to_string(),
|
||||
field_type: enums::FieldType::Text,
|
||||
},
|
||||
],
|
||||
),
|
||||
(
|
||||
enums::Connector::Bambora,
|
||||
vec![RequiredFieldInfo {
|
||||
required_field: "card.card_holder_name".to_string(),
|
||||
display_name: "card_holder_name".to_string(),
|
||||
field_type: enums::FieldType::Text,
|
||||
}],
|
||||
),
|
||||
(
|
||||
enums::Connector::Cybersource,
|
||||
vec![
|
||||
RequiredFieldInfo {
|
||||
required_field: "email".to_string(),
|
||||
display_name: "email".to_string(),
|
||||
field_type: enums::FieldType::Text,
|
||||
},
|
||||
RequiredFieldInfo {
|
||||
required_field: "billing.phone.number".to_string(),
|
||||
display_name: "phone_number".to_string(),
|
||||
field_type: enums::FieldType::Text,
|
||||
},
|
||||
RequiredFieldInfo {
|
||||
required_field: "billing.phone.country_code".to_string(),
|
||||
display_name: "country".to_string(),
|
||||
field_type: enums::FieldType::DropDown {
|
||||
options: vec!["US".to_string(), "IN".to_string()],
|
||||
},
|
||||
},
|
||||
RequiredFieldInfo {
|
||||
required_field: "billing.address.first_name".to_string(),
|
||||
display_name: "first_name".to_string(),
|
||||
field_type: enums::FieldType::Text,
|
||||
},
|
||||
RequiredFieldInfo {
|
||||
required_field: "billing.address.last_name".to_string(),
|
||||
display_name: "last_name".to_string(),
|
||||
field_type: enums::FieldType::Text,
|
||||
},
|
||||
RequiredFieldInfo {
|
||||
required_field: "billing.address.line1".to_string(),
|
||||
display_name: "line1".to_string(),
|
||||
field_type: enums::FieldType::Text,
|
||||
},
|
||||
RequiredFieldInfo {
|
||||
required_field: "billing.address.city".to_string(),
|
||||
display_name: "city".to_string(),
|
||||
field_type: enums::FieldType::Text,
|
||||
},
|
||||
RequiredFieldInfo {
|
||||
required_field: "billing.address.state".to_string(),
|
||||
display_name: "state".to_string(),
|
||||
field_type: enums::FieldType::Text,
|
||||
},
|
||||
RequiredFieldInfo {
|
||||
required_field: "billing.address.zip".to_string(),
|
||||
display_name: "zip".to_string(),
|
||||
field_type: enums::FieldType::Text,
|
||||
},
|
||||
RequiredFieldInfo {
|
||||
required_field: "billing.address.country".to_string(),
|
||||
display_name: "country".to_string(),
|
||||
field_type: enums::FieldType::DropDown {
|
||||
options: vec!["US".to_string(), "IN".to_string()],
|
||||
},
|
||||
},
|
||||
],
|
||||
),
|
||||
(
|
||||
enums::Connector::Dlocal,
|
||||
vec![
|
||||
RequiredFieldInfo {
|
||||
required_field: "card.card_holder_name".to_string(),
|
||||
display_name: "card_holder_name".to_string(),
|
||||
field_type: enums::FieldType::Text,
|
||||
},
|
||||
RequiredFieldInfo {
|
||||
required_field: "email".to_string(),
|
||||
display_name: "email".to_string(),
|
||||
field_type: enums::FieldType::Text,
|
||||
},
|
||||
RequiredFieldInfo {
|
||||
required_field: "billing.address.country".to_string(),
|
||||
display_name: "country".to_string(),
|
||||
field_type: enums::FieldType::DropDown {
|
||||
options: vec!["US".to_string(), "IN".to_string()],
|
||||
},
|
||||
},
|
||||
RequiredFieldInfo {
|
||||
required_field: "billing.address.first_name".to_string(),
|
||||
display_name: "first_name".to_string(),
|
||||
field_type: enums::FieldType::Text,
|
||||
},
|
||||
RequiredFieldInfo {
|
||||
required_field: "billing.address.last_name".to_string(),
|
||||
display_name: "last_name".to_string(),
|
||||
field_type: enums::FieldType::Text,
|
||||
},
|
||||
],
|
||||
),
|
||||
(
|
||||
enums::Connector::Forte,
|
||||
vec![
|
||||
RequiredFieldInfo {
|
||||
required_field: "card.card_holder_name".to_string(),
|
||||
display_name: "card_holder_name".to_string(),
|
||||
field_type: enums::FieldType::Text,
|
||||
},
|
||||
RequiredFieldInfo {
|
||||
required_field: "billing.address.first_name".to_string(),
|
||||
display_name: "first_name".to_string(),
|
||||
field_type: enums::FieldType::Text,
|
||||
},
|
||||
RequiredFieldInfo {
|
||||
required_field: "billing.address.last_name".to_string(),
|
||||
display_name: "last_name".to_string(),
|
||||
field_type: enums::FieldType::Text,
|
||||
},
|
||||
],
|
||||
),
|
||||
(
|
||||
enums::Connector::Globalpay,
|
||||
vec![RequiredFieldInfo {
|
||||
required_field: "billing.address.country".to_string(),
|
||||
display_name: "country".to_string(),
|
||||
field_type: enums::FieldType::DropDown {
|
||||
options: vec!["US".to_string(), "IN".to_string()],
|
||||
},
|
||||
}],
|
||||
),
|
||||
(
|
||||
enums::Connector::Iatapay,
|
||||
vec![RequiredFieldInfo {
|
||||
required_field: "billing.address.country".to_string(),
|
||||
display_name: "country".to_string(),
|
||||
field_type: enums::FieldType::DropDown {
|
||||
options: vec!["US".to_string(), "IN".to_string()],
|
||||
},
|
||||
}],
|
||||
),
|
||||
(
|
||||
enums::Connector::Multisafepay,
|
||||
vec![
|
||||
RequiredFieldInfo {
|
||||
required_field: "billing.address.first_name".to_string(),
|
||||
display_name: "first_name".to_string(),
|
||||
field_type: enums::FieldType::Text,
|
||||
},
|
||||
RequiredFieldInfo {
|
||||
required_field: "billing.address.last_name".to_string(),
|
||||
display_name: "last_name".to_string(),
|
||||
field_type: enums::FieldType::Text,
|
||||
},
|
||||
RequiredFieldInfo {
|
||||
required_field: "billing.address.line1".to_string(),
|
||||
display_name: "line1".to_string(),
|
||||
field_type: enums::FieldType::Text,
|
||||
},
|
||||
RequiredFieldInfo {
|
||||
required_field: "billing.address.line2".to_string(),
|
||||
display_name: "line2".to_string(),
|
||||
field_type: enums::FieldType::Text,
|
||||
},
|
||||
RequiredFieldInfo {
|
||||
required_field: "billing.address.city".to_string(),
|
||||
display_name: "city".to_string(),
|
||||
field_type: enums::FieldType::Text,
|
||||
},
|
||||
RequiredFieldInfo {
|
||||
required_field: "billing.address.zip".to_string(),
|
||||
display_name: "zip".to_string(),
|
||||
field_type: enums::FieldType::Text,
|
||||
},
|
||||
RequiredFieldInfo {
|
||||
required_field: "billing.address.country".to_string(),
|
||||
display_name: "country".to_string(),
|
||||
field_type: enums::FieldType::DropDown {
|
||||
options: vec!["US".to_string(), "IN".to_string()],
|
||||
},
|
||||
},
|
||||
],
|
||||
),
|
||||
(
|
||||
enums::Connector::Noon,
|
||||
vec![RequiredFieldInfo {
|
||||
required_field: "card.card_holder_name".to_string(),
|
||||
display_name: "card_holder_name".to_string(),
|
||||
field_type: enums::FieldType::Text,
|
||||
}],
|
||||
),
|
||||
(
|
||||
enums::Connector::Opennode,
|
||||
vec![RequiredFieldInfo {
|
||||
required_field: "description".to_string(),
|
||||
display_name: "description".to_string(),
|
||||
field_type: enums::FieldType::Text,
|
||||
}],
|
||||
),
|
||||
(
|
||||
enums::Connector::Payu,
|
||||
vec![RequiredFieldInfo {
|
||||
required_field: "description".to_string(),
|
||||
display_name: "description".to_string(),
|
||||
field_type: enums::FieldType::Text,
|
||||
}],
|
||||
),
|
||||
(
|
||||
enums::Connector::Rapyd,
|
||||
vec![RequiredFieldInfo {
|
||||
required_field: "card.card_holder_name".to_string(),
|
||||
display_name: "card_holder_name".to_string(),
|
||||
field_type: enums::FieldType::Text,
|
||||
}],
|
||||
),
|
||||
(
|
||||
enums::Connector::Shift4,
|
||||
vec![RequiredFieldInfo {
|
||||
required_field: "card.card_holder_name".to_string(),
|
||||
display_name: "card_holder_name".to_string(),
|
||||
field_type: enums::FieldType::Text,
|
||||
}],
|
||||
),
|
||||
(
|
||||
enums::Connector::Trustpay,
|
||||
vec![
|
||||
RequiredFieldInfo {
|
||||
required_field: "card.card_holder_name".to_string(),
|
||||
display_name: "card_holder_name".to_string(),
|
||||
field_type: enums::FieldType::Text,
|
||||
},
|
||||
RequiredFieldInfo {
|
||||
required_field: "billing.address.line1".to_string(),
|
||||
display_name: "line1".to_string(),
|
||||
field_type: enums::FieldType::Text,
|
||||
},
|
||||
RequiredFieldInfo {
|
||||
required_field: "billing.address.city".to_string(),
|
||||
display_name: "city".to_string(),
|
||||
field_type: enums::FieldType::Text,
|
||||
},
|
||||
RequiredFieldInfo {
|
||||
required_field: "billing.address.zip".to_string(),
|
||||
display_name: "zip".to_string(),
|
||||
field_type: enums::FieldType::Text,
|
||||
},
|
||||
RequiredFieldInfo {
|
||||
required_field: "billing.address.country".to_string(),
|
||||
display_name: "country".to_string(),
|
||||
field_type: enums::FieldType::DropDown {
|
||||
options: vec!["US".to_string(), "IN".to_string()],
|
||||
},
|
||||
},
|
||||
RequiredFieldInfo {
|
||||
required_field: "email".to_string(),
|
||||
display_name: "email".to_string(),
|
||||
field_type: enums::FieldType::Text,
|
||||
},
|
||||
RequiredFieldInfo {
|
||||
required_field: "browser_info".to_string(),
|
||||
display_name: "browser_info".to_string(),
|
||||
field_type: enums::FieldType::Text,
|
||||
},
|
||||
],
|
||||
),
|
||||
(
|
||||
enums::Connector::Worldline,
|
||||
vec![RequiredFieldInfo {
|
||||
required_field: "card.card_holder_name".to_string(),
|
||||
display_name: "card_holder_name".to_string(),
|
||||
field_type: enums::FieldType::Text,
|
||||
}],
|
||||
),
|
||||
(
|
||||
enums::Connector::Zen,
|
||||
vec![
|
||||
RequiredFieldInfo {
|
||||
required_field: "email".to_string(),
|
||||
display_name: "email".to_string(),
|
||||
field_type: enums::FieldType::Text,
|
||||
},
|
||||
RequiredFieldInfo {
|
||||
required_field: "browser_info".to_string(),
|
||||
display_name: "browser_info".to_string(),
|
||||
field_type: enums::FieldType::Text,
|
||||
},
|
||||
RequiredFieldInfo {
|
||||
required_field: "description".to_string(),
|
||||
display_name: "description".to_string(),
|
||||
field_type: enums::FieldType::Text,
|
||||
},
|
||||
RequiredFieldInfo {
|
||||
required_field: "metadata.order_details".to_string(),
|
||||
display_name: "order_details".to_string(),
|
||||
field_type: enums::FieldType::Text,
|
||||
},
|
||||
],
|
||||
),
|
||||
]),
|
||||
},
|
||||
)])),
|
||||
),
|
||||
(
|
||||
enums::PaymentMethod::BankRedirect,
|
||||
PaymentMethodType(HashMap::from([
|
||||
(
|
||||
enums::PaymentMethodType::Ach,
|
||||
ConnectorFields {
|
||||
fields: HashMap::from([
|
||||
(
|
||||
enums::Connector::Stripe,
|
||||
vec![RequiredFieldInfo {
|
||||
required_field: "currency".to_string(),
|
||||
display_name: "currency".to_string(),
|
||||
field_type: enums::FieldType::Text,
|
||||
}],
|
||||
),
|
||||
(
|
||||
enums::Connector::Adyen,
|
||||
vec![RequiredFieldInfo {
|
||||
required_field: "card_holder_name".to_string(),
|
||||
display_name: "card_holder_name".to_string(),
|
||||
field_type: enums::FieldType::Text,
|
||||
}],
|
||||
),
|
||||
]),
|
||||
},
|
||||
),
|
||||
(
|
||||
enums::PaymentMethodType::Przelewy24,
|
||||
ConnectorFields {
|
||||
fields: HashMap::from([(
|
||||
enums::Connector::Stripe,
|
||||
vec![RequiredFieldInfo {
|
||||
required_field: "bank_name".to_string(),
|
||||
display_name: "bank_name".to_string(),
|
||||
field_type: enums::FieldType::Text,
|
||||
}],
|
||||
)]),
|
||||
},
|
||||
),
|
||||
(
|
||||
enums::PaymentMethodType::BancontactCard,
|
||||
ConnectorFields {
|
||||
fields: HashMap::from([
|
||||
(
|
||||
enums::Connector::Stripe,
|
||||
vec![RequiredFieldInfo {
|
||||
required_field: "bancontact_card.billing_name".to_string(),
|
||||
display_name: "billing_name".to_string(),
|
||||
field_type: enums::FieldType::Text,
|
||||
}],
|
||||
),
|
||||
(
|
||||
enums::Connector::Adyen,
|
||||
vec![
|
||||
RequiredFieldInfo {
|
||||
required_field: "bancontact_card.card_number"
|
||||
.to_string(),
|
||||
display_name: "card_number".to_string(),
|
||||
field_type: enums::FieldType::Text,
|
||||
},
|
||||
RequiredFieldInfo {
|
||||
required_field: "bancontact_card.card_exp_month"
|
||||
.to_string(),
|
||||
display_name: "card_exp_month".to_string(),
|
||||
field_type: enums::FieldType::Text,
|
||||
},
|
||||
RequiredFieldInfo {
|
||||
required_field: "bancontact_card.card_exp_year"
|
||||
.to_string(),
|
||||
display_name: "card_exp_year".to_string(),
|
||||
field_type: enums::FieldType::Text,
|
||||
},
|
||||
RequiredFieldInfo {
|
||||
required_field: "bancontact_card.card_holder_name"
|
||||
.to_string(),
|
||||
display_name: "card_holder_name".to_string(),
|
||||
field_type: enums::FieldType::Text,
|
||||
},
|
||||
],
|
||||
),
|
||||
]),
|
||||
},
|
||||
),
|
||||
(
|
||||
enums::PaymentMethodType::Sepa,
|
||||
ConnectorFields {
|
||||
fields: HashMap::from([(
|
||||
enums::Connector::Adyen,
|
||||
vec![RequiredFieldInfo {
|
||||
required_field: "bank_account_holder_name".to_string(),
|
||||
display_name: "bank_account_holder_name".to_string(),
|
||||
field_type: enums::FieldType::Text,
|
||||
}],
|
||||
)]),
|
||||
},
|
||||
),
|
||||
(
|
||||
enums::PaymentMethodType::Bacs,
|
||||
ConnectorFields {
|
||||
fields: HashMap::from([(
|
||||
enums::Connector::Adyen,
|
||||
vec![RequiredFieldInfo {
|
||||
required_field: "bank_account_holder_name".to_string(),
|
||||
display_name: "bank_account_holder_name".to_string(),
|
||||
field_type: enums::FieldType::Text,
|
||||
}],
|
||||
)]),
|
||||
},
|
||||
),
|
||||
(
|
||||
enums::PaymentMethodType::Giropay,
|
||||
ConnectorFields {
|
||||
fields: HashMap::from([
|
||||
(
|
||||
enums::Connector::Worldline,
|
||||
vec![RequiredFieldInfo {
|
||||
required_field: "giropay.billing_details.billing_name"
|
||||
.to_string(),
|
||||
display_name: "billing_name".to_string(),
|
||||
field_type: enums::FieldType::Text,
|
||||
}],
|
||||
),
|
||||
(
|
||||
enums::Connector::Nuvei,
|
||||
vec![
|
||||
RequiredFieldInfo {
|
||||
required_field: "email".to_string(),
|
||||
display_name: "email".to_string(),
|
||||
field_type: enums::FieldType::Text,
|
||||
},
|
||||
RequiredFieldInfo {
|
||||
required_field: "billing.address.country".to_string(),
|
||||
display_name: "country".to_string(),
|
||||
field_type: enums::FieldType::DropDown {
|
||||
options: vec!["US".to_string(), "IN".to_string()],
|
||||
},
|
||||
},
|
||||
],
|
||||
),
|
||||
]),
|
||||
},
|
||||
),
|
||||
(
|
||||
enums::PaymentMethodType::Ideal,
|
||||
ConnectorFields {
|
||||
fields: HashMap::from([
|
||||
(
|
||||
enums::Connector::Worldline,
|
||||
vec![RequiredFieldInfo {
|
||||
required_field: "ideal.bank_name".to_string(),
|
||||
display_name: "bank_name".to_string(),
|
||||
field_type: enums::FieldType::Text,
|
||||
}],
|
||||
),
|
||||
(
|
||||
enums::Connector::Nuvei,
|
||||
vec![
|
||||
RequiredFieldInfo {
|
||||
required_field: "ideal.bank_name".to_string(),
|
||||
display_name: "bank_name".to_string(),
|
||||
field_type: enums::FieldType::Text,
|
||||
},
|
||||
RequiredFieldInfo {
|
||||
required_field: "billing.address.first_name"
|
||||
.to_string(),
|
||||
display_name: "first_name".to_string(),
|
||||
field_type: enums::FieldType::Text,
|
||||
},
|
||||
RequiredFieldInfo {
|
||||
required_field: "billing.address.last_name".to_string(),
|
||||
display_name: "last_name".to_string(),
|
||||
field_type: enums::FieldType::Text,
|
||||
},
|
||||
RequiredFieldInfo {
|
||||
required_field: "email".to_string(),
|
||||
display_name: "email".to_string(),
|
||||
field_type: enums::FieldType::Text,
|
||||
},
|
||||
RequiredFieldInfo {
|
||||
required_field: "billing.address.country".to_string(),
|
||||
display_name: "country".to_string(),
|
||||
field_type: enums::FieldType::DropDown {
|
||||
options: vec!["US".to_string(), "IN".to_string()],
|
||||
},
|
||||
},
|
||||
],
|
||||
),
|
||||
]),
|
||||
},
|
||||
),
|
||||
(
|
||||
enums::PaymentMethodType::Sofort,
|
||||
ConnectorFields {
|
||||
fields: HashMap::from([(
|
||||
enums::Connector::Nuvei,
|
||||
vec![
|
||||
RequiredFieldInfo {
|
||||
required_field: "billing.address.first_name".to_string(),
|
||||
display_name: "first_name".to_string(),
|
||||
field_type: enums::FieldType::Text,
|
||||
},
|
||||
RequiredFieldInfo {
|
||||
required_field: "billing.address.last_name".to_string(),
|
||||
display_name: "last_name".to_string(),
|
||||
field_type: enums::FieldType::Text,
|
||||
},
|
||||
RequiredFieldInfo {
|
||||
required_field: "email".to_string(),
|
||||
display_name: "email".to_string(),
|
||||
field_type: enums::FieldType::Text,
|
||||
},
|
||||
RequiredFieldInfo {
|
||||
required_field: "billing.address.country".to_string(),
|
||||
display_name: "country".to_string(),
|
||||
field_type: enums::FieldType::DropDown {
|
||||
options: vec!["US".to_string(), "IN".to_string()],
|
||||
},
|
||||
},
|
||||
],
|
||||
)]),
|
||||
},
|
||||
),
|
||||
(
|
||||
enums::PaymentMethodType::Eps,
|
||||
ConnectorFields {
|
||||
fields: HashMap::from([(
|
||||
enums::Connector::Nuvei,
|
||||
vec![
|
||||
RequiredFieldInfo {
|
||||
required_field: "billing.address.first_name".to_string(),
|
||||
display_name: "first_name".to_string(),
|
||||
field_type: enums::FieldType::Text,
|
||||
},
|
||||
RequiredFieldInfo {
|
||||
required_field: "billing.address.last_name".to_string(),
|
||||
display_name: "last_name".to_string(),
|
||||
field_type: enums::FieldType::Text,
|
||||
},
|
||||
RequiredFieldInfo {
|
||||
required_field: "email".to_string(),
|
||||
display_name: "email".to_string(),
|
||||
field_type: enums::FieldType::Text,
|
||||
},
|
||||
RequiredFieldInfo {
|
||||
required_field: "billing.address.country".to_string(),
|
||||
display_name: "country".to_string(),
|
||||
field_type: enums::FieldType::DropDown {
|
||||
options: vec!["US".to_string(), "IN".to_string()],
|
||||
},
|
||||
},
|
||||
],
|
||||
)]),
|
||||
},
|
||||
),
|
||||
])),
|
||||
),
|
||||
(
|
||||
enums::PaymentMethod::Wallet,
|
||||
PaymentMethodType(HashMap::from([
|
||||
(
|
||||
enums::PaymentMethodType::ApplePay,
|
||||
ConnectorFields {
|
||||
fields: HashMap::from([
|
||||
(
|
||||
enums::Connector::Bluesnap,
|
||||
vec![RequiredFieldInfo {
|
||||
required_field: "billing_address".to_string(),
|
||||
display_name: "billing_address".to_string(),
|
||||
field_type: enums::FieldType::Text,
|
||||
}],
|
||||
),
|
||||
(
|
||||
enums::Connector::Zen,
|
||||
vec![RequiredFieldInfo {
|
||||
required_field: "metadata.order_details".to_string(),
|
||||
display_name: "order_details".to_string(),
|
||||
field_type: enums::FieldType::Text,
|
||||
}],
|
||||
),
|
||||
]),
|
||||
},
|
||||
),
|
||||
(
|
||||
enums::PaymentMethodType::Paypal,
|
||||
ConnectorFields {
|
||||
fields: HashMap::from([
|
||||
(
|
||||
enums::Connector::Mollie,
|
||||
vec![
|
||||
RequiredFieldInfo {
|
||||
required_field: "billing_address".to_string(),
|
||||
display_name: "billing_address".to_string(),
|
||||
field_type: enums::FieldType::Text,
|
||||
},
|
||||
RequiredFieldInfo {
|
||||
required_field: "shipping_address".to_string(),
|
||||
display_name: "shipping_address".to_string(),
|
||||
field_type: enums::FieldType::Text,
|
||||
},
|
||||
],
|
||||
),
|
||||
(
|
||||
enums::Connector::Nuvei,
|
||||
vec![
|
||||
RequiredFieldInfo {
|
||||
required_field: "email".to_string(),
|
||||
display_name: "email".to_string(),
|
||||
field_type: enums::FieldType::Text,
|
||||
},
|
||||
RequiredFieldInfo {
|
||||
required_field: "billing.address.country".to_string(),
|
||||
display_name: "country".to_string(),
|
||||
field_type: enums::FieldType::DropDown {
|
||||
options: vec!["US".to_string(), "IN".to_string()],
|
||||
},
|
||||
},
|
||||
],
|
||||
),
|
||||
]),
|
||||
},
|
||||
),
|
||||
(
|
||||
enums::PaymentMethodType::GooglePay,
|
||||
ConnectorFields {
|
||||
fields: HashMap::from([(
|
||||
enums::Connector::Zen,
|
||||
vec![RequiredFieldInfo {
|
||||
required_field: "metadata.order_details".to_string(),
|
||||
display_name: "order_details".to_string(),
|
||||
field_type: enums::FieldType::Text,
|
||||
}],
|
||||
)]),
|
||||
},
|
||||
),
|
||||
])),
|
||||
),
|
||||
(
|
||||
enums::PaymentMethod::PayLater,
|
||||
PaymentMethodType(HashMap::from([
|
||||
(
|
||||
enums::PaymentMethodType::AfterpayClearpay,
|
||||
ConnectorFields {
|
||||
fields: HashMap::from([
|
||||
(
|
||||
enums::Connector::Stripe,
|
||||
vec![
|
||||
RequiredFieldInfo {
|
||||
required_field: "shipping.address.first_name"
|
||||
.to_string(),
|
||||
display_name: "first_name".to_string(),
|
||||
field_type: enums::FieldType::Text,
|
||||
},
|
||||
RequiredFieldInfo {
|
||||
required_field: "shipping.address.line1".to_string(),
|
||||
display_name: "line1".to_string(),
|
||||
field_type: enums::FieldType::Text,
|
||||
},
|
||||
RequiredFieldInfo {
|
||||
required_field: "shipping.address.country".to_string(),
|
||||
display_name: "country".to_string(),
|
||||
field_type: enums::FieldType::DropDown {
|
||||
options: vec!["US".to_string(), "IN".to_string()],
|
||||
},
|
||||
},
|
||||
RequiredFieldInfo {
|
||||
required_field: "shipping.address.zip".to_string(),
|
||||
display_name: "zip".to_string(),
|
||||
field_type: enums::FieldType::Text,
|
||||
},
|
||||
],
|
||||
),
|
||||
(
|
||||
enums::Connector::Adyen,
|
||||
vec![
|
||||
RequiredFieldInfo {
|
||||
required_field: "shipping.address.first_name"
|
||||
.to_string(),
|
||||
display_name: "first_name".to_string(),
|
||||
field_type: enums::FieldType::Text,
|
||||
},
|
||||
RequiredFieldInfo {
|
||||
required_field: "shipping.address.line1".to_string(),
|
||||
display_name: "line1".to_string(),
|
||||
field_type: enums::FieldType::Text,
|
||||
},
|
||||
RequiredFieldInfo {
|
||||
required_field: "shipping.address.country".to_string(),
|
||||
display_name: "country".to_string(),
|
||||
field_type: enums::FieldType::DropDown {
|
||||
options: vec!["US".to_string(), "IN".to_string()],
|
||||
},
|
||||
},
|
||||
RequiredFieldInfo {
|
||||
required_field: "shipping.address.zip".to_string(),
|
||||
display_name: "zip".to_string(),
|
||||
field_type: enums::FieldType::Text,
|
||||
},
|
||||
],
|
||||
),
|
||||
(
|
||||
enums::Connector::Nuvei,
|
||||
vec![
|
||||
RequiredFieldInfo {
|
||||
required_field: "billing.address.first_name"
|
||||
.to_string(),
|
||||
display_name: "first_name".to_string(),
|
||||
field_type: enums::FieldType::Text,
|
||||
},
|
||||
RequiredFieldInfo {
|
||||
required_field: "billing.address.last_name".to_string(),
|
||||
display_name: "last_name".to_string(),
|
||||
field_type: enums::FieldType::Text,
|
||||
},
|
||||
RequiredFieldInfo {
|
||||
required_field: "email".to_string(),
|
||||
display_name: "email".to_string(),
|
||||
field_type: enums::FieldType::Text,
|
||||
},
|
||||
RequiredFieldInfo {
|
||||
required_field: "billing.address.country".to_string(),
|
||||
display_name: "country".to_string(),
|
||||
field_type: enums::FieldType::DropDown {
|
||||
options: vec!["US".to_string(), "IN".to_string()],
|
||||
},
|
||||
},
|
||||
],
|
||||
),
|
||||
]),
|
||||
},
|
||||
),
|
||||
(
|
||||
enums::PaymentMethodType::Klarna,
|
||||
ConnectorFields {
|
||||
fields: HashMap::from([(
|
||||
enums::Connector::Nuvei,
|
||||
vec![
|
||||
RequiredFieldInfo {
|
||||
required_field: "billing.address.first_name".to_string(),
|
||||
display_name: "first_name".to_string(),
|
||||
field_type: enums::FieldType::Text,
|
||||
},
|
||||
RequiredFieldInfo {
|
||||
required_field: "billing.address.last_name".to_string(),
|
||||
display_name: "last_name".to_string(),
|
||||
field_type: enums::FieldType::Text,
|
||||
},
|
||||
RequiredFieldInfo {
|
||||
required_field: "email".to_string(),
|
||||
display_name: "email".to_string(),
|
||||
field_type: enums::FieldType::Text,
|
||||
},
|
||||
RequiredFieldInfo {
|
||||
required_field: "billing.address.country".to_string(),
|
||||
display_name: "country".to_string(),
|
||||
field_type: enums::FieldType::DropDown {
|
||||
options: vec!["US".to_string(), "IN".to_string()],
|
||||
},
|
||||
},
|
||||
],
|
||||
)]),
|
||||
},
|
||||
),
|
||||
])),
|
||||
),
|
||||
]))
|
||||
}
|
||||
}
|
||||
|
||||
#[allow(clippy::derivable_impls)]
|
||||
impl Default for super::settings::ApiKeys {
|
||||
fn default() -> Self {
|
||||
|
||||
@ -4,7 +4,7 @@ use std::{
|
||||
str::FromStr,
|
||||
};
|
||||
|
||||
use api_models::enums;
|
||||
use api_models::{enums, payment_methods::RequiredFieldInfo};
|
||||
use common_utils::ext_traits::ConfigExt;
|
||||
use config::{Environment, File};
|
||||
#[cfg(feature = "email")]
|
||||
@ -83,6 +83,7 @@ pub struct Settings {
|
||||
pub dummy_connector: DummyConnector,
|
||||
#[cfg(feature = "email")]
|
||||
pub email: EmailSettings,
|
||||
pub required_fields: RequiredFields,
|
||||
pub delayed_session_response: DelayedSessionConfig,
|
||||
}
|
||||
|
||||
@ -223,6 +224,17 @@ pub struct NotAvailableFlows {
|
||||
pub capture_method: Option<enums::CaptureMethod>,
|
||||
}
|
||||
|
||||
#[derive(Debug, Deserialize, Clone)]
|
||||
pub struct RequiredFields(pub HashMap<enums::PaymentMethod, PaymentMethodType>);
|
||||
|
||||
#[derive(Debug, Deserialize, Clone)]
|
||||
pub struct PaymentMethodType(pub HashMap<enums::PaymentMethodType, ConnectorFields>);
|
||||
|
||||
#[derive(Debug, Deserialize, Clone)]
|
||||
pub struct ConnectorFields {
|
||||
pub fields: HashMap<enums::Connector, Vec<RequiredFieldInfo>>,
|
||||
}
|
||||
|
||||
fn string_set_deser<'a, D>(
|
||||
deserializer: D,
|
||||
) -> Result<Option<HashSet<api_models::enums::CountryAlpha2>>, D::Error>
|
||||
|
||||
@ -1,10 +1,13 @@
|
||||
use std::collections::{HashMap, HashSet};
|
||||
use std::{
|
||||
collections::{HashMap, HashSet},
|
||||
str::FromStr,
|
||||
};
|
||||
|
||||
use api_models::{
|
||||
admin::{self, PaymentMethodsEnabled},
|
||||
enums::{self as api_enums},
|
||||
payment_methods::{
|
||||
CardNetworkTypes, PaymentExperienceTypes, RequestPaymentMethodTypes,
|
||||
CardNetworkTypes, PaymentExperienceTypes, RequestPaymentMethodTypes, RequiredFieldInfo,
|
||||
ResponsePaymentMethodIntermediate, ResponsePaymentMethodTypes,
|
||||
ResponsePaymentMethodsEnabled,
|
||||
},
|
||||
@ -860,11 +863,56 @@ pub async fn list_payment_methods(
|
||||
let mut bank_transfer_consolidated_hm =
|
||||
HashMap::<api_enums::PaymentMethodType, Vec<String>>::new();
|
||||
|
||||
let mut required_fields_hm = HashMap::<
|
||||
api_enums::PaymentMethod,
|
||||
HashMap<api_enums::PaymentMethodType, HashSet<RequiredFieldInfo>>,
|
||||
>::new();
|
||||
|
||||
for element in response.clone() {
|
||||
let payment_method = element.payment_method;
|
||||
let payment_method_type = element.payment_method_type;
|
||||
let connector = element.connector.clone();
|
||||
|
||||
let connector_variant = api_enums::Connector::from_str(connector.as_str())
|
||||
.into_report()
|
||||
.change_context(errors::ConnectorError::InvalidConnectorName)
|
||||
.change_context(errors::ApiErrorResponse::InvalidDataValue {
|
||||
field_name: "connector",
|
||||
})
|
||||
.attach_printable_lazy(|| format!("unable to parse connector name {connector:?}"))?;
|
||||
state.conf.required_fields.0.get(&payment_method).map(
|
||||
|required_fields_hm_for_each_payment_method_type| {
|
||||
required_fields_hm_for_each_payment_method_type
|
||||
.0
|
||||
.get(&payment_method_type)
|
||||
.map(|required_fields_hm_for_each_connector| {
|
||||
required_fields_hm
|
||||
.entry(payment_method)
|
||||
.or_insert(HashMap::new());
|
||||
required_fields_hm_for_each_connector
|
||||
.fields
|
||||
.get(&connector_variant)
|
||||
.map(|required_fields_vec| {
|
||||
// If payment_method_type already exist in required_fields_hm, extend the required_fields hs to existing hs.
|
||||
let required_fields_hs =
|
||||
HashSet::from_iter(required_fields_vec.iter().cloned());
|
||||
|
||||
let existing_req_fields_hs = required_fields_hm
|
||||
.get_mut(&payment_method)
|
||||
.and_then(|inner_hm| inner_hm.get_mut(&payment_method_type));
|
||||
|
||||
if let Some(inner_hs) = existing_req_fields_hs {
|
||||
inner_hs.extend(required_fields_hs);
|
||||
} else {
|
||||
required_fields_hm.get_mut(&payment_method).map(|inner_hm| {
|
||||
inner_hm.insert(payment_method_type, required_fields_hs)
|
||||
});
|
||||
}
|
||||
})
|
||||
})
|
||||
},
|
||||
);
|
||||
|
||||
if let Some(payment_experience) = element.payment_experience {
|
||||
if let Some(payment_method_hm) =
|
||||
payment_experiences_consolidated_hm.get_mut(&payment_method)
|
||||
@ -993,6 +1041,11 @@ pub async fn list_payment_methods(
|
||||
bank_names: None,
|
||||
bank_debits: None,
|
||||
bank_transfers: None,
|
||||
// Required fields for PayLater payment method
|
||||
required_fields: required_fields_hm
|
||||
.get(key.0)
|
||||
.and_then(|inner_hm| inner_hm.get(payment_method_types_hm.0))
|
||||
.cloned(),
|
||||
})
|
||||
}
|
||||
|
||||
@ -1020,6 +1073,11 @@ pub async fn list_payment_methods(
|
||||
bank_names: None,
|
||||
bank_debits: None,
|
||||
bank_transfers: None,
|
||||
// Required fields for Card payment method
|
||||
required_fields: required_fields_hm
|
||||
.get(key.0)
|
||||
.and_then(|inner_hm| inner_hm.get(payment_method_types_hm.0))
|
||||
.cloned(),
|
||||
})
|
||||
}
|
||||
|
||||
@ -1043,6 +1101,11 @@ pub async fn list_payment_methods(
|
||||
card_networks: None,
|
||||
bank_debits: None,
|
||||
bank_transfers: None,
|
||||
// Required fields for BankRedirect payment method
|
||||
required_fields: required_fields_hm
|
||||
.get(&api_enums::PaymentMethod::BankRedirect)
|
||||
.and_then(|inner_hm| inner_hm.get(key.0))
|
||||
.cloned(),
|
||||
}
|
||||
})
|
||||
}
|
||||
@ -1069,6 +1132,11 @@ pub async fn list_payment_methods(
|
||||
eligible_connectors: connectors.clone(),
|
||||
}),
|
||||
bank_transfers: None,
|
||||
// Required fields for BankDebit payment method
|
||||
required_fields: required_fields_hm
|
||||
.get(&api_enums::PaymentMethod::BankDebit)
|
||||
.and_then(|inner_hm| inner_hm.get(key.0))
|
||||
.cloned(),
|
||||
}
|
||||
})
|
||||
}
|
||||
@ -1095,6 +1163,11 @@ pub async fn list_payment_methods(
|
||||
bank_transfers: Some(api_models::payment_methods::BankTransferTypes {
|
||||
eligible_connectors: connectors,
|
||||
}),
|
||||
// Required fields for BankTransfer payment method
|
||||
required_fields: required_fields_hm
|
||||
.get(&api_enums::PaymentMethod::BankTransfer)
|
||||
.and_then(|inner_hm| inner_hm.get(key.0))
|
||||
.cloned(),
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
@ -150,6 +150,7 @@ Never share your secret api keys. Keep them guarded and secure.
|
||||
api_models::enums::DisputeStage,
|
||||
api_models::enums::DisputeStatus,
|
||||
api_models::enums::CountryAlpha2,
|
||||
api_models::enums::FieldType,
|
||||
api_models::enums::FrmAction,
|
||||
api_models::enums::FrmPreferredFlowTypes,
|
||||
api_models::enums::RetryAction,
|
||||
@ -249,6 +250,7 @@ Never share your secret api keys. Keep them guarded and secure.
|
||||
api_models::payments::SepaBankTransferInstructions,
|
||||
api_models::payments::BacsBankTransferInstructions,
|
||||
api_models::payments::RedirectResponse,
|
||||
api_models::payment_methods::RequiredFieldInfo,
|
||||
api_models::refunds::RefundListRequest,
|
||||
api_models::refunds::RefundListResponse,
|
||||
api_models::refunds::TimeRange,
|
||||
|
||||
@ -3877,6 +3877,39 @@
|
||||
}
|
||||
}
|
||||
},
|
||||
"FieldType": {
|
||||
"oneOf": [
|
||||
{
|
||||
"type": "string",
|
||||
"enum": [
|
||||
"text"
|
||||
]
|
||||
},
|
||||
{
|
||||
"type": "object",
|
||||
"required": [
|
||||
"drop_down"
|
||||
],
|
||||
"properties": {
|
||||
"drop_down": {
|
||||
"type": "object",
|
||||
"required": [
|
||||
"options"
|
||||
],
|
||||
"properties": {
|
||||
"options": {
|
||||
"type": "array",
|
||||
"items": {
|
||||
"type": "string"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
],
|
||||
"description": "Possible field type of required fields in payment_method_data"
|
||||
},
|
||||
"FrmAction": {
|
||||
"type": "string",
|
||||
"enum": [
|
||||
@ -7793,6 +7826,28 @@
|
||||
}
|
||||
}
|
||||
},
|
||||
"RequiredFieldInfo": {
|
||||
"type": "object",
|
||||
"description": "Required fields info used while listing the payment_method_data",
|
||||
"required": [
|
||||
"required_field",
|
||||
"display_name",
|
||||
"field_type"
|
||||
],
|
||||
"properties": {
|
||||
"required_field": {
|
||||
"type": "string",
|
||||
"description": "Required field for a payment_method through a payment_method_type"
|
||||
},
|
||||
"display_name": {
|
||||
"type": "string",
|
||||
"description": "Display name of the required field in the front-end"
|
||||
},
|
||||
"field_type": {
|
||||
"$ref": "#/components/schemas/FieldType"
|
||||
}
|
||||
}
|
||||
},
|
||||
"RetrieveApiKeyResponse": {
|
||||
"type": "object",
|
||||
"description": "The response body for retrieving an API Key.",
|
||||
|
||||
Reference in New Issue
Block a user