Skip to content

feat(tokenio): Add OpenBanking Redirection Flow#8152

Merged
likhinbopanna merged 9 commits intomainfrom
9680-featfeature-tokenio-add-payment-flows-pr
Jun 9, 2025
Merged

feat(tokenio): Add OpenBanking Redirection Flow#8152
likhinbopanna merged 9 commits intomainfrom
9680-featfeature-tokenio-add-payment-flows-pr

Conversation

@awasthi21
Copy link
Contributor

@awasthi21 awasthi21 commented May 27, 2025

Type of Change

  • Bugfix
  • New feature
  • Enhancement
  • Refactoring
  • Dependency updates
  • Documentation
  • CI/CD

Description

Added OpenBanking Flow for Tokenio

Additional Changes

  • This PR modifies the API contract
  • This PR modifies the database schema
  • This PR modifies application configuration/environment variables

Motivation and Context

How did you test it?

MCA Create

{
    "connector_name": "tokenio",
    "connector_type": "payment_processor",
    "connector_account_details": {
        "auth_type": "MultiAuthKey",
        "api_key": "",
        "key1": "",
        "api_secret": "",
        "key2": ""
    },
    "test_mode": true,
    "disabled": false,
    "payment_methods_enabled": [
        {
            "payment_method": "open_banking",
            "payment_method_types": [
                {
                    "payment_method_type": "open_banking_pis",
                    "minimum_amount": 0,
                    "maximum_amount": 68607706,
                    "recurring_enabled": true,
                    "installment_payment_enabled": false
                }
            ]
        }
    ],
    "connector_webhook_details": {
        "merchant_secret": ""
    },
    "business_country": "US",
    "business_label": "default",
    "connector_label": "stripe_US_default",
    "additional_merchant_data": {
        "open_banking_recipient_data": {
            "account_data": {
                "sepa":{
                    "name":"",
                    "iban":"",
                    "bic": ""
                }
            }
        }
    }
}

Payments Create

curl --location 'http://localhost:8080/payments' \
--header 'Content-Type: application/json' \
--header 'Accept: application/json' \
--header 'api-key: dev_f7vpzTvr8iTfK2WcpkHVR6lHqsp5Wivga9b9VkYfSbqd94dVhXR9eKQ0p3V1aZVF' \
--data-raw '{
    "amount": 1023,
    "payment_method":"open_banking",
    "payment_method_type":"open_banking_pis",
    "payment_method_data":{
        "open_banking":{
            "open_banking_pis":{}
        }
    },
    "currency": "EUR",
    "confirm": true,
    "return_url": "https://hyperswitch.requestcatcher.com/",
    "email": "user@gmail.com",
    "description": "Hello this is description",
    "shipping": {
        "address": {
            "state": "California",
            "city": "Banglore",
            "country": "US",
            "line1": "sdsdfsdf",
            "line2": "hsgdbhd",
            "line3": "alsksoe",
            "zip": "571201",
            "first_name": "John",
            "last_name": "Doe"
        },
        "phone": {
            "number": "123456789",
            "country_code": "+1"
        }
    },

    "metadata": {
        "udf1": "value1",
        "new_customer": "true",
        "login_date": "2019-09-10T10:11:12Z"
    },
    "billing": {
        "address": {
            "line1": "1467",
            "line2": "Harrison Street",
            "line3": "Harrison Street",
            "city": "San Fransico",
            "state": "California",
            "zip": "94122",
            "country": "US",
            "first_name": "joseph",
            "last_name": "Doe"
        },
        "phone": {
            "number": "8056594427",
            "country_code": "+91"
        }
    },
    "customer_id": "hyperswitch_sdk_demo_id"
}'

Response

