Bug: [FEATURE] [AUTHORIZEDOTNET] Support payment_method_id in recurring mandate payment



### Feature Description

Support `payment_method_id` in recurring mandate payment for connector Authorizedotnet.

### Possible Implementation

Support `payment_method_id` in recurring mandate payment for connector Authorizedotnet.

### 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/crates/router/src/connector/authorizedotnet/transformers.rs b/crates/router/src/connector/authorizedotnet/transformers.rs
index b281d0a0a77..15aedad7599 100644
--- a/crates/router/src/connector/authorizedotnet/transformers.rs
+++ b/crates/router/src/connector/authorizedotnet/transformers.rs
@@ -1,16 +1,15 @@
 use common_utils::{
     errors::CustomResult,
     ext_traits::{Encode, ValueExt},
-    id_type, pii,
 };
 use error_stack::ResultExt;
 use masking::{ExposeInterface, PeekInterface, Secret, StrongSecret};
+use rand::distributions::{Alphanumeric, DistString};
 use serde::{Deserialize, Serialize};
 
 use crate::{
     connector::utils::{
-        self, missing_field_err, CardData, PaymentsSyncRequestData, RefundsRequestData, RouterData,
-        WalletData,
+        self, CardData, PaymentsSyncRequestData, RefundsRequestData, RouterData, WalletData,
     },
     core::errors,
     services,
@@ -179,7 +178,7 @@ struct PaymentProfileDetails {
 #[derive(Debug, Serialize)]
 #[serde(rename_all = "camelCase")]
 pub struct CustomerDetails {
-    id: id_type::CustomerId,
+    id: String,
 }
 
 #[derive(Debug, Serialize)]
@@ -273,10 +272,7 @@ pub struct AuthorizedotnetZeroMandateRequest {
 #[derive(Debug, Serialize)]
 #[serde(rename_all = "camelCase")]
 struct Profile {
-    merchant_customer_id: id_type::CustomerId,
-    #[serde(skip_serializing_if = "Option::is_none")]
-    description: Option<String>,
-    email: Option<pii::Email>,
+    description: String,
     payment_profiles: PaymentProfiles,
 }
 
@@ -318,12 +314,8 @@ impl TryFrom<&types::SetupMandateRouterData> for CreateCustomerProfileRequest {
                     create_customer_profile_request: AuthorizedotnetZeroMandateRequest {
                         merchant_authentication,
                         profile: Profile {
-                            merchant_customer_id: item
-                                .customer_id
-                                .clone()
-                                .ok_or_else(missing_field_err("customer_id"))?,
-                            description: item.description.clone(),
-                            email: item.request.email.clone(),
+                            //The payment ID is included in the description because the connector requires unique description when creating a mandate.
+                            description: item.payment_id.clone(),
                             payment_profiles: PaymentProfiles {
                                 customer_type: CustomerType::Individual,
                                 payment: PaymentDetails::CreditCard(CreditCardDetails {
@@ -393,16 +385,18 @@ impl<F, T>
                 response: Ok(types::PaymentsResponseData::TransactionResponse {
                     resource_id: types::ResponseId::NoResponseId,
                     redirection_data: None,
-                    mandate_reference: item.response.customer_profile_id.map(|mandate_id| {
-                        types::MandateReference {
-                            connector_mandate_id: Some(mandate_id),
-                            payment_method_id: item
+                    mandate_reference: item.response.customer_profile_id.map(
+                        |customer_profile_id| types::MandateReference {
+                            connector_mandate_id: item
                                 .response
                                 .customer_payment_profile_id_list
                                 .first()
-                                .cloned(),
-                        }
-                    }),
+                                .map(|payment_profile_id| {
+                                    format!("{customer_profile_id}-{payment_profile_id}")
+                                }),
+                            payment_method_id: None,
+                        },
+                    ),
                     connector_metadata: None,
                     network_txn_id: None,
                     connector_response_reference_id: None,
@@ -635,27 +629,24 @@ impl
             api_models::payments::ConnectorMandateReferenceId,
         ),
     ) -> Result<Self, Self::Error> {
+        let mandate_id = connector_mandate_id
+            .connector_mandate_id
+            .ok_or(errors::ConnectorError::MissingConnectorMandateID)?;
         Ok(Self {
             transaction_type: TransactionType::try_from(item.router_data.request.capture_method)?,
             amount: item.amount,
             currency_code: item.router_data.request.currency,
             payment: None,
-            profile: Some(ProfileDetails::CustomerProfileDetails(
-                CustomerProfileDetails {
-                    customer_profile_id: Secret::from(
-                        connector_mandate_id
-                            .connector_mandate_id
-                            .ok_or(errors::ConnectorError::MissingConnectorMandateID)?,
-                    ),
-                    payment_profile: PaymentProfileDetails {
-                        payment_profile_id: Secret::from(
-                            connector_mandate_id
-                                .payment_method_id
-                                .ok_or(errors::ConnectorError::MissingConnectorMandateID)?,
-                        ),
-                    },
-                },
-            )),
+            profile: mandate_id
+                .split_once('-')
+                .map(|(customer_profile_id, payment_profile_id)| {
+                    ProfileDetails::CustomerProfileDetails(CustomerProfileDetails {
+                        customer_profile_id: Secret::from(customer_profile_id.to_string()),
+                        payment_profile: PaymentProfileDetails {
+                            payment_profile_id: Secret::from(payment_profile_id.to_string()),
+                        },
+                    })
+                }),
             order: Order {
                 description: item.router_data.connector_request_reference_id.clone(),
             },
@@ -709,11 +700,13 @@ impl
                     create_profile: true,
                 })),
                 Some(CustomerDetails {
-                    id: item
-                        .router_data
-                        .customer_id
-                        .clone()
-                        .ok_or_else(missing_field_err("customer_id"))?,
+                    //The payment ID is included in the customer details because the connector requires unique customer information with a length of fewer than 20 characters when creating a mandate.
+                    //If the length exceeds 20 characters, a random alphanumeric string is used instead.
+                    id: if item.router_data.payment_id.len() <= 20 {
+                        item.router_data.payment_id.clone()
+                    } else {
+                        Alphanumeric.sample_string(&mut rand::thread_rng(), 20)
+                    },
                 }),
             )
         } else {
@@ -1087,6 +1080,24 @@ impl<F, T>
                     .and_then(|x| x.secure_acceptance_url.to_owned());
                 let redirection_data =
                     url.map(|url| services::RedirectForm::from((url, services::Method::Get)));
+                let mandate_reference = item.response.profile_response.map(|profile_response| {
+                    let payment_profile_id = profile_response
+                        .customer_payment_profile_id_list
+                        .and_then(|customer_payment_profile_id_list| {
+                            customer_payment_profile_id_list.first().cloned()
+                        });
+                    types::MandateReference {
+                        connector_mandate_id: profile_response.customer_profile_id.and_then(
+                            |customer_profile_id| {
+                                payment_profile_id.map(|payment_profile_id| {
+                                    format!("{customer_profile_id}-{payment_profile_id}")
+                                })
+                            },
+                        ),
+                        payment_method_id: None,
+                    }
+                });
+
                 Ok(Self {
                     status,
                     response: match error {
@@ -1096,16 +1107,7 @@ impl<F, T>
                                 transaction_response.transaction_id.clone(),
                             ),
                             redirection_data,
-                            mandate_reference: item.response.profile_response.map(
-                                |profile_response| types::MandateReference {
-                                    connector_mandate_id: profile_response.customer_profile_id,
-                                    payment_method_id: profile_response
-                                        .customer_payment_profile_id_list
-                                        .and_then(|customer_payment_profile_id_list| {
-                                            customer_payment_profile_id_list.first().cloned()
-                                        }),
-                                },
-                            ),
+                            mandate_reference,
                             connector_metadata: metadata,
                             network_txn_id: transaction_response
                                 .network_trans_id

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

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

## Description
<!-- Describe your changes in detail -->
Support `payment_method_id` in recurring mandate payment for connector Authorizedotnet.

### Additional Changes

- [ ] This PR modifies the API contract
- [ ] This PR modifies the database schema
- [ ] This PR modifies application configuration/environment variables

<!--
Provide links to the files with corresponding changes.

Following are the paths where you can find config files:
1. `config`
2. `crates/router/src/configs`
3. `loadtest/config`
-->


## Motivation and Context
<!--
Why is this change required? What problem does it solve?
If it fixes an open issue, please link to the issue here.

If you don't have an issue, we'd recommend starting with one first so the PR
can focus on the implementation (unless it is an obvious bug or documentation fix
that will have little conversation).
-->
https://github.com/juspay/hyperswitch/issues/4840

## How did you test it?
<!--
Did you write an integration/unit/API test to verify the code changes?
Or did you test this change manually (provide relevant screenshots)?
-->
- Payment Intent Create (Zero):
Request:
```
curl --location 'http://localhost:8080/payments' \
--header 'Content-Type: application/json' \
--header 'Accept: application/json' \
--header 'api-key: dev_8aib7npeItergz3tpMqm1iqsMXrAdiw8VjVdjiVUWLMUSRWR34DrRDGJPmy2mcMm' \
--data '{
    "amount": 0,
    "currency": "USD",
    "confirm": false,
    "customer_id": "tester799"
}'
```

Response:
```
{
    "payment_id": "pay_hduDivSEknVCYLL3ekxX",
    "merchant_id": "merchant_1717157151",
    "status": "requires_payment_method",
    "amount": 0,
    "net_amount": 0,
    "amount_capturable": 0,
    "amount_received": null,
    "connector": null,
    "client_secret": "API_KEY_HERE",
    "created": "2024-06-03T09:25:42.690Z",
    "currency": "USD",
    "customer_id": "tester799",
    "customer": {
        "id": "tester799",
        "name": null,
        "email": null,
        "phone": null,
        "phone_country_code": null
    },
    "description": null,
    "refunds": null,
    "disputes": null,
    "mandate_id": null,
    "mandate_data": null,
    "setup_future_usage": null,
    "off_session": null,
    "capture_on": null,
    "capture_method": null,
    "payment_method": null,
    "payment_method_data": null,
    "payment_token": null,
    "shipping": null,
    "billing": null,
    "order_details": null,
    "email": null,
    "name": null,
    "phone": null,
    "return_url": null,
    "authentication_type": null,
    "statement_descriptor_name": null,
    "statement_descriptor_suffix": null,
    "next_action": null,
    "cancellation_reason": null,
    "error_code": null,
    "error_message": null,
    "unified_code": null,
    "unified_message": null,
    "payment_experience": null,
    "payment_method_type": null,
    "connector_label": null,
    "business_country": null,
    "business_label": "default",
    "business_sub_label": null,
    "allowed_payment_method_types": null,
    "ephemeral_key": {
        "customer_id": "tester799",
        "created_at": 1717406742,
        "expires": 1717410342,
        "secret": "epk_6d3c1f24d50e48ebb08373224ef23d5a"
    },
    "manual_retry_allowed": null,
    "connector_transaction_id": null,
    "frm_message": null,
    "metadata": null,
    "connector_metadata": null,
    "feature_metadata": null,
    "reference_id": null,
    "payment_link": null,
    "profile_id": "pro_lxWuQ5I3AgeVdF3GLB03",
    "surcharge_details": null,
    "attempt_count": 1,
    "merchant_decision": null,
    "merchant_connector_id": null,
    "incremental_authorization_allowed": null,
    "authorization_count": null,
    "incremental_authorizations": null,
    "external_authentication_details": null,
    "external_3ds_authentication_attempted": false,
    "expires_on": "2024-06-03T09:40:42.690Z",
    "fingerprint": null,
    "browser_info": null,
    "payment_method_id": null,
    "payment_method_status": null,
    "updated": "2024-06-03T09:25:42.781Z",
    "charges": null,
    "frm_metadata": null
}
```

- Payment Confirm (Zero):
Request:
```
curl --location 'http://localhost:8080/payments/pay_jKXxp9HeQV41lRZW4TsV/confirm' \
--header 'Content-Type: application/json' \
--header 'Accept: application/json' \
--header 'api-key: API_KEY_HERE' \
--data '{
    "setup_future_usage": "off_session",
    "payment_method": "card",
    "payment_method_type": "credit",
    "payment_type": "setup_mandate",
    "payment_method_data": {
        "card": {
            "card_number": "4111111111111111",
            "card_exp_month": "07",
            "card_exp_year": "26",
            "card_holder_name": "Joseph Does",
            "card_cvc": "123"
        }
    },
    "customer_acceptance": {
        "acceptance_type": "offline"
    }
}'
```

Response:
```
{
    "payment_id": "pay_hduDivSEknVCYLL3ekxX",
    "merchant_id": "merchant_1717157151",
    "status": "succeeded",
    "amount": 0,
    "net_amount": 0,
    "amount_capturable": 0,
    "amount_received": null,
    "connector": "authorizedotnet",
    "client_secret": "pay_hduDivSEknVCYLL3ekxX_secret_iJjHlRGKZhNU4XJto9AD",
    "created": "2024-06-03T09:25:42.690Z",
    "currency": "USD",
    "customer_id": "tester799",
    "customer": {
        "id": "tester799",
        "name": null,
        "email": null,
        "phone": null,
        "phone_country_code": null
    },
    "description": null,
    "refunds": null,
    "disputes": null,
    "mandate_id": null,
    "mandate_data": null,
    "setup_future_usage": "off_session",
    "off_session": null,
    "capture_on": null,
    "capture_method": null,
    "payment_method": "card",
    "payment_method_data": {
        "card": {
            "last4": "1111",
            "card_type": null,
            "card_network": null,
            "card_issuer": null,
            "card_issuing_country": null,
            "card_isin": "411111",
            "card_extended_bin": null,
            "card_exp_month": "07",
            "card_exp_year": "26",
            "card_holder_name": "Joseph Does",
            "payment_checks": null,
            "authentication_data": null
        },
        "billing": null
    },
    "payment_token": null,
    "shipping": null,
    "billing": null,
    "order_details": null,
    "email": null,
    "name": null,
    "phone": null,
    "return_url": null,
    "authentication_type": "no_three_ds",
    "statement_descriptor_name": null,
    "statement_descriptor_suffix": null,
    "next_action": null,
    "cancellation_reason": null,
    "error_code": null,
    "error_message": null,
    "unified_code": null,
    "unified_message": null,
    "payment_experience": null,
    "payment_method_type": "credit",
    "connector_label": null,
    "business_country": null,
    "business_label": "default",
    "business_sub_label": null,
    "allowed_payment_method_types": null,
    "ephemeral_key": null,
    "manual_retry_allowed": false,
    "connector_transaction_id": null,
    "frm_message": null,
    "metadata": null,
    "connector_metadata": null,
    "feature_metadata": null,
    "reference_id": null,
    "payment_link": null,
    "profile_id": "pro_lxWuQ5I3AgeVdF3GLB03",
    "surcharge_details": null,
    "attempt_count": 1,
    "merchant_decision": null,
    "merchant_connector_id": "mca_F6pucFwthqPFPERwAhf8",
    "incremental_authorization_allowed": null,
    "authorization_count": null,
    "incremental_authorizations": null,
    "external_authentication_details": null,
    "external_3ds_authentication_attempted": false,
    "expires_on": "2024-06-03T09:40:42.690Z",
    "fingerprint": null,
    "browser_info": {
        "language": null,
        "time_zone": null,
        "ip_address": "::1",
        "user_agent": null,
        "color_depth": null,
        "java_enabled": null,
        "screen_width": null,
        "accept_header": null,
        "screen_height": null,
        "java_script_enabled": null
    },
    "payment_method_id": "pm_D0ahV0rd04bLhjjYrV2I",
    "payment_method_status": null,
    "updated": "2024-06-03T09:28:35.781Z",
    "charges": null,
    "frm_metadata": null
}
```

- Payment Intent Create (Non-Zero):
Request:
```
curl --location 'http://localhost:8080/payments' \
--header 'Content-Type: application/json' \
--header 'Accept: application/json' \
--header 'api-key: API_KEY_HERE' \
--data '{
    "amount": 370,
    "currency": "USD",
    "confirm": false,
    "customer_id": "tester799"
}'
```

Response:
```
{
    "payment_id": "pay_ZBSRCNSVIqDtDcw6IsUz",
    "merchant_id": "merchant_1717157151",
    "status": "requires_payment_method",
    "amount": 370,
    "net_amount": 370,
    "amount_capturable": 0,
    "amount_received": null,
    "connector": null,
    "client_secret": "pay_ZBSRCNSVIqDtDcw6IsUz_secret_uZouNfEDWSG1goR8XmeG",
    "created": "2024-06-03T09:27:07.982Z",
    "currency": "USD",
    "customer_id": "tester799",
    "customer": {
        "id": "tester799",
        "name": null,
        "email": null,
        "phone": null,
        "phone_country_code": null
    },
    "description": null,
    "refunds": null,
    "disputes": null,
    "mandate_id": null,
    "mandate_data": null,
    "setup_future_usage": null,
    "off_session": null,
    "capture_on": null,
    "capture_method": null,
    "payment_method": null,
    "payment_method_data": null,
    "payment_token": null,
    "shipping": null,
    "billing": null,
    "order_details": null,
    "email": null,
    "name": null,
    "phone": null,
    "return_url": null,
    "authentication_type": null,
    "statement_descriptor_name": null,
    "statement_descriptor_suffix": null,
    "next_action": null,
    "cancellation_reason": null,
    "error_code": null,
    "error_message": null,
    "unified_code": null,
    "unified_message": null,
    "payment_experience": null,
    "payment_method_type": null,
    "connector_label": null,
    "business_country": null,
    "business_label": "default",
    "business_sub_label": null,
    "allowed_payment_method_types": null,
    "ephemeral_key": {
        "customer_id": "tester799",
        "created_at": 1717406827,
        "expires": 1717410427,
        "secret": "epk_9301e21e18a54abe870465212fee94d2"
    },
    "manual_retry_allowed": null,
    "connector_transaction_id": null,
    "frm_message": null,
    "metadata": null,
    "connector_metadata": null,
    "feature_metadata": null,
    "reference_id": null,
    "payment_link": null,
    "profile_id": "pro_lxWuQ5I3AgeVdF3GLB03",
    "surcharge_details": null,
    "attempt_count": 1,
    "merchant_decision": null,
    "merchant_connector_id": null,
    "incremental_authorization_allowed": null,
    "authorization_count": null,
    "incremental_authorizations": null,
    "external_authentication_details": null,
    "external_3ds_authentication_attempted": false,
    "expires_on": "2024-06-03T09:42:07.982Z",
    "fingerprint": null,
    "browser_info": null,
    "payment_method_id": null,
    "payment_method_status": null,
    "updated": "2024-06-03T09:27:08.012Z",
    "charges": null,
    "frm_metadata": null
}
```

- Payment Confirm (Non-Zero):

Request:
```
curl --location 'http://localhost:8080/payments/pay_ZBSRCNSVIqDtDcw6IsUz/confirm' \
--header 'Content-Type: application/json' \
--header 'Accept: application/json' \
--header 'api-key: API_KEY_HERE' \
--data '{
    "setup_future_usage": "off_session",
    "payment_method": "card",
    "payment_method_type": "credit",
    "payment_type": "setup_mandate",
    "payment_method_data": {
        "card": {
            "card_number": "4111111111111111",
            "card_exp_month": "07",
            "card_exp_year": "26",
            "card_holder_name": "Joseph Does",
            "card_cvc": "123"
        }
    },
    "customer_acceptance": {
        "acceptance_type": "offline"
    }
}'
```

Response:
```
{
    "payment_id": "pay_ZBSRCNSVIqDtDcw6IsUz",
    "merchant_id": "merchant_1717157151",
    "status": "succeeded",
    "amount": 370,
    "net_amount": 370,
    "amount_capturable": 370,
    "amount_received": null,
    "connector": "authorizedotnet",
    "client_secret": "pay_ZBSRCNSVIqDtDcw6IsUz_secret_uZouNfEDWSG1goR8XmeG",
    "created": "2024-06-03T09:27:07.982Z",
    "currency": "USD",
    "customer_id": "tester799",
    "customer": {
        "id": "tester799",
        "name": null,
        "email": null,
        "phone": null,
        "phone_country_code": null
    },
    "description": null,
    "refunds": null,
    "disputes": null,
    "mandate_id": null,
    "mandate_data": null,
    "setup_future_usage": "off_session",
    "off_session": null,
    "capture_on": null,
    "capture_method": null,
    "payment_method": "card",
    "payment_method_data": {
        "card": {
            "last4": "1111",
            "card_type": null,
            "card_network": null,
            "card_issuer": null,
            "card_issuing_country": null,
            "card_isin": "411111",
            "card_extended_bin": null,
            "card_exp_month": "07",
            "card_exp_year": "26",
            "card_holder_name": "Joseph Does",
            "payment_checks": null,
            "authentication_data": null
        },
        "billing": null
    },
    "payment_token": null,
    "shipping": null,
    "billing": null,
    "order_details": null,
    "email": null,
    "name": null,
    "phone": null,
    "return_url": null,
    "authentication_type": "no_three_ds",
    "statement_descriptor_name": null,
    "statement_descriptor_suffix": null,
    "next_action": null,
    "cancellation_reason": null,
    "error_code": null,
    "error_message": null,
    "unified_code": null,
    "unified_message": null,
    "payment_experience": null,
    "payment_method_type": "credit",
    "connector_label": null,
    "business_country": null,
    "business_label": "default",
    "business_sub_label": null,
    "allowed_payment_method_types": null,
    "ephemeral_key": null,
    "manual_retry_allowed": false,
    "connector_transaction_id": null,
    "frm_message": null,
    "metadata": null,
    "connector_metadata": null,
    "feature_metadata": null,
    "reference_id": null,
    "payment_link": null,
    "profile_id": "pro_lxWuQ5I3AgeVdF3GLB03",
    "surcharge_details": null,
    "attempt_count": 1,
    "merchant_decision": null,
    "merchant_connector_id": "mca_F6pucFwthqPFPERwAhf8",
    "incremental_authorization_allowed": null,
    "authorization_count": null,
    "incremental_authorizations": null,
    "external_authentication_details": null,
    "external_3ds_authentication_attempted": false,
    "expires_on": "2024-06-03T09:42:07.982Z",
    "fingerprint": null,
    "browser_info": {
        "language": null,
        "time_zone": null,
        "ip_address": "::1",
        "user_agent": null,
        "color_depth": null,
        "java_enabled": null,
        "screen_width": null,
        "accept_header": null,
        "screen_height": null,
        "java_script_enabled": null
    },
    "payment_method_id": "pm_KOptxkOcyGWIly77GCiQ",
    "payment_method_status": null,
    "updated": "2024-06-03T09:29:35.382Z",
    "charges": null,
    "frm_metadata": null
}
```

- Payments Create - Using payment_method_id:

Request:
```
curl --location 'http://localhost:8080/payments' \
--header 'Content-Type: application/json' \
--header 'Accept: application/json' \
--header 'api-key: API_KEY_HERE' \
--data '{
    "amount": 400,
    "currency": "USD",
    "confirm": true,
    "customer_id": "tester799",
    
    "recurring_details": {
        "type": "payment_method_id",
        "data": "pm_D0ahV0rd04bLhjjYrV2I"
    },
    "off_session": true
}'
```

Response:
```
{
    "payment_id": "pay_3Z93A6rW7b2qOUHxED2H",
    "merchant_id": "merchant_1717157151",
    "status": "succeeded",
    "amount": 400,
    "net_amount": 400,
    "amount_capturable": 0,
    "amount_received": 400,
    "connector": "authorizedotnet",
    "client_secret": "pay_3Z93A6rW7b2qOUHxED2H_secret_BonNTHUTARbIb2QiWN2o",
    "created": "2024-06-03T09:32:47.521Z",
    "currency": "USD",
    "customer_id": "tester799",
    "customer": {
        "id": "tester799",
        "name": null,
        "email": null,
        "phone": null,
        "phone_country_code": null
    },
    "description": null,
    "refunds": null,
    "disputes": null,
    "mandate_id": null,
    "mandate_data": null,
    "setup_future_usage": null,
    "off_session": null,
    "capture_on": null,
    "capture_method": null,
    "payment_method": "card",
    "payment_method_data": {
        "card": {
            "last4": "1111",
            "card_type": null,
            "card_network": null,
            "card_issuer": null,
            "card_issuing_country": null,
            "card_isin": "411111",
            "card_extended_bin": null,
            "card_exp_month": "07",
            "card_exp_year": "26",
            "card_holder_name": "Joseph Does",
            "payment_checks": null,
            "authentication_data": null
        },
        "billing": null
    },
    "payment_token": null,
    "shipping": null,
    "billing": null,
    "order_details": null,
    "email": null,
    "name": null,
    "phone": null,
    "return_url": null,
    "authentication_type": "no_three_ds",
    "statement_descriptor_name": null,
    "statement_descriptor_suffix": null,
    "next_action": null,
    "cancellation_reason": null,
    "error_code": null,
    "error_message": null,
    "unified_code": null,
    "unified_message": null,
    "payment_experience": null,
    "payment_method_type": "credit",
    "connector_label": null,
    "business_country": null,
    "business_label": "default",
    "business_sub_label": null,
    "allowed_payment_method_types": null,
    "ephemeral_key": {
        "customer_id": "tester799",
        "created_at": 1717407167,
        "expires": 1717410767,
        "secret": "epk_bf0885fc144047dcb5dad7a35be92057"
    },
    "manual_retry_allowed": false,
    "connector_transaction_id": "80019529820",
    "frm_message": null,
    "metadata": null,
    "connector_metadata": null,
    "feature_metadata": null,
    "reference_id": "80019529820",
    "payment_link": null,
    "profile_id": "pro_lxWuQ5I3AgeVdF3GLB03",
    "surcharge_details": null,
    "attempt_count": 1,
    "merchant_decision": null,
    "merchant_connector_id": "mca_F6pucFwthqPFPERwAhf8",
    "incremental_authorization_allowed": null,
    "authorization_count": null,
    "incremental_authorizations": null,
    "external_authentication_details": null,
    "external_3ds_authentication_attempted": false,
    "expires_on": "2024-06-03T09:47:47.521Z",
    "fingerprint": null,
    "browser_info": null,
    "payment_method_id": "pm_D0ahV0rd04bLhjjYrV2I",
    "payment_method_status": "active",
    "updated": "2024-06-03T09:32:48.396Z",
    "charges": null,
    "frm_metadata": null
}
```

## 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
