Issue:
Bug: [BUG] [BOA/CYBERSOURCE] merchant_defined_information giving authentication error



### Bug Description

Some payments fail when `merchant_defined_information` is passed for each payment with data coming from merchant in payment requests metadata.

### Expected Behavior

All payments should succeed when `merchant_defined_information` is passed for each payment with data coming from merchant in payment requests metadata.

### Actual Behavior

Some payments fail when `merchant_defined_information` is passed for each payment with data coming from merchant in payment requests metadata.

### Steps To Reproduce

Provide an unambiguous set of steps to reproduce this bug. Include code or configuration to reproduce, if relevant.
1. Go to '...'
2. Click on '....'
3. Scroll down to '....'


### Context For The Bug

Due to hashmap being used to populate key,value pairs in merchantDefinedInformation the order in which the (key,value) pairs gets inserted into merchantDefinedInformation is not fixed. Due to which for some payments there is a mismatch between the body used in generation of signature(in payments headers) and the body passed in the actual request. This mismatch causes the connector to throw authentication error for some payments.

### Environment

Are you using hyperswitch hosted version? Yes/No
If yes, please provide the value of the `x-request-id` response header to help us debug your issue.

If not (or if building/running locally), please provide the following details:
1. Operating System or Linux distribution:
2. Rust version (output of `rustc --version`): ``
3. App version (output of `cargo r --features vergen -- --version`): ``


### Have you spent some time checking if this bug 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!

Pull request description:
## Type of Change
<!-- Put an `x` in the boxes that apply -->

- [x] Bugfix
- [ ] New feature
- [ ] Enhancement
- [ ] Refactoring
- [ ] Dependency updates
- [ ] Documentation
- [ ] CI/CD

## Description
<!-- Describe your changes in detail -->
Some payments fail when merchant_defined_information is passed for the payment with data coming from merchant in payment requests metadata.

This was happening because hashmaps were being used to populate key,value pairs in merchantDefinedInformation due to which the order in which the (key,value) pairs gets inserted into merchantDefinedInformation was not fixed. Due to this for some payments there was a mismatch between the body used in generation of signature(for payments headers) and the body which was being passed in the actual request. This mismatch caused the connector to throw authentication error for those payments.

### 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/3282

## 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)?
-->
Testing can be done by creating a card/gpay/applepay payment and by passing the following metadata in PAYMENTS-CREATE:
`"metadata": {
    "count_tickets": 1,
    "transaction_number": "5590043"
}`

You should then be able to see the metadata on BOA dashboard for that payment:
![292885857-2693f174-0552-45a9-af42-6606e874231f](https://github.com/juspay/hyperswitch/assets/41580413/442f415a-b788-485a-88ad-9bf71dc934ba)


## 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


Testing:

Testing can be done by creating a card/gpay/applepay payment and by passing the following metadata in PAYMENTS-CREATE:
`"metadata": {
    "count_tickets": 1,
    "transaction_number": "5590043"
}`

You should then be able to see the metadata on BOA dashboard for that payment:
![292885857-2693f174-0552-45a9-af42-6606e874231f](https://github.com/juspay/hyperswitch/assets/41580413/442f415a-b788-485a-88ad-9bf71dc934ba)

Patch:
diff --git a/crates/router/src/connector/bankofamerica/transformers.rs b/crates/router/src/connector/bankofamerica/transformers.rs
index def93ec5f83..aa47efbe714 100644
--- a/crates/router/src/connector/bankofamerica/transformers.rs
+++ b/crates/router/src/connector/bankofamerica/transformers.rs
@@ -1,5 +1,3 @@
-use std::collections::HashMap;
-
 use api_models::payments;
 use base64::Engine;
 use common_utils::pii;
@@ -323,8 +321,9 @@ impl From<&BankOfAmericaRouterData<&types::PaymentsAuthorizeRouterData>>
 
 impl ForeignFrom<Value> for Vec<MerchantDefinedInformation> {
     fn foreign_from(metadata: Value) -> Self {
-        let hashmap: HashMap<String, Value> =
-            serde_json::from_str(&metadata.to_string()).unwrap_or(HashMap::new());
+        let hashmap: std::collections::BTreeMap<String, Value> =
+            serde_json::from_str(&metadata.to_string())
+                .unwrap_or(std::collections::BTreeMap::new());
         let mut vector: Self = Self::new();
         let mut iter = 1;
         for (key, value) in hashmap {
diff --git a/crates/router/src/connector/cybersource/transformers.rs b/crates/router/src/connector/cybersource/transformers.rs
index cf769f1a2fd..e6034f7af7f 100644
--- a/crates/router/src/connector/cybersource/transformers.rs
+++ b/crates/router/src/connector/cybersource/transformers.rs
@@ -1,5 +1,3 @@
-use std::collections::HashMap;
-
 use api_models::payments;
 use base64::Engine;
 use common_utils::pii;
@@ -543,8 +541,9 @@ fn build_bill_to(
 
 impl ForeignFrom<Value> for Vec<MerchantDefinedInformation> {
     fn foreign_from(metadata: Value) -> Self {
-        let hashmap: HashMap<String, Value> =
-            serde_json::from_str(&metadata.to_string()).unwrap_or(HashMap::new());
+        let hashmap: std::collections::BTreeMap<String, Value> =
+            serde_json::from_str(&metadata.to_string())
+                .unwrap_or(std::collections::BTreeMap::new());
         let mut vector: Self = Self::new();
         let mut iter = 1;
         for (key, value) in hashmap {