{
    "payment_id": "pay_lnjZ6CXYSXzAbaEBbRUV",
    "merchant_id": "merchant_1748828604",
    "status": "requires_customer_action",
    "amount": 1023,
    "net_amount": 1023,
    "shipping_cost": null,
    "amount_capturable": 1023,
    "amount_received": null,
    "connector": "tokenio",
    "client_secret": "pay_lnjZ6CXYSXzAbaEBbRUV_secret_Qu9qYCowz1xbZrcVKLnF",
    "created": "2025-06-02T01:47:49.067Z",
    "currency": "EUR",
    "customer_id": "hyperswitch_sdk_demo_id",
    "customer": {
        "id": "hyperswitch_sdk_demo_id",
        "name": null,
        "email": "user@gmail.com",
        "phone": null,
        "phone_country_code": null
    },
    "description": "Hello this is description",
    "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": "open_banking",
    "payment_method_data": {
        "open_banking": {
            "open_banking_pis": {}
        },
        "billing": null
    },
    "payment_token": null,
    "shipping": {
        "address": {
            "city": "Banglore",
            "country": "US",
            "line1": "sdsdfsdf",
            "line2": "hsgdbhd",
            "line3": "alsksoe",
            "zip": "571201",
            "state": "California",
            "first_name": "John",
            "last_name": "Doe"
        },
        "phone": {
            "number": "123456789",
            "country_code": "+1"
        },
        "email": null
    },
    "billing": {
        "address": {
            "city": "San Fransico",
            "country": "US",
            "line1": "1467",
            "line2": "Harrison Street",
            "line3": "Harrison Street",
            "zip": "94122",
            "state": "California",
            "first_name": "joseph",
            "last_name": "Doe"
        },
        "phone": {
            "number": "8056594427",
            "country_code": "+91"
        },
        "email": null
    },
    "order_details": null,
    "email": "user@gmail.com",
    "name": null,
    "phone": null,
    "return_url": "https://hyperswitch.requestcatcher.com/",
    "authentication_type": "no_three_ds",
    "statement_descriptor_name": null,
    "statement_descriptor_suffix": null,
    "next_action": {
        "type": "redirect_to_url",
        "redirect_to_url": "http://localhost:8080/payments/redirect/pay_lnjZ6CXYSXzAbaEBbRUV/merchant_1748828604/pay_lnjZ6CXYSXzAbaEBbRUV_1"
    },
    "cancellation_reason": null,
    "error_code": null,
    "error_message": null,
    "unified_code": null,
    "unified_message": null,
    "payment_experience": null,
    "payment_method_type": "open_banking_pis",
    "connector_label": null,
    "business_country": null,
    "business_label": "default",
    "business_sub_label": null,
    "allowed_payment_method_types": null,
    "ephemeral_key": {
        "customer_id": "hyperswitch_sdk_demo_id",
        "created_at": 1748828869,
        "expires": 1748832469,
        "secret": "epk_2933d08ab87442ff81659f7deb51bafb"
    },
    "manual_retry_allowed": null,
    "connector_transaction_id": "pm2:wiM9uNqPuMPGvtUw2dMpnuGY7VV:2gFUX1NDegn",
    "frm_message": null,
    "metadata": {
        "udf1": "value1",
        "login_date": "2019-09-10T10:11:12Z",
        "new_customer": "true"
    },
    "connector_metadata": {
        "apple_pay": null,
        "airwallex": null,
        "noon": {
            "order_category": "applepay"
        },
        "braintree": null,
        "adyen": null
    },
    "feature_metadata": null,
    "reference_id": null,
    "payment_link": null,
    "profile_id": "pro_MvUrdzpFtLmHlW2I0HBY",
    "surcharge_details": null,
    "attempt_count": 1,
    "merchant_decision": null,
    "merchant_connector_id": "mca_Z1YfTpUU5y7ZFWDBLz5Q",
    "incremental_authorization_allowed": null,
    "authorization_count": null,
    "incremental_authorizations": null,
    "external_authentication_details": null,
    "external_3ds_authentication_attempted": false,
    "expires_on": "2025-06-02T02:02:49.067Z",
    "fingerprint": null,
    "browser_info": null,
    "payment_method_id": null,
    "payment_method_status": null,
    "updated": "2025-06-02T01:47:49.410Z",
    "split_payments": null,
    "frm_metadata": null,
    "extended_authorization_applied": null,
    "capture_before": null,
    "merchant_order_reference_id": null,
    "order_tax_amount": null,
    "connector_mandate_id": null,
    "card_discovery": null,
    "force_3ds_challenge": false,
    "force_3ds_challenge_trigger": false,
    "issuer_error_code": null,
    "issuer_error_message": null,
    "is_iframe_redirection_enabled": null,
    "whole_connector_response": null
}
Screenshot 2025-06-02 at 7 24 57 AM

