Bug: [FEATURE] Add required fields for giropay



### Feature Description

Add giropay wallet required fields for all connectors that implement Giropay

### Possible Implementation

Add required fields for Giropay

### Have you spent some time checking if this feature request has been raised before?

- [X] I checked and didn't find a similar issue

### Have you read the Contributing Guidelines?

- [X] I have read the [Contributing Guidelines](https://github.com/juspay/hyperswitch/blob/main/docs/CONTRIBUTING.md)

### Are you willing to submit a PR?

Yes, I am willing to submit a PR!
diff --git a/config/config.example.toml b/config/config.example.toml
index 87999f0e9e9..f592cfeb9eb 100644
--- a/config/config.example.toml
+++ b/config/config.example.toml
@@ -390,6 +390,8 @@ bank_debit.sepa = { connector_list = "gocardless" } # Mandate supported payment
 bank_redirect.ideal = {connector_list = "stripe,adyen,globalpay"} # Mandate supported payment method type and connector for bank_redirect
 bank_redirect.sofort = {connector_list = "stripe,adyen,globalpay"}
 wallet.apple_pay = { connector_list = "stripe,adyen,cybersource,noon" }
+bank_redirect.giropay = {connector_list = "adyen,globalpay"}
+
 
 
 # Required fields info used while listing the payment_method_data
diff --git a/config/deployments/integration_test.toml b/config/deployments/integration_test.toml
index 2c5d16e3e3c..6c721ab3a9f 100644
--- a/config/deployments/integration_test.toml
+++ b/config/deployments/integration_test.toml
@@ -117,8 +117,10 @@ pay_later.klarna.connector_list = "adyen"
 wallet.apple_pay.connector_list = "stripe,adyen,cybersource,noon"
 wallet.google_pay.connector_list = "stripe,adyen,cybersource"
 wallet.paypal.connector_list = "adyen"
-bank_redirect.ideal = {connector_list = "stripe,adyen,globalpay"}
-bank_redirect.sofort = {connector_list = "stripe,adyen,globalpay"}
+bank_redirect.ideal.connector_list = "stripe,adyen,globalpay"
+bank_redirect.sofort.connector_list = "stripe,adyen,globalpay"
+bank_redirect.giropay.connector_list = "adyen,globalpay"
+
 
 [multiple_api_version_supported_connectors]
 supported_connectors = "braintree"
diff --git a/config/deployments/production.toml b/config/deployments/production.toml
index 964281c52bb..b8a4f7ef20f 100644
--- a/config/deployments/production.toml
+++ b/config/deployments/production.toml
@@ -117,8 +117,9 @@ pay_later.klarna.connector_list = "adyen"
 wallet.apple_pay.connector_list = "stripe,adyen,cybersource,noon"
 wallet.google_pay.connector_list = "stripe,adyen,cybersource"
 wallet.paypal.connector_list = "adyen"
-bank_redirect.ideal = {connector_list = "stripe,adyen,globalpay"}
-bank_redirect.sofort = {connector_list = "stripe,adyen,globalpay"}
+bank_redirect.ideal.connector_list = "stripe,adyen,globalpay"
+bank_redirect.sofort.connector_list = "stripe,adyen,globalpay"
+bank_redirect.giropay.connector_list = "adyen,globalpay"
 
 [multiple_api_version_supported_connectors]
 supported_connectors = "braintree"
diff --git a/config/deployments/sandbox.toml b/config/deployments/sandbox.toml
index aa2377cf8a0..f6e1ca01f19 100644
--- a/config/deployments/sandbox.toml
+++ b/config/deployments/sandbox.toml
@@ -117,8 +117,10 @@ pay_later.klarna.connector_list = "adyen"
 wallet.apple_pay.connector_list = "stripe,adyen,cybersource,noon"
 wallet.google_pay.connector_list = "stripe,adyen,cybersource"
 wallet.paypal.connector_list = "adyen"
-bank_redirect.ideal = {connector_list = "stripe,adyen,globalpay"}
-bank_redirect.sofort = {connector_list = "stripe,adyen,globalpay"}
+bank_redirect.ideal.connector_list = "stripe,adyen,globalpay"
+bank_redirect.sofort.connector_list = "stripe,adyen,globalpay"
+bank_redirect.giropay.connector_list = "adyen,globalpay"
+
 
 [multiple_api_version_supported_connectors]
 supported_connectors = "braintree"
diff --git a/config/development.toml b/config/development.toml
index 20abb7bd6f3..5343e485a08 100644
--- a/config/development.toml
+++ b/config/development.toml
@@ -483,6 +483,7 @@ bank_debit.becs = { connector_list = "gocardless"}
 bank_debit.sepa = { connector_list = "gocardless"}
 bank_redirect.ideal = {connector_list = "stripe,adyen,globalpay"}
 bank_redirect.sofort = {connector_list = "stripe,adyen,globalpay"}
+bank_redirect.giropay = {connector_list = "adyen,globalpay"}
 
 [connector_request_reference_id_config]
 merchant_ids_send_payment_id_as_connector_request_id = []
diff --git a/config/docker_compose.toml b/config/docker_compose.toml
index e6dc01afa74..3aeb6754fbb 100644
--- a/config/docker_compose.toml
+++ b/config/docker_compose.toml
@@ -348,6 +348,8 @@ bank_debit.becs = { connector_list = "gocardless"}
 bank_debit.sepa = { connector_list = "gocardless"}
 bank_redirect.ideal = {connector_list = "stripe,adyen,globalpay"}
 bank_redirect.sofort = {connector_list = "stripe,adyen,globalpay"}
+bank_redirect.giropay = {connector_list = "adyen,globalpay"}
+
 
 [connector_customer]
 connector_list = "gocardless,stax,stripe"
diff --git a/crates/api_models/src/payments.rs b/crates/api_models/src/payments.rs
index a4f052549bd..6a9b7a12a72 100644
--- a/crates/api_models/src/payments.rs
+++ b/crates/api_models/src/payments.rs
@@ -1272,7 +1272,7 @@ pub enum BankRedirectData {
     },
     Giropay {
         /// The billing details for bank redirection
-        billing_details: BankRedirectBilling,
+        billing_details: Option<BankRedirectBilling>,
         /// Bank account details for Giropay
 
         #[schema(value_type = Option<String>)]
diff --git a/crates/router/src/configs/defaults.rs b/crates/router/src/configs/defaults.rs
index 7b88c9c2dc7..1f041c27a74 100644
--- a/crates/router/src/configs/defaults.rs
+++ b/crates/router/src/configs/defaults.rs
@@ -4480,14 +4480,226 @@ impl Default for super::settings::RequiredFields {
                         enums::PaymentMethodType::Giropay,
                         ConnectorFields {
                             fields: HashMap::from([
+                                (
+                                    enums::Connector::Aci,
+                                    RequiredFieldFinal {
+                                        mandate: HashMap::new(),
+                                        non_mandate: HashMap::from([
+                                            (
+                                                "payment_method_data.bank_redirect.giropay.country".to_string(),
+                                                RequiredFieldInfo {
+                                                    required_field: "payment_method_data.bank_redirect.giropay.country".to_string(),
+                                                    display_name: "country".to_string(),
+                                                    field_type: enums::FieldType::UserCountry {
+                                                        options: vec![
+                                                                "DE".to_string(),
+                                                        ]},
+                                                    value: None,
+                                                }
+                                            )
+                                        ]),
+                                        common: HashMap::new(),
+                                    }
+                                ),
+                                (
+                                    enums::Connector::Adyen,
+                                    RequiredFieldFinal {
+                                        mandate: HashMap::new(),
+                                        non_mandate: HashMap::new(),
+                                        common: HashMap::new(),
+                                    }
+                                ),
+                                (
+                                    enums::Connector::Globalpay,
+                                    RequiredFieldFinal {
+                                        mandate: HashMap::new(),
+                                        non_mandate: HashMap::new(),
+                                        common: HashMap::from([
+                                            ("billing.address.country".to_string(),
+                                            RequiredFieldInfo {
+                                                required_field: "billing.address.country".to_string(),
+                                                display_name: "country".to_string(),
+                                                field_type: enums::FieldType::UserAddressCountry {
+                                                    options: vec![
+                                                            "DE".to_string(),
+                                                        ]
+                                                },
+                                                value: None,
+                                            }
+                                        )
+                                        ]),
+                                    }
+                                ),
+                                (
+                                    enums::Connector::Mollie,
+                                    RequiredFieldFinal {
+                                        mandate: HashMap::new(),
+                                        non_mandate: HashMap::new(),
+                                        common: HashMap::new(),
+                                    }
+                                ),
+                                (
+                                    enums::Connector::Nuvei,
+                                    RequiredFieldFinal {
+                                        mandate: HashMap::new(),
+                                        non_mandate:HashMap::from([
+                                            (
+                                                "email".to_string(),
+                                                RequiredFieldInfo {
+                                                    required_field: "email".to_string(),
+                                                    display_name: "email".to_string(),
+                                                    field_type: enums::FieldType::UserEmailAddress,
+                                                    value: None,
+                                                }
+                                            ),
+                                            (
+                                                "billing.address.first_name".to_string(),
+                                                RequiredFieldInfo {
+                                                    required_field: "billing.address.first_name".to_string(),
+                                                    display_name: "billing_first_name".to_string(),
+                                                    field_type: enums::FieldType::UserBillingName,
+                                                    value: None,
+                                                }
+                                            ),
+                                            (
+                                                "billing.address.last_name".to_string(),
+                                                RequiredFieldInfo {
+                                                    required_field: "billing.address.last_name".to_string(),
+                                                    display_name: "billing_last_name".to_string(),
+                                                    field_type: enums::FieldType::UserBillingName,
+                                                    value: None,
+                                                }
+                                            ),
+                                            (
+                                                "billing.address.country".to_string(),
+                                                RequiredFieldInfo {
+                                                    required_field: "billing.address.country".to_string(),
+                                                    display_name: "country".to_string(),
+                                                    field_type: enums::FieldType::UserAddressCountry{
+                                                        options: vec![
+                                                            "DE".to_string(),
+                                                        ]
+                                                    },
+                                                    value: None,
+                                                }
+                                            )]
+                                        ),
+                                        common: HashMap::new(),
+                                    }
+                                ),
+                                (
+                                    enums::Connector::Paypal,
+                                    RequiredFieldFinal {
+                                        mandate: HashMap::new(),
+                                        non_mandate: HashMap::from([
+                                            ("payment_method_data.bank_redirect.giropay.country".to_string(),
+                                            RequiredFieldInfo {
+                                                required_field: "payment_method_data.bank_redirect.giropay.country".to_string(),
+                                                display_name: "country".to_string(),
+                                                field_type: enums::FieldType::UserCountry {
+                                                    options: vec![
+                                                            "DE".to_string(),
+                                                        ]
+                                                },
+                                                value: None,
+                                            }
+                                        ),
+                                        (
+                                            "payment_method_data.bank_redirect.giropay.billing_details.billing_name".to_string(),
+                                            RequiredFieldInfo {
+                                                required_field: "payment_method_data.bank_redirect.giropay.billing_details.billing_name".to_string(),
+                                                display_name: "billing_name".to_string(),
+                                                field_type: enums::FieldType::UserBillingName,
+                                                value: None,
+                                            }
+                                        )
+                                        ]),
+                                        common: HashMap::new(),
+                                    }
+                                ),
                                 (
                                     enums::Connector::Stripe,
+                                    RequiredFieldFinal {
+                                        mandate: HashMap::new(),
+                                        non_mandate: HashMap::from([
+                                            ("payment_method_data.bank_redirect.giropay.billing_details.billing_name".to_string(),
+                                            RequiredFieldInfo {
+                                                required_field: "payment_method_data.bank_redirect.giropay.billing_details.billing_name".to_string(),
+                                                display_name: "billing_name".to_string(),
+                                                field_type: enums::FieldType::UserBillingName,
+                                                value: None,
+                                            }
+                                        )
+                                        ]),
+                                        common: HashMap::new(),
+                                    }
+                                ),
+                                (
+                                    enums::Connector::Shift4,
                                     RequiredFieldFinal {
                                         mandate: HashMap::new(),
                                         non_mandate: HashMap::new(),
                                         common: HashMap::new(),
                                     }
                                 ),
+                                (
+                                    enums::Connector::Trustpay,
+                                    RequiredFieldFinal {
+                                        mandate: HashMap::new(),
+                                        non_mandate: HashMap::from([
+                                            (
+                                                "billing.address.first_name".to_string(),
+                                                RequiredFieldInfo {
+                                                    required_field: "billing.address.first_name".to_string(),
+                                                    display_name: "billing_first_name".to_string(),
+                                                    field_type: enums::FieldType::UserBillingName,
+                                                    value: None,
+                                                }
+                                            ),
+                                            (
+                                                "billing.address.line1".to_string(),
+                                                RequiredFieldInfo {
+                                                    required_field: "billing.address.line1".to_string(),
+                                                    display_name: "line1".to_string(),
+                                                    field_type: enums::FieldType::UserAddressLine1,
+                                                    value: None,
+                                                }
+                                            ),
+                                            (
+                                                "billing.address.city".to_string(),
+                                                RequiredFieldInfo {
+                                                    required_field: "billing.address.city".to_string(),
+                                                    display_name: "city".to_string(),
+                                                    field_type: enums::FieldType::UserAddressCity,
+                                                    value: None,
+                                                }
+                                            ),
+                                            (
+                                                "billing.address.zip".to_string(),
+                                                RequiredFieldInfo {
+                                                    required_field: "billing.address.zip".to_string(),
+                                                    display_name: "zip".to_string(),
+                                                    field_type: enums::FieldType::UserAddressPincode,
+                                                    value: None,
+                                                }
+                                            ),
+                                            (
+                                                "billing.address.country".to_string(),
+                                                RequiredFieldInfo {
+                                                    required_field: "billing.address.country".to_string(),
+                                                    display_name: "country".to_string(),
+                                                    field_type: enums::FieldType::UserAddressCountry {
+                                                        options: vec![
+                                                                "DE".to_string(),
+                                                            ]
+                                                    },
+                                                    value: None,
+                                                }
+                                            ),
+                                        ]),
+                                        common: HashMap::new(),
+                                    }
+                                ),
                             ]),
                         },
                     ),
diff --git a/crates/router/src/connector/aci/transformers.rs b/crates/router/src/connector/aci/transformers.rs
index 97cef72b02a..92c7e164c4c 100644
--- a/crates/router/src/connector/aci/transformers.rs
+++ b/crates/router/src/connector/aci/transformers.rs
@@ -166,10 +166,15 @@ impl
             api_models::payments::BankRedirectData::Giropay {
                 bank_account_bic,
                 bank_account_iban,
+                country,
                 ..
             } => Self::BankRedirect(Box::new(BankRedirectionPMData {
                 payment_brand: PaymentBrand::Giropay,
-                bank_account_country: Some(api_models::enums::CountryAlpha2::DE),
+                bank_account_country: Some(country.ok_or(
+                    errors::ConnectorError::MissingRequiredField {
+                        field_name: "giropay.country",
+                    },
+                )?),
                 bank_account_bank_name: None,
                 bank_account_bic: bank_account_bic.clone(),
                 bank_account_iban: bank_account_iban.clone(),
diff --git a/crates/router/src/connector/paypal/transformers.rs b/crates/router/src/connector/paypal/transformers.rs
index 88595585fe1..1447cf75be7 100644
--- a/crates/router/src/connector/paypal/transformers.rs
+++ b/crates/router/src/connector/paypal/transformers.rs
@@ -315,7 +315,12 @@ fn get_payment_source(
             country,
             ..
         } => Ok(PaymentSourceItem::Giropay(RedirectRequest {
-            name: billing_details.get_billing_name()?,
+            name: billing_details
+                .clone()
+                .ok_or(errors::ConnectorError::MissingRequiredField {
+                    field_name: "giropay.billing_details",
+                })?
+                .get_billing_name()?,
             country_code: country.ok_or(errors::ConnectorError::MissingRequiredField {
                 field_name: "giropay.country",
             })?,
diff --git a/crates/router/src/connector/stripe/transformers.rs b/crates/router/src/connector/stripe/transformers.rs
index 8d397d0ebb9..69bbceab133 100644
--- a/crates/router/src/connector/stripe/transformers.rs
+++ b/crates/router/src/connector/stripe/transformers.rs
@@ -18,7 +18,8 @@ use url::Url;
 use crate::{
     collect_missing_value_keys,
     connector::utils::{
-        self as connector_util, ApplePay, ApplePayDecrypt, PaymentsPreProcessingData, RouterData,
+        self as connector_util, ApplePay, ApplePayDecrypt, BankRedirectBillingData,
+        PaymentsPreProcessingData, RouterData,
     },
     core::errors,
     services,
@@ -1108,7 +1109,14 @@ impl TryFrom<(&payments::BankRedirectData, Option<bool>)> for StripeBillingAddre
             payments::BankRedirectData::Giropay {
                 billing_details, ..
             } => Ok(Self {
-                name: billing_details.billing_name.clone(),
+                name: Some(
+                    billing_details
+                        .clone()
+                        .ok_or(errors::ConnectorError::MissingRequiredField {
+                            field_name: "giropay.billing_details",
+                        })?
+                        .get_billing_name()?,
+                ),
                 ..Self::default()
             }),
             payments::BankRedirectData::Ideal {
diff --git a/crates/router/src/connector/worldline/transformers.rs b/crates/router/src/connector/worldline/transformers.rs
index c55663d59f4..a21c88a2ce9 100644
--- a/crates/router/src/connector/worldline/transformers.rs
+++ b/crates/router/src/connector/worldline/transformers.rs
@@ -5,7 +5,7 @@ use serde::{Deserialize, Serialize};
 use url::Url;
 
 use crate::{
-    connector::utils::{self, CardData},
+    connector::utils::{self, BankRedirectBillingData, CardData},
     core::errors,
     services,
     types::{
@@ -385,11 +385,12 @@ fn make_bank_redirect_request(
             {
                 PaymentMethodSpecificData::PaymentProduct816SpecificInput(Box::new(Giropay {
                     bank_account_iban: BankAccountIban {
-                        account_holder_name: billing_details.billing_name.clone().ok_or(
-                            errors::ConnectorError::MissingRequiredField {
-                                field_name: "billing_details.billing_name",
-                            },
-                        )?,
+                        account_holder_name: billing_details
+                            .clone()
+                            .ok_or(errors::ConnectorError::MissingRequiredField {
+                                field_name: "giropay.billing_details",
+                            })?
+                            .get_billing_name()?,
                         iban: bank_account_iban.clone(),
                     },
                 }))
diff --git a/loadtest/config/development.toml b/loadtest/config/development.toml
index 954336070d5..ee5a0c3b44c 100644
--- a/loadtest/config/development.toml
+++ b/loadtest/config/development.toml
@@ -248,6 +248,8 @@ bank_debit.becs = { connector_list = "gocardless"}
 bank_debit.sepa = { connector_list = "gocardless"}
 bank_redirect.ideal = {connector_list = "stripe,adyen,globalpay"}
 bank_redirect.sofort = {connector_list = "stripe,adyen,globalpay"}
+bank_redirect.giropay = {connector_list = "adyen,globalpay"}
+
 
 [analytics]
 source = "sqlx"
diff --git a/openapi/openapi_spec.json b/openapi/openapi_spec.json
index 9afd5182529..4fef244c461 100644
--- a/openapi/openapi_spec.json
+++ b/openapi/openapi_spec.json
@@ -5155,12 +5155,16 @@
               "giropay": {
                 "type": "object",
                 "required": [
-                  "billing_details",
                   "country"
                 ],
                 "properties": {
                   "billing_details": {
-                    "$ref": "#/components/schemas/BankRedirectBilling"
+                    "allOf": [
+                      {
+                        "$ref": "#/components/schemas/BankRedirectBilling"
+                      }
+                    ],
+                    "nullable": true
                   },
                   "bank_account_bic": {
                     "type": "string",

## Type of Change
<!-- Put an `x` in the boxes that apply -->

- [ ] Bugfix
- [ ] New feature
- [x] Enhancement
- [ ] Refactoring
- [ ] Dependency updates
- [ ] Documentation
- [ ] CI/CD

## Description
<!-- Describe your changes in detail -->
Resolves [#3622](https://github.com/juspay/hyperswitch/issues/3622)
### Test Cases
1. Create a giropay payment with mollie with empty payment method object. The payment should succeed. 

```
{
  "amount": 1000,
  "currency": "EUR",
  "confirm": true,
  "capture_method": "automatic",
  "capture_on": "2022-09-10T10:11:12Z",
  "amount_to_capture": 1000,
  "customer_id": "StripeCustomer",
  "email": "abcdef123@gmail.com",
  "name": "John Doe",
  "phone": "999999999",
  "phone_country_code": "+65",
  "description": "Its my first payment request",
  "authentication_type": "three_ds",
  "return_url": "https://google.com",
  "statement_descriptor_name": "joseph",
  "statement_descriptor_suffix": "JS",
  "payment_method": "bank_redirect",
  "payment_method_type": "giropay",
  "payment_method_data": {
    "bank_redirect": {
      "giropay": {
      }
    }
  }
}
```

Must be tested for each of this connectors

1.ACI
```
Required fields: 
    payment_method_data.bank_redirect.giropay.country
```

2. Adyen
```
None
```
3. GlobalPayments
```
Required fields: 
    billing.address.country
```
4. Mollie
```
None
```
5. Nuvie
```
Required fields: 
     email
     billing.address.first_name
     billing.address.last_name
     billing.address.country
```
6. Paypal 
```
Required fields: 
     payment_method_data.bank_redirect.giropay.billing_details.billing_name
     payment_method_data.bank_redirect.giropay.country
```
7. Shift4
```
None
```
8. Stripe  
```
Required fields 
     payment_method_data.bank_redirect.giropay.billing_details.billing_name
```
9. Trustpay
```
Required fields: 
     billing.address.first_name
     billing.address.line1
     billing.address.city
     billing.address.zip
     billing.address.country
```

-> Create a payment with confirm `false`

-> list payment methods, with client secret and publishable key

```
curl --location 'http://localhost:8080/account/payment_methods?client_secret={{client_secret}}' \
--header 'Content-Type: application/json' \
--header 'Accept: application/json' \
--header 'api-key:{{api_key}}' \
--data ''
```
 Required fields must be populated, according to the connector





## Checklist
<!-- Put an `x` in the boxes that apply -->

- [x] I formatted the code `cargo +nightly fmt --all`
- [x] I addressed lints thrown by `cargo clippy`
- [x] I reviewed the submitted code
- [ ] I added unit tests for my changes where possible
- [ ] I added a [CHANGELOG](/CHANGELOG.md) entry if applicable