Checklist

  • I formatted the code cargo +nightly fmt --all
  • I addressed lints thrown by cargo clippy
  • I reviewed the submitted code
  • I added unit tests for my changes where possible

@awasthi21 awasthi21 self-assigned this May 27, 2025
@awasthi21 awasthi21 requested review from a team as code owners May 27, 2025 06:00
@semanticdiff-com
Copy link

semanticdiff-com bot commented May 27, 2025

Review changes with  SemanticDiff

Changed Files
File Status
  crates/pm_auth/src/connector/plaid.rs  79% smaller
  crates/pm_auth/src/connector/plaid/transformers.rs  45% smaller
  crates/router/src/core/payments/helpers.rs  38% smaller
  crates/hyperswitch_connectors/src/connectors/tokenio/transformers.rs  12% smaller
  crates/api_models/src/admin.rs  10% smaller
  api-reference-v2/openapi_spec.json  5% smaller
  api-reference/openapi_spec.json  5% smaller
  crates/hyperswitch_connectors/src/connectors/tokenio.rs  5% smaller
  crates/router/src/core/admin.rs  1% smaller
  Cargo.lock Unsupported file format
  config/config.example.toml Unsupported file format
  config/deployments/integration_test.toml Unsupported file format
  config/deployments/production.toml Unsupported file format
  config/deployments/sandbox.toml Unsupported file format
  config/development.toml Unsupported file format
  config/docker_compose.toml Unsupported file format
  crates/common_enums/src/connector_enums.rs  0% smaller
  crates/common_utils/src/crypto.rs  0% smaller
  crates/connector_configs/src/connector.rs  0% smaller
  crates/connector_configs/toml/development.toml Unsupported file format
  crates/connector_configs/toml/production.toml Unsupported file format
  crates/connector_configs/toml/sandbox.toml Unsupported file format
  crates/hyperswitch_connectors/Cargo.toml Unsupported file format
  crates/pm_auth/src/core/errors.rs  0% smaller
  crates/pm_auth/src/types.rs  0% smaller
  crates/router/src/consts.rs  0% smaller
  crates/router/src/core/payment_methods/cards.rs  0% smaller
  crates/router/src/core/pm_auth/transformers.rs  0% smaller
  crates/router/src/core/utils.rs  0% smaller
  crates/router/src/types.rs  0% smaller
  crates/router/src/types/api.rs  0% smaller
  crates/router/src/types/transformers.rs  0% smaller
  loadtest/config/development.toml Unsupported file format

@awasthi21 awasthi21 changed the title Initial commit feat(tokenio): Add OpenBanking Redirection Flow May 27, 2025
@hyperswitch-bot hyperswitch-bot bot added the M-api-contract-changes Metadata: This PR involves API contract changes label May 27, 2025
@awasthi21 awasthi21 force-pushed the 9680-featfeature-tokenio-add-payment-flows-pr branch from 1e18b97 to 7045f58 Compare May 27, 2025 06:16
@hyperswitch-bot hyperswitch-bot bot added M-api-contract-changes Metadata: This PR involves API contract changes and removed M-api-contract-changes Metadata: This PR involves API contract changes labels May 27, 2025
@awasthi21 awasthi21 force-pushed the 9680-featfeature-tokenio-add-payment-flows-pr branch from 1747552 to 9d67363 Compare May 28, 2025 06:04
@hyperswitch-bot hyperswitch-bot bot removed the M-api-contract-changes Metadata: This PR involves API contract changes label May 28, 2025
#[serde(skip_serializing_if = "Option::is_none")]
connector_recipient_id: Option<Secret<String>>,
},
Sepa {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think we dont need SEPA here as we already have IBAN?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Can't we have a transform for this as all the fields are the same here.


#[cfg(all(feature = "v2", feature = "revenue_recovery"))]
default_imp_for_billing_connector_invoice_sync!(
connectors::Tokenio,
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

alphabetical order

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

fixed

}

// JWT helper methods
// fn create_jwt_token(
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

we can remove this comment.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

removed

@awasthi21 awasthi21 requested a review from deepanshu-iiitu June 2, 2025 01:55
@awasthi21 awasthi21 force-pushed the 9680-featfeature-tokenio-add-payment-flows-pr branch from 9d67363 to 40122b1 Compare June 2, 2025 02:41
@hyperswitch-bot hyperswitch-bot bot added the M-api-contract-changes Metadata: This PR involves API contract changes label Jun 2, 2025
@awasthi21 awasthi21 force-pushed the 9680-featfeature-tokenio-add-payment-flows-pr branch from f617f7f to 9ad4a1b Compare June 2, 2025 05:20
@hyperswitch-bot hyperswitch-bot bot added M-api-contract-changes Metadata: This PR involves API contract changes and removed M-api-contract-changes Metadata: This PR involves API contract changes labels Jun 2, 2025
deepanshu-iiitu
deepanshu-iiitu previously approved these changes Jun 2, 2025
#[serde(skip_serializing_if = "Option::is_none")]
connector_recipient_id: Option<Secret<String>>,
},
FasterPayments {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Add documentation for all the fields

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

added

Comment on lines +2022 to +2025
if serde_json::from_str::<serde_json::Value>(&enc_card_data).is_ok() {
logger::debug!("Data appears to be plain JSON, returning as-is");
return Ok(Secret::new(enc_card_data));
}
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The function says decode and decrypt data so here we are not supposed to get the plan data.
If there is a case where some data does not need to be encrypted, what kind of data would that be?
If we are storing it in a locker, isn't all of it considered sensitive?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Earlier, we were not storing the bank details in the locker — for example, in the case of Plaid, this was not being done.
I’ve now added the encryption logic in the async fn locker_recipient_create_call function
Also removed this check as its not needed any more

@@ -152,21 +152,32 @@ pub enum PlaidRecipientAccountData {
},
}
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@Sarthak1799 can you review the plaid related changes ?

let public_key = ring::signature::UnparsedPublicKey::new(&ring::signature::ED25519, secret);
match public_key.verify(msg, signature) {
Ok(()) => Ok(true),
Err(_) => Ok(false),
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Returning Ok(false) when a signature fails might hide problems—most cryptographic signature verification functions return an error on failure. Returning Ok(false) makes it harder to distinguish between actual errors and valid rejections.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

raising error now

  Err(_) => {
                // Signature verification failed - this is a legitimate failure,
                // not an error condition. The signature is well-formed but invalid.
                Err(errors::CryptoError::SignatureVerificationFailed)
                    .attach_printable("ED25519 signature verification failed")
            }

Comment on lines +344 to +357
if secret.len() != 32 {
return Err(errors::CryptoError::InvalidKeyLength).attach_printable(format!(
"Invalid ED25519 public key length: expected 32 bytes, got {}",
secret.len()
));
}
if signature.len() != 64 {
return Err(errors::CryptoError::SignatureVerificationFailed).attach_printable(
format!(
"Invalid ED25519 signature length: expected 64 bytes, got {}",
signature.len()
),
);
}
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

If this validation is generic to Ed25519 the have these as constants. Create a function for validation that will have the above logic.

const ED25519_PUBLIC_KEY_LEN: usize = 32;
const ED25519_SIGNATURE_LEN: usize = 64;

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

yes this generic to Ed25519
added a new function to validate the inputs

impl Ed25519 {
    /// ED25519 algorithm constants
    const ED25519_PUBLIC_KEY_LEN: usize = 32;
    const ED25519_SIGNATURE_LEN: usize = 64;
    /// Validates ED25519 inputs (public key and signature lengths)
    fn validate_inputs(
        public_key: &[u8],
        signature: &[u8],
    ) -> CustomResult<(), errors::CryptoError> {
        // Validate public key length
        if public_key.len() != Self::ED25519_PUBLIC_KEY_LEN {
            return Err(errors::CryptoError::InvalidKeyLength).attach_printable(format!(
                "Invalid ED25519 public key length: expected {} bytes, got {}",
                Self::ED25519_PUBLIC_KEY_LEN,
                public_key.len()
            ));
        }

        // Validate signature length
        if signature.len() != Self::ED25519_SIGNATURE_LEN {
            return Err(errors::CryptoError::InvalidKeyLength).attach_printable(format!(
                "Invalid ED25519 signature length: expected {} bytes, got {}",
                Self::ED25519_SIGNATURE_LEN,
                signature.len()
            ));
        }

        Ok(())
    }
}

@awasthi21 awasthi21 force-pushed the 9680-featfeature-tokenio-add-payment-flows-pr branch from 7fc2ada to 56e31af Compare June 5, 2025 06:10
@hyperswitch-bot hyperswitch-bot bot removed the M-api-contract-changes Metadata: This PR involves API contract changes label Jun 5, 2025
@hyperswitch-bot hyperswitch-bot bot added the M-api-contract-changes Metadata: This PR involves API contract changes label Jun 6, 2025
@awasthi21 awasthi21 force-pushed the 9680-featfeature-tokenio-add-payment-flows-pr branch from f7d3a29 to 84cd2e9 Compare June 6, 2025 11:24
@hyperswitch-bot hyperswitch-bot bot added M-api-contract-changes Metadata: This PR involves API contract changes and removed M-api-contract-changes Metadata: This PR involves API contract changes labels Jun 6, 2025
deepanshu-iiitu
deepanshu-iiitu previously approved these changes Jun 6, 2025
ShankarSinghC
ShankarSinghC previously approved these changes Jun 6, 2025
Sarthak1799
Sarthak1799 previously approved these changes Jun 6, 2025
Copy link
Contributor

@Sarthak1799 Sarthak1799 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Plaid specific changes look okay.

@awasthi21 awasthi21 force-pushed the 9680-featfeature-tokenio-add-payment-flows-pr branch from 4ec961d to 313907b Compare June 9, 2025 06:39
@hyperswitch-bot hyperswitch-bot bot removed the M-api-contract-changes Metadata: This PR involves API contract changes label Jun 9, 2025
@awasthi21 awasthi21 force-pushed the 9680-featfeature-tokenio-add-payment-flows-pr branch from 313907b to 5e02fa6 Compare June 9, 2025 06:40
// Perform verification
match ring_public_key.verify(msg, signature) {
Ok(()) => Ok(true),
Err(_err) => {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Nit:

Suggested change
Err(_err) => {
Err(err) => {

@hyperswitch-bot hyperswitch-bot bot added the M-api-contract-changes Metadata: This PR involves API contract changes label Jun 9, 2025
@likhinbopanna likhinbopanna enabled auto-merge June 9, 2025 07:19
@likhinbopanna likhinbopanna added this pull request to the merge queue Jun 9, 2025
Merged via the queue into main with commit 4c73d74 Jun 9, 2025
15 of 20 checks passed
@likhinbopanna likhinbopanna deleted the 9680-featfeature-tokenio-add-payment-flows-pr branch June 9, 2025 08:50
pixincreate added a commit that referenced this pull request Jun 9, 2025
…nktransfer

* 'main' of github.com:juspay/hyperswitch: (211 commits)
  feat(tokenio): Add OpenBanking Redirection Flow (#8152)
  fix: Unified scarf setup (#8238)
  feat(health): Health check for Decision engine (#8243)
  chore: Update apple pay currency filter configs (#8217)
  refactor(customers_v2): Remove merchant reference id from v2 customer update (#7879)
  chore(version): 2025.06.09.0
  chore(postman): update Postman collection files
  ci(postman): add tunnel collection to postman tests (#8269)
  feat(connector): Added recurring payments support for split payments in Stripe (#8271)
  feat(connector): [STRIPE] Added Connector Tokenization Flow for Cards (#8248)
  refactor(core): introduce new field in payment_intent to handle longer return_url (#8135)
  fix(connector): [AUTHORIZEDOTNET] Remove country PM filters (#8278)
  refactor(config): redact config urls for hyperswitch vault (#8276)
  feat(vsaas): enable onboarding of Standard Merchant Accounts in Platform Organization (#8231)
  feat(router): add three_ds decision rule execute api (#8148)
  feat(router): Save payment method on payments confirm (V2) (#8090)
  ci(cypress): Add Airwallex Connector Test (#8187)
  feat(payment_methods): add `external_vault_details` for payments v2 sdk session call (#8003)
  fix(connector): [facilitapay] cpf is a required field (#8274)
  fix: Fixed spell check (#8227)
  ...
pixincreate added a commit that referenced this pull request Jun 10, 2025
…ordea-sepa

* 'main' of github.com:juspay/hyperswitch: (63 commits)
  feat(connector): [TRUSTPAY] Added Integrity Checks for PSync & RSync flows & Added New Variants in AttemptStatus & IntentStatus (#8096)
  fix(connector): [STRIPE] Throwing Missing Required Field Error if connector_customer is not present (#8309)
  refactor(connectors): [worldpayvantiv] replace sandbox url with pre-live url and fix typo (#8286)
  fix: payment link styling for dynamic classes (#8273)
  feat(core): Make installment_payment_enabled,recurring_enabled Optional (#8201)
  fix(cypress): fix itaubank, datatrans and facilitapay (#8229)
  fix(connector): [jpmorgan] 5xx during payment authorize and `cancellation_reason` (#8282)
  revert(connector): [Worldpay] add root CA certificate (#8224)
  ci(cypress): fix fiuu, fiservemea , paybox and worldpay connector (#8209)
  fix(connector): removed forked josekit dependency from payout connector Nomupay (#8183)
  chore(version): 2025.06.10.0
  feat(tokenio): Add OpenBanking Redirection Flow (#8152)
  fix: Unified scarf setup (#8238)
  feat(health): Health check for Decision engine (#8243)
  chore: Update apple pay currency filter configs (#8217)
  refactor(customers_v2): Remove merchant reference id from v2 customer update (#7879)
  chore(version): 2025.06.09.0
  chore(postman): update Postman collection files
  ci(postman): add tunnel collection to postman tests (#8269)
  feat(connector): Added recurring payments support for split payments in Stripe (#8271)
  ...
pixincreate added a commit that referenced this pull request Jun 10, 2025
…ordea-sepa

* 'main' of github.com:juspay/hyperswitch: (63 commits)
  feat(connector): [TRUSTPAY] Added Integrity Checks for PSync & RSync flows & Added New Variants in AttemptStatus & IntentStatus (#8096)
  fix(connector): [STRIPE] Throwing Missing Required Field Error if connector_customer is not present (#8309)
  refactor(connectors): [worldpayvantiv] replace sandbox url with pre-live url and fix typo (#8286)
  fix: payment link styling for dynamic classes (#8273)
  feat(core): Make installment_payment_enabled,recurring_enabled Optional (#8201)
  fix(cypress): fix itaubank, datatrans and facilitapay (#8229)
  fix(connector): [jpmorgan] 5xx during payment authorize and `cancellation_reason` (#8282)
  revert(connector): [Worldpay] add root CA certificate (#8224)
  ci(cypress): fix fiuu, fiservemea , paybox and worldpay connector (#8209)
  fix(connector): removed forked josekit dependency from payout connector Nomupay (#8183)
  chore(version): 2025.06.10.0
  feat(tokenio): Add OpenBanking Redirection Flow (#8152)
  fix: Unified scarf setup (#8238)
  feat(health): Health check for Decision engine (#8243)
  chore: Update apple pay currency filter configs (#8217)
  refactor(customers_v2): Remove merchant reference id from v2 customer update (#7879)
  chore(version): 2025.06.09.0
  chore(postman): update Postman collection files
  ci(postman): add tunnel collection to postman tests (#8269)
  feat(connector): Added recurring payments support for split payments in Stripe (#8271)
  ...
bsayak03 pushed a commit that referenced this pull request Jun 11, 2025
Co-authored-by: hyperswitch-bot[bot] <148525504+hyperswitch-bot[bot]@users.noreply.github.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

M-api-contract-changes Metadata: This PR involves API contract changes

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants