hyperswitch

An open source payments switch written in Rust to make payments fast, reliable and affordable

APACHE-2.0 License

Stars
11.2K
Committers
179

Bot releases are hidden (Show)

hyperswitch - Hyperswitch v1.110.0 Latest Release

Published by ShankarSinghC 3 months ago

1.110.0 (2024-08-02)

Docker Release

v1.110.0 (with AWS SES support)

v1.110.0-standalone (without AWS SES support)

Features

  • connector:
    • [BRAINTREE] Implement Card Mandates (#5204)
    • [RazorPay] Add new connector and Implement payment flows for UPI payment method (#5200)
    • [Bambora APAC] Add payment flows (#5193)
    • [DATATRANS] Implement card payments (#5028)
    • Plaid connector Integration (#3952)
    • [Itau Bank] Add payment and sync flow for Pix (#5342)
    • [Itaubank] Add refund and rsync flow (#5420)
    • [HELCIM] Move connector to hyperswitch_connectors (#5287)
  • FRM Analytics (#4880)
  • Customer_details storage in payment_intent (#5007)
  • Added integrity framework for Authorize and Sync flow with connector as Stripe (#5109)
  • Add merchant order reference id (#5197)
  • Billing_details inclusion in Payment Intent (#5090)
  • Constraint Graph for Payment Methods List (#5081)
  • Add retrieve flow for payouts (#4936)
  • Payments core modification for open banking connectors (#3947)
  • Add support to register api keys to proxy (#5168)
  • Add hashed customer_email and feature_metadata (#5220)
  • Forward the tenant configuration as part of the kafka message (#5224)
  • Implement tag-based filters in global search (#5151)
  • Added search_tags based filter for global search in dashboard (#5341)
  • Added recipient connector call for open banking connectors (#3758)
  • Add multiple custom css support in business level (#5137)
  • Add support to migrate existing customer PMs from processor to hyperswitch (#5306)
  • Secure payout links using server side validations and client side headers (#5219)
  • Add country, currency filters for payout methods (#5130)
  • Added balance check for PM auth bank account (#5054)
  • Add support to pass proxy bypass urls from configs (#5322)
  • Add refunds manual-update api (#5094)
  • Pass fields to indicate if the customer address details to be connector from wallets (#5210)
  • Pass the shipping email whenever the billing details are included in the session token response (#5228)
  • Add integrity check for refund refund sync and capture flow with stripe as connector (#5187)
  • Add an api to migrate the payment method (#5186)
  • Add support for passing the domain dynamically in the session call (#5347)
  • Add support for https in actix web (#5089)
  • Add support for custom outgoing webhook http headers (#5275)
  • Create key in encryption service for merchant and user (#4910)
  • Encryption service integration to support batch encryption and decryption (#5164)
  • Add create retrieve and update api endpoints for organization resource (#5361)
  • Create additional columns in organization table (#5380)
  • Add env variable for enable key manager service (#5465)

Refactors/Bug Fixes

  • Add checks for duplicate auth_method in create API (#5161)
  • Fetch customer id from customer object during MIT (#5218)
  • [payouts] failure of payout retrieve when token is expired (#5362)
  • Modified_at updated for every state change for Payment Attempts (#5312)
  • Set requires_cvv to false when either connector_mandate_details or network_transaction_id is present during MITs (#5331)
  • Save the customer_id in payments create (#5262)
  • Add aliases on refund status for backwards compatibility (#5216)
  • Mark retry payment as failure if connector_tokenization fails (#5114)
  • Update last used when the customer acceptance is passed in the recurring payment (#5116)
  • override setup_future_usage filed to on_session based on merchant config (#5195)
  • Fail refund with bad request error for duplicate refund_id in refunds create flow (#5282)
  • Fixed integrity check failures in case of 3ds flow in sync flow (#5279)
  • Store customer_acceptance in payment_attempt, use it in confirm flow for delayed authorizations like external 3ds flow (#5308)
  • Store network_transaction_id in stripe authorize flow (#5399)
  • Do not update perform_session_flow_routing output if the SessionRoutingChoice is none (#5336)
  • Make id option in auth select (#5213)
  • Clear cookie and alter parsing for sso (#5147)
  • Add offset and limit to key transfer API (#5358)
  • [Mifinity] fix redirection after payment completion and handle 5xx error (#5250)
  • [Mifinity] add a field language_preference in payment request for mifinity payment method data (#5326)
  • [Itaubank] add dynamic fields for pix (#5419)
  • [boa/cybs] add billing address to MIT request (#5068)
  • Change primary key of refund table (#5367)
  • Change primary keys in user, user_roles and roles tables (#5374)
  • Change primary keys in payment_methods table (#5393)
  • Removal of lifetime from the Constraint Graph framework (#5132)
  • Update helper functions for deciding whether or not to consume flows based on current status (#5248)
  • Changed payment method token TTL to api contract based config from const value (#5115)
  • Remove the locker call in the psync flow (#5348)
  • Remove id dependency from merchant connector account, dispute and mandate (#5330)
  • Use hashmap deserializer for generic_link options (#5157)
  • Adding millisecond to Kafka timestamp (#5202)

Compatibility

This version of the Hyperswitch App server is compatible with the following versions of other components:

Database Migrations

---DB Difference between v1.109.0 AND v1.110.0
-- Your SQL goes here
ALTER TABLE merchant_connector_account ADD COLUMN IF NOT EXISTS additional_merchant_data BYTEA DEFAULT NULL;
-- Your SQL goes here
ALTER TABLE payment_intent ADD COLUMN IF NOT EXISTS customer_details BYTEA DEFAULT NULL;
-- Your SQL goes here

ALTER TABLE business_profile ADD COLUMN IF NOT EXISTS collect_billing_details_from_wallet_connector BOOLEAN DEFAULT FALSE;
-- Your SQL goes here
ALTER TABLE payment_intent ADD COLUMN IF NOT EXISTS billing_details BYTEA DEFAULT NULL;
-- Your SQL goes here
ALTER TABLE payment_intent ADD COLUMN IF NOT EXISTS merchant_order_reference_id VARCHAR(255) DEFAULT NULL;
-- Your SQL goes here
ALTER TABLE payment_intent ADD COLUMN IF NOT EXISTS shipping_details BYTEA DEFAULT NULL;
ALTER TABLE business_profile ADD COLUMN IF NOT EXISTS outgoing_webhook_custom_http_headers BYTEA DEFAULT NULL;
-- Your SQL goes here
ALTER TABLE payment_attempt ADD COLUMN IF NOT EXISTS customer_acceptance JSONB DEFAULT NULL;
-- Your SQL goes here
-- The below query will lock the merchant account table
-- Running this query is not necessary on higher environments
-- as the application will work fine without these queries being run
-- This query is necessary for the application to not use id in update of merchant_account
-- This query should be run after the new version of application is deployed
ALTER TABLE merchant_account DROP CONSTRAINT merchant_account_pkey;

-- Use the `merchant_id` column as primary key
-- This is already a unique, not null column
-- So this query should not fail for not null or duplicate values reasons
ALTER TABLE merchant_account
ADD PRIMARY KEY (merchant_id);
-- Your SQL goes here
-- The below query will lock the dispute table
-- Running this query is not necessary on higher environments
-- as the application will work fine without these queries being run
-- This query is necessary for the application to not use id in update of dispute
-- This query should be run only after the new version of application is deployed
ALTER TABLE dispute DROP CONSTRAINT dispute_pkey;

-- Use the `dispute_id` column as primary key
ALTER TABLE dispute
ADD PRIMARY KEY (dispute_id);
-- Your SQL goes here
-- The below query will lock the mandate table
-- Running this query is not necessary on higher environments
-- as the application will work fine without these queries being run
-- This query is necessary for the application to not use id in update of mandate
-- This query should be run only after the new version of application is deployed
ALTER TABLE mandate DROP CONSTRAINT mandate_pkey;

-- Use the `mandate_id` column as primary key
ALTER TABLE mandate
ADD PRIMARY KEY (mandate_id);
-- Your SQL goes here
-- The below query will lock the merchant connector account table
-- Running this query is not necessary on higher environments
-- as the application will work fine without these queries being run
-- This query should be run only after the new version of application is deployed
ALTER TABLE merchant_connector_account DROP CONSTRAINT merchant_connector_account_pkey;

-- Use the `merchant_connector_id` column as primary key
-- This is not a unique column, but in an ideal scenario there should not be any duplicate keys as this is being generated by the application
-- So this query should not fail for not null or duplicate values reasons
ALTER TABLE merchant_connector_account
ADD PRIMARY KEY (merchant_connector_id);
UPDATE generic_link
SET link_data = jsonb_set(link_data, '{allowed_domains}', '["*"]'::jsonb)
WHERE
    NOT link_data ? 'allowed_domains'
    AND link_type = 'payout_link';
-- Your SQL goes here
-- The below query will lock the blocklist table
-- Running this query is not necessary on higher environments
-- as the application will work fine without these queries being run
-- This query should be run after the new version of application is deployed
ALTER TABLE blocklist DROP CONSTRAINT blocklist_pkey;

-- Use the `merchant_id, fingerprint_id` columns as primary key
-- These are already unique, not null columns
-- So this query should not fail for not null or duplicate value reasons
ALTER TABLE blocklist
ADD PRIMARY KEY (merchant_id, fingerprint_id);
-- Your SQL goes here
ALTER TABLE organization
ADD COLUMN organization_details jsonb,
ADD COLUMN metadata jsonb,
ADD created_at TIMESTAMP NOT NULL DEFAULT now()::TIMESTAMP,
ADD modified_at TIMESTAMP NOT NULL DEFAULT now()::TIMESTAMP;
-- Your SQL goes here
-- The below query will lock the refund table
-- Running this query is not necessary on higher environments
-- as the application will work fine without these queries being run
-- This query should be run after the new version of application is deployed
ALTER TABLE refund DROP CONSTRAINT refund_pkey;

-- Use the `merchant_id, refund_id` columns as primary key
-- These are already unique, not null columns
-- So this query should not fail for not null or duplicate value reasons
ALTER TABLE refund
ADD PRIMARY KEY (merchant_id, refund_id);
-- Your SQL goes here
-- The below query will lock the users table
-- Running this query is not necessary on higher environments
-- as the application will work fine without these queries being run
-- This query should be run after the new version of application is deployed
ALTER TABLE users DROP CONSTRAINT users_pkey;

-- Use the `user_id` columns as primary key
-- These are already unique, not null column
-- So this query should not fail for not null or duplicate value reasons
ALTER TABLE users
ADD PRIMARY KEY (user_id);
-- Your SQL goes here
-- The below query will lock the user_roles table
-- Running this query is not necessary on higher environments
-- as the application will work fine without these queries being run
-- This query should be run after the new version of application is deployed
ALTER TABLE user_roles DROP CONSTRAINT user_roles_pkey;

-- Use the `user_id, merchant_id` columns as primary key
-- These are already unique, not null columns
-- So this query should not fail for not null or duplicate value reasons
ALTER TABLE user_roles
ADD PRIMARY KEY (user_id, merchant_id);
-- Your SQL goes here
-- The below query will lock the user_roles table
-- Running this query is not necessary on higher environments
-- as the application will work fine without these queries being run
-- This query should be run after the new version of application is deployed
ALTER TABLE roles DROP CONSTRAINT roles_pkey;

-- Use the `role_id` column as primary key
-- These are already unique, not null column
-- So this query should not fail for not null or duplicate value reasons
ALTER TABLE roles
ADD PRIMARY KEY (role_id);
-- Your SQL goes here
-- The below query will lock the payment_methods table
-- Running this query is not necessary on higher environments
-- as the application will work fine without these queries being run
-- This query should be run after the new version of application is deployed
ALTER TABLE payment_methods DROP CONSTRAINT payment_methods_pkey;

-- Use the `payment_method_id` column as primary key
-- This is already unique, not null column
-- So this query should not fail for not null or duplicate value reasons
ALTER TABLE payment_methods
ADD PRIMARY KEY (payment_method_id);
-- Your SQL goes here
-- The below query will lock the user_roles table
-- Running this query is not necessary on higher environments
-- as the application will work fine without these queries being run
-- This query should be run after the new version of application is deployed
ALTER TABLE user_roles DROP CONSTRAINT user_roles_pkey;
-- Use the `id` column as primary key
-- This is serial and a not null column
-- So this query should not fail for not null or duplicate value reasons
ALTER TABLE user_roles ADD PRIMARY KEY (id);

ALTER TABLE user_roles ALTER COLUMN org_id DROP NOT NULL;
ALTER TABLE user_roles ALTER COLUMN merchant_id DROP NOT NULL;

ALTER TABLE user_roles ADD COLUMN profile_id VARCHAR(64);
ALTER TABLE user_roles ADD COLUMN entity_id VARCHAR(64);
ALTER TABLE user_roles ADD COLUMN entity_type VARCHAR(64);

CREATE TYPE "UserRoleVersion" AS ENUM('v1', 'v2');
ALTER TABLE user_roles ADD COLUMN version "UserRoleVersion" DEFAULT 'v1' NOT NULL;

Configuration Changes

Diff of configuration changes between v1.109.0 and v1.110.0

diff --git a/config/deployments/sandbox.toml b/config/deployments/sandbox.toml
index 040986f79..5fb7bfe0d 100644
--- a/config/deployments/sandbox.toml
+++ b/config/deployments/sandbox.toml
@@ -30,6 +30,7 @@ airwallex.base_url = "https://api-demo.airwallex.com/"
 applepay.base_url = "https://apple-pay-gateway.apple.com/"
 authorizedotnet.base_url = "https://apitest.authorize.net/xml/v1/request.api"
 bambora.base_url = "https://api.na.bambora.com"
+bamboraapac.base_url = "https://demo.ippayments.com.au/interface/api/dts.asmx"
 bankofamerica.base_url = "https://apitest.merchant-services.bankofamerica.com/"
 billwerk.base_url = "https://api.reepay.com/"
 billwerk.secondary_base_url = "https://card.reepay.com/"
@@ -56,6 +57,7 @@ gocardless.base_url = "https://api-sandbox.gocardless.com"
 gpayments.base_url = "https://{{merchant_endpoint_prefix}}-test.api.as1.gpayments.net"
 helcim.base_url = "https://api.helcim.com/"
 iatapay.base_url = "https://sandbox.iata-pay.iata.org/api/v1"
+itaubank.base_url = "https://sandbox.devportal.itau.com.br/"
 klarna.base_url = "https://api{{klarna_region}}.playground.klarna.com/"
 mifinity.base_url = "https://demo.mifinity.com/"
 mollie.base_url = "https://api.mollie.com/v2/"
@@ -74,9 +76,11 @@ payone.base_url = "https://payment.preprod.payone.com/"
 paypal.base_url = "https://api-m.sandbox.paypal.com/"
 payu.base_url = "https://secure.snd.payu.com/"
 placetopay.base_url = "https://test.placetopay.com/rest/gateway"
+plaid.base_url = "https://sandbox.plaid.com"
 powertranz.base_url = "https://staging.ptranz.com/api/"
 prophetpay.base_url = "https://ccm-thirdparty.cps.golf/"
 rapyd.base_url = "https://sandboxapi.rapyd.net"
+razorpay.base_url = "https://sandbox.juspay.in/"
 riskified.base_url = "https://sandbox.riskified.com/api"
 shift4.base_url = "https://api.shift4.com/"
 signifyd.base_url = "https://api.signifyd.com/"
@@ -89,6 +93,7 @@ trustpay.base_url = "https://test-tpgw.trustpay.eu/"
 trustpay.base_url_bank_redirects = "https://aapi.trustpay.eu/"
 tsys.base_url = "https://stagegw.transnox.com/"
 volt.base_url = "https://api.sandbox.volt.io/"
+wellsfargo.base_url = "https://apitest.cybersource.com/"
 wise.base_url = "https://api.sandbox.transferwise.tech/"
 worldline.base_url = "https://eu.sandbox.api-ingenico.com/"
 worldpay.base_url = "https://try.access.worldpay.com/"
@@ -131,11 +136,12 @@ base_url = "https://app.hyperswitch.io"
 enabled = true
 
 [mandates.supported_payment_methods]
-bank_debit.ach.connector_list = "gocardless"
+bank_debit.ach = { connector_list = "gocardless,adyen" }
 bank_debit.becs.connector_list = "gocardless"
+bank_debit.bacs = { connector_list = "adyen" }
-bank_debit.sepa.connector_list = "gocardless"
-card.credit.connector_list = "stripe,adyen,authorizedotnet,cybersource,globalpay,worldpay,multisafepay,nmi,nexinets,noon,bankofamerica"
-card.debit.connector_list = "stripe,adyen,authorizedotnet,cybersource,globalpay,worldpay,multisafepay,nmi,nexinets,noon,bankofamerica"
+bank_debit.sepa = { connector_list = "gocardless,adyen" }
+card.credit.connector_list = "stripe,adyen,authorizedotnet,cybersource,globalpay,worldpay,multisafepay,nmi,nexinets,noon,bankofamerica,braintree"
+card.debit.connector_list = "stripe,adyen,authorizedotnet,cybersource,globalpay,worldpay,multisafepay,nmi,nexinets,noon,bankofamerica,braintree"
 pay_later.klarna.connector_list = "adyen"
 wallet.apple_pay.connector_list = "stripe,adyen,cybersource,noon,bankofamerica"
 wallet.google_pay.connector_list = "stripe,adyen,cybersource,bankofamerica"
@@ -309,6 +315,12 @@ sofort = { country = "AT,BE,DE,IT,NL,ES", currency = "EUR" }
 [pm_filters.volt]
 open_banking_uk = { country = "DE,GB,AT,BE,CY,EE,ES,FI,FR,GR,HR,IE,IT,LT,LU,LV,MT,NL,PT,SI,SK,BG,CZ,DK,HU,NO,PL,RO,SE,AU,BR", currency = "EUR,GBP,DKK,NOK,PLN,SEK,AUD,BRL" }
 
+[pm_filters.razorpay]
+upi_collect = {country = "IN", currency = "INR"}
+
+[pm_filters.plaid]
+open_banking_pis = {currency = "EUR,GBP"}
+
 [pm_filters.worldpay]
 apple_pay.country = "AU,CN,HK,JP,MO,MY,NZ,SG,TW,AM,AT,AZ,BY,BE,BG,HR,CY,CZ,DK,EE,FO,FI,FR,GE,DE,GR,GL,GG,HU,IS,IE,IM,IT,KZ,JE,LV,LI,LT,LU,MT,MD,MC,ME,NL,NO,PL,PT,RO,SM,RS,SK,SI,ES,SE,CH,UA,GB,AR,CO,CR,BR,MX,PE,BH,IL,JO,KW,PS,QA,SA,AE,CA,UM,US"
 google_pay.country = "AL,DZ,AS,AO,AG,AR,AU,AT,AZ,BH,BY,BE,BR,BG,CA,CL,CO,HR,CZ,DK,DO,EG,EE,FI,FR,DE,GR,HK,HU,IN,ID,IE,IL,IT,JP,JO,KZ,KE,KW,LV,LB,LT,LU,MY,MX,NL,NZ,NO,OM,PK,PA,PE,PH,PL,PT,QA,RO,RU,SA,SG,SK,ZA,ES,LK,SE,CH,TW,TH,TR,UA,AE,GB,US,UY,VN"
@@ -326,6 +338,12 @@ red_pagos = { country = "UY", currency = "UYU" }
 [pm_filters.zsl]
 local_bank_transfer = { country = "CN", currency = "CNY" }
 
+[payout_method_filters.adyenplatform]
+sepa = { country = "ES,SK,AT,NL,DE,BE,FR,FI,PT,IE,EE,LT,LV,IT,CZ,DE,HU,NO,PL,SE,GB,CH" , currency = "EUR,CZK,DKK,HUF,NOK,PLN,SEK,GBP,CHF" }
+
+[payout_method_filters.stripe]
+ach = { country = "US", currency = "USD" }
+
 [temp_locker_enable_config]
 bluesnap.payment_method = "card"
 nuvei.payment_method = "card"
@@ -359,3 +377,6 @@ keys = "user-agent"
 
 [saved_payment_methods]
 sdk_eligible_payment_methods = "card"
+
+[locker_based_open_banking_connectors]
+connector_list = ""

diff --git a/config/deployments/env_specific.toml b/config/deployments/env_specific.toml
index 68df3d28e..a7bd116a3 100644
--- a/config/deployments/env_specific.toml
+++ b/config/deployments/env_specific.toml
@@ -82,6 +82,7 @@ audit_events_topic = "topic"               # Kafka topic to be used for Payment
 payout_analytics_topic = "topic"         # Kafka topic to be used for Payouts and PayoutAttempt events
 consolidated_events_topic = "topic"      # Kafka topic to be used for Consolidated events
 authentication_analytics_topic = "topic" # Kafka topic to be used for Authentication events
+fraud_check_analytics_topic = "topic"    # Kafka topic to be used for Fraud Check events
 
 # File storage configuration
 [file_storage]
@@ -165,9 +166,9 @@ theme = "#4285F4"
 logo = "https://app.hyperswitch.io/HyperswitchFavicon.png"
 merchant_name = "HyperSwitch"
 [generic_link.payment_method_collect.enabled_payment_methods]
-card = ["credit", "debit"]
-bank_transfer = ["ach", "bacs", "sepa"]
-wallet = ["paypal", "pix", "venmo"]
+card = "credit,debit"
+bank_transfer = "ach,bacs,sepa"
+wallet = "paypal,pix,venmo"
 
 [generic_link.payout_link]
 sdk_url = "http://localhost:9090/0.16.7/v0/HyperLoader.js"
@@ -177,9 +178,7 @@ theme = "#4285F4"
 logo = "https://app.hyperswitch.io/HyperswitchFavicon.png"
 merchant_name = "HyperSwitch"
 [generic_link.payout_link.enabled_payment_methods]
-card = ["credit", "debit"]
-bank_transfer = ["ach", "bacs", "sepa"]
-wallet = ["paypal", "pix", "venmo"]
+card = "credit,debit"
 
 [payment_link]
 sdk_url = "http://localhost:9090/0.16.7/v0/HyperLoader.js"
@@ -191,6 +190,7 @@ redis_expiry = 900          # Redis expiry time in milliseconds
 [proxy]
 http_url = "http://proxy_http_url"    # Outgoing proxy http URL to proxy the HTTP traffic
 https_url = "https://proxy_https_url" # Outgoing proxy https URL to proxy the HTTPS traffic
+bypass_proxy_urls = []                # A list of URLs that should bypass the proxy
 
 # Redis credentials
 [redis]
@@ -247,6 +247,10 @@ payment_intents = "hyperswitch-payment-intent-events"
 refunds = "hyperswitch-refund-events"
 disputes = "hyperswitch-dispute-events"
 
+# Configuration for the Key Manager Service
+[key_manager]
+url = "http://localhost:5000" # URL of the encryption service
+
 # This section provides some secret values.
 [secrets]
 master_enc_key = "sample_key"            # Master Encryption key used to encrypt merchant wise encryption key. Should be 32-byte long.
@@ -265,6 +269,14 @@ shutdown_timeout = 30
 # HTTP Request body limit. Defaults to 32kB
 request_body_limit = 32_768
 
+# HTTPS Server Configuration
+# Self-signed Private Key and Certificate can be generated with mkcert for local development
+[server.tls]
+port = 8081
+host = "127.0.0.1"
+private_key = "/path/to/private_key.pem"
+certificate = "/path/to/certificate.pem"
+
 [secrets_management]
 secrets_manager = "aws_kms" # Secrets manager client to be used
 
@@ -281,10 +293,10 @@ region = "kms_region" # The AWS region used by the KMS SDK for decrypting data.
 
 [multitenancy]
 enabled = false
-global_tenant = { schema = "public", redis_key_prefix = "" }
+global_tenant = { schema = "public", redis_key_prefix = "", clickhouse_database = "default"}
 
 [multitenancy.tenants]
-public = { name = "hyperswitch", base_url = "http://localhost:8080", schema = "public", redis_key_prefix = "", clickhouse_database = "default"}
+public = { name = "hyperswitch", base_url = "http://localhost:8080", schema = "public", redis_key_prefix = "", clickhouse_database = "default" }
 
 [user_auth_methods]
 encryption_key = "user_auth_table_encryption_key" # Encryption key used for encrypting data in user_authentication_methods table

Full Changelog: v1.109.0...v1.110.0

hyperswitch - Hyperswitch v1.109.0

Published by ShankarSinghC 3 months ago

1.109.0 (2024-07-05)

Docker Release

v1.109.0 (with AWS SES support)

v1.109.0-standalone (without AWS SES support)

Features

  • connector:
    • [Stripe] - Stripe connect integration for payouts (#2041)
    • [Ebanx] Add payout flows (#4146)
    • [Paypal] Add payout flow for wallet(Paypal and Venmo) (#4406)
    • [Cybersource] Add payout flows for Card (#4511)
    • [AUTHORIZEDOTNET] Implement zero mandates (#4704)
    • [AUTHORIZEDOTNET] Implement non-zero mandates (#4758)
    • [Iatapay] add upi qr support (#4728)
    • [Cybersource] Add support for external authentication for cybersource (#4714)
    • [Klarna] Add support for Capture, Psync, Refunds and Rsync flows (#4799)
    • [Adyen] Add payouts integration for AdyenPlatform (#4874)
    • [MIFINITY] Implement payment flows and Mifinity payment method (#4592)
    • [BOA/CYB] Make state,zip optional for Non US CA Txns (#4915)
    • [Multisafepay] Add support for Ideal and Giropay (#4398)
    • [GPayments] Implement auth and post auth flows for gpayments (#4746)
    • [Iatapay] add payment methods (#4968)
    • [Payone] add payone connector (#4553)
    • [Paypal] Add session_token flow for Paypal sdk (#4697)
  • Add access_token flow for Payout Create and Fulfill flow (#4375)
  • Add an api to encrypt and migrate the apple pay certificates from connector metadata to connector_wallets_details column in merchant connector account (#4790)
  • Add profile level config to toggle extended card bin (#4445)
  • Add support for connectors having separate version call for pre authentication (#4603)
  • Create Payout Webhook Flow (#4696)
  • Add support for multitenancy and handle the same in router, producer, consumer, drainer and analytics (#4630)
  • Pass required_billing_contact_fields field in /session call based on dynamic fields (#4601)
  • Pass required shipping details field for wallets session call based on business_profile config (#4616)
  • Enable auto-retries for apple pay (#4721)
  • Use Ephemeral auth for pm list and pm delete (#4996)
  • Implement Process tracker workflow for Payment method Status update (#4668)
  • Add an api to enable connector_agnostic_mit feature (#4480)
  • Add support for googlepay step up flow (#2744)
  • Add payments manual-update api (#5045)
  • Add frm webhook support (#4662)
  • Add an api for toggle KV for all merchants (#4600)
  • Realtime user analytics (#5098)
  • Create API to Verify TOTP (#4597)
  • New routes to accept invite and list merchants (#4591)
  • Add support to verify 2FA using recovery code (#4737)
  • Implement force set and force change password (#4564)
  • Implemented openidconnect (#5124)
  • Add support for gauge metrics and include IMC metrics (#4939)
  • Add metadata info to events (#4875)
  • Add audit events payment confirm (#4763)
  • Add audit events payment capture (#4913)

Refactors/Bug Fixes

  • Add web client and control center services to docker compose setup (#4197)
  • Fix stack overflow for docker images (#4660)
  • Fix docker compose syntax (#4782)
  • Add max_amount validation in payment flows (#4645)
  • Make the constraint graph framework generic and move it into a separate crate (#3071)
  • Add visualization functionality to the constraint graph (#4701)
  • Rename crate data_models to hyperswitch_domain_models (#4504)
  • Move RouterData to crate hyperswitch_domain_models (#4524)
  • Move router data response and request models to hyperswitch domain models crate (#4789)
  • Move router data flow types to hyperswitch domain models crate (#4801)
  • Extract incoming and outgoing webhooks into separate modules (#4870)
  • Move trait ConnectorIntegration to crate hyperswitch_interfaces (#4946)
  • Introduce an interface to switch between old and new connector integration implementations on the connectors (#5013)
  • Add a new endpoint for Complete Authorize flow (#4686)
  • Refactor frm configs (#4581)
  • Rename Card struct for payouts to avoid overrides in auto generated open API spec (#4861)
  • Store payment_method_data_billing for recurring payments (#4513)
  • Refactor conditional_configs to use Moka Cache instead of Static Cache (#4814)
  • [Adyen] send browser_info for all the card and googlepay payments (#5173)
  • [Stripe] Pass optional browser_info to stripe for increased trust (#4374)
  • [NMI] Change fields for external auth due to API contract changes (#4531)
  • [Klarna] Refactor Authorize call and configs for prod (#4750)
  • [Adyen] handle redirection error response (#4862)
  • [Stripe] Changed amount to minor Unit for stripe (#4786)
  • Make save_payment_method as post_update_tracker trait function (#4307)
  • Add support to enable pm_data and pm_id in payments response (#4711)
  • Refactor the Knowledge Graph to include configs check, while eligibility analysis (#4687)
  • Move openapi to a separate folder (#4859)
  • Store card_network in locker (#4425)
  • Enable deletion of default Payment Methods (#4942)
  • Changed payment method token TTL to api contract based config from const value (#5209)
  • Deprecate Signin, Verify email and Invite v1 APIs (#4465)
  • Add password validations (#4555)

Compatibility

This version of the Hyperswitch App server is compatible with the following versions of other components:

Database Migrations

-- DB Difference BETWEEN v1.108.0 AND v1.109.0
ALTER TABLE payouts ADD COLUMN IF NOT EXISTS confirm bool;
ALTER TYPE "PayoutStatus" ADD VALUE IF NOT EXISTS 'requires_vendor_account_creation';
CREATE TYPE "GenericLinkType" as ENUM(
    'payment_method_collect',
    'payout_link'
);

CREATE TABLE generic_link (
    link_id VARCHAR (64) NOT NULL PRIMARY KEY,
    primary_reference VARCHAR (64) NOT NULL,
    merchant_id VARCHAR (64) NOT NULL,
    created_at timestamp NOT NULL DEFAULT NOW():: timestamp,
    last_modified_at timestamp NOT NULL DEFAULT NOW():: timestamp,
    expiry timestamp NOT NULL,
    link_data JSONB NOT NULL,
    link_status JSONB NOT NULL,
    link_type "GenericLinkType" NOT NULL,
    url TEXT NOT NULL,
    return_url TEXT NULL
);
ALTER TABLE merchant_account ADD COLUMN IF NOT EXISTS pm_collect_link_config JSONB NULL;

ALTER TABLE business_profile ADD COLUMN IF NOT EXISTS payout_link_config JSONB NULL;
-- Your SQL goes here

ALTER TABLE business_profile ADD COLUMN IF NOT EXISTS is_extended_card_info_enabled BOOLEAN DEFAULT FALSE;
-- Your SQL goes here

ALTER TABLE business_profile ADD COLUMN IF NOT EXISTS extended_card_info_config JSONB DEFAULT NULL;
ALTER TABLE fraud_check ADD COLUMN IF NOT EXISTS payment_capture_method "CaptureMethod" NULL;
-- Your SQL goes here

ALTER TABLE business_profile ADD COLUMN IF NOT EXISTS is_connector_agnostic_mit_enabled BOOLEAN DEFAULT FALSE;
-- Your SQL goes here
ALTER TABLE authentication ALTER COLUMN error_message TYPE TEXT;
-- Your SQL goes here
ALTER TABLE payment_methods ADD COLUMN IF NOT EXISTS payment_method_billing_address BYTEA;
-- Your SQL goes here
ALTER TABLE business_profile ADD COLUMN IF NOT EXISTS use_billing_as_payment_method_billing BOOLEAN DEFAULT TRUE;
-- Your SQL goes here
CREATE TABLE IF NOT EXISTS user_key_store (
    user_id VARCHAR(64) PRIMARY KEY,
    key bytea NOT NULL,
    created_at TIMESTAMP NOT NULL DEFAULT now()
);
ALTER TABLE payment_intent ADD COLUMN IF NOT EXISTS charges jsonb;

ALTER TABLE payment_attempt ADD COLUMN IF NOT EXISTS charge_id VARCHAR(64);

ALTER TABLE refund ADD COLUMN IF NOT EXISTS charges jsonb;
-- Your SQL goes here
CREATE TYPE "TotpStatus" AS ENUM (
  'set',
  'in_progress',
  'not_set'
);

ALTER TABLE users ADD COLUMN IF NOT EXISTS totp_status "TotpStatus" DEFAULT 'not_set' NOT NULL;
ALTER TABLE users ADD COLUMN IF NOT EXISTS totp_secret bytea DEFAULT NULL;
ALTER TABLE users ADD COLUMN IF NOT EXISTS totp_recovery_codes TEXT[] DEFAULT NULL;
-- Your SQL goes here
ALTER TABLE users ADD COLUMN IF NOT EXISTS last_password_modified_at TIMESTAMP;
-- Your SQL goes here
ALTER TABLE authentication DROP COLUMN three_dsserver_trans_id;
-- Your SQL goes here

ALTER TABLE business_profile ADD COLUMN IF NOT EXISTS collect_shipping_details_from_wallet_connector BOOLEAN DEFAULT FALSE;
-- Your SQL goes here
ALTER TABLE payment_intent ADD COLUMN IF NOT EXISTS frm_metadata JSONB DEFAULT NULL;
-- Your SQL goes here
ALTER TABLE payment_methods ADD COLUMN IF NOT EXISTS updated_by VARCHAR(64);

ALTER TABLE mandate ADD COLUMN IF NOT EXISTS updated_by VARCHAR(64);

ALTER TABLE customers ADD COLUMN IF NOT EXISTS updated_by VARCHAR(64);
-- Your SQL goes here
ALTER TABLE payment_attempt ADD COLUMN IF NOT EXISTS client_source VARCHAR(64) DEFAULT NULL;
ALTER TABLE payment_attempt ADD COLUMN IF NOT EXISTS client_version VARCHAR(64) DEFAULT NULL;
-- Your SQL goes here
ALTER TABLE payout_attempt ALTER COLUMN connector_payout_id DROP NOT NULL;

UPDATE payout_attempt SET connector_payout_id = NULL WHERE connector_payout_id = '';
-- Your SQL goes here
ALTER TYPE "EventType" ADD VALUE IF NOT EXISTS 'payout_success';
ALTER TYPE "EventType" ADD VALUE IF NOT EXISTS 'payout_failed';
ALTER TYPE "EventType" ADD VALUE IF NOT EXISTS 'payout_processing';
ALTER TYPE "EventType" ADD VALUE IF NOT EXISTS 'payout_cancelled';
ALTER TYPE "EventType" ADD VALUE IF NOT EXISTS 'payout_initiated';
ALTER TYPE "EventType" ADD VALUE IF NOT EXISTS 'payout_expired';
ALTER TYPE "EventType" ADD VALUE IF NOT EXISTS 'payout_reversed';

ALTER TYPE "EventObjectType" ADD VALUE IF NOT EXISTS 'payout_details';

ALTER TYPE "EventClass" ADD VALUE IF NOT EXISTS 'payouts';
-- Your SQL goes here
ALTER TABLE authentication ADD COLUMN IF NOT EXISTS ds_trans_id VARCHAR(64);
-- Your SQL goes here
ALTER TABLE authentication ADD COLUMN IF NOT EXISTS directory_server_id VARCHAR(128);
ALTER TYPE "Currency" ADD VALUE IF NOT EXISTS 'AOA';
ALTER TYPE "Currency" ADD VALUE IF NOT EXISTS 'BAM';
ALTER TYPE "Currency" ADD VALUE IF NOT EXISTS 'BGN';
ALTER TYPE "Currency" ADD VALUE IF NOT EXISTS 'BYN';
ALTER TYPE "Currency" ADD VALUE IF NOT EXISTS 'CVE';
ALTER TYPE "Currency" ADD VALUE IF NOT EXISTS 'FKP';
ALTER TYPE "Currency" ADD VALUE IF NOT EXISTS 'GEL';
ALTER TYPE "Currency" ADD VALUE IF NOT EXISTS 'IQD';
ALTER TYPE "Currency" ADD VALUE IF NOT EXISTS 'LYD';
ALTER TYPE "Currency" ADD VALUE IF NOT EXISTS 'MRU';
ALTER TYPE "Currency" ADD VALUE IF NOT EXISTS 'MZN';
ALTER TYPE "Currency" ADD VALUE IF NOT EXISTS 'PAB';
ALTER TYPE "Currency" ADD VALUE IF NOT EXISTS 'RSD';
ALTER TYPE "Currency" ADD VALUE IF NOT EXISTS 'SBD';
ALTER TYPE "Currency" ADD VALUE IF NOT EXISTS 'SHP';
ALTER TYPE "Currency" ADD VALUE IF NOT EXISTS 'SLE';
ALTER TYPE "Currency" ADD VALUE IF NOT EXISTS 'SRD';
ALTER TYPE "Currency" ADD VALUE IF NOT EXISTS 'STN';
ALTER TYPE "Currency" ADD VALUE IF NOT EXISTS 'TND';
ALTER TYPE "Currency" ADD VALUE IF NOT EXISTS 'TOP';
ALTER TYPE "Currency" ADD VALUE IF NOT EXISTS 'UAH';
ALTER TYPE "Currency" ADD VALUE IF NOT EXISTS 'VES';
ALTER TYPE "Currency" ADD VALUE IF NOT EXISTS 'WST';
ALTER TYPE "Currency" ADD VALUE IF NOT EXISTS 'XCD';
ALTER TYPE "Currency" ADD VALUE IF NOT EXISTS 'ZMW';
-- Your SQL goes here
ALTER TYPE "PayoutStatus" ADD VALUE IF NOT EXISTS 'initiated';
ALTER TYPE "PayoutStatus" ADD VALUE IF NOT EXISTS 'expired';
ALTER TYPE "PayoutStatus" ADD VALUE IF NOT EXISTS 'reversed';
-- Your SQL goes here
ALTER TABLE merchant_connector_account ADD COLUMN IF NOT EXISTS connector_wallets_details BYTEA DEFAULT NULL;
-- Your SQL goes here
ALTER TABLE payouts ADD COLUMN IF NOT EXISTS payout_link_id VARCHAR(255);
-- Your SQL goes here
ALTER TABLE authentication ADD COLUMN IF NOT EXISTS acquirer_country_code VARCHAR(64);
-- First drop the primary key of payment_intent
ALTER TABLE payment_intent DROP CONSTRAINT payment_intent_pkey;

-- Create new primary key
ALTER TABLE payment_intent ADD PRIMARY KEY (payment_id, merchant_id);

-- Make the previous primary key as optional
ALTER TABLE payment_intent ALTER COLUMN id DROP NOT NULL;

-- Follow the same steps for payment attempt as well
ALTER TABLE payment_attempt DROP CONSTRAINT payment_attempt_pkey;

ALTER TABLE payment_attempt ADD PRIMARY KEY (attempt_id, merchant_id);

ALTER TABLE payment_attempt ALTER COLUMN id DROP NOT NULL;
-- Your SQL goes here
ALTER TABLE payouts ADD COLUMN IF NOT EXISTS client_secret VARCHAR(128) DEFAULT NULL;

ALTER TYPE "PayoutStatus" ADD VALUE IF NOT EXISTS 'requires_confirmation';
ALTER TABLE payouts ADD COLUMN IF NOT EXISTS priority VARCHAR(32);
CREATE INDEX connector_payout_id_merchant_id_index ON payout_attempt (connector_payout_id, merchant_id);
-- Your SQL goes here
ALTER TABLE users ALTER COLUMN password DROP NOT NULL;
-- Your SQL goes here
CREATE TABLE IF NOT EXISTS user_authentication_methods (
    id VARCHAR(64) PRIMARY KEY,
    auth_id VARCHAR(64) NOT NULL,
    owner_id VARCHAR(64) NOT NULL,
    owner_type VARCHAR(64) NOT NULL,
    auth_type VARCHAR(64) NOT NULL,
    private_config bytea,
    public_config JSONB,
    allow_signup BOOLEAN NOT NULL,
    created_at TIMESTAMP NOT NULL DEFAULT now(),
    last_modified_at TIMESTAMP NOT NULL DEFAULT now()
);

CREATE INDEX IF NOT EXISTS auth_id_index ON user_authentication_methods (auth_id);
CREATE INDEX IF NOT EXISTS owner_id_index ON user_authentication_methods (owner_id);
-- Your SQL goes here
ALTER TABLE payouts ALTER COLUMN payout_type DROP NOT NULL;
ALTER TABLE events ADD COLUMN metadata JSONB DEFAULT NULL;

Configuration Changes

Diff of configuration changes between v1.108.0 and v1.109.0

diff --git a/config/deployments/sandbox.toml b/config/deployments/sandbox.toml
index acec5bbadf06..db6b9354d066 100644
--- a/config/deployments/sandbox.toml
+++ b/config/deployments/sandbox.toml
@@ -3,6 +3,7 @@ eps.adyen.banks = "bank_austria,bawag_psk_ag,dolomitenbank,easybank_ag,erste_ban
 eps.stripe.banks = "arzte_und_apotheker_bank,austrian_anadi_bank_ag,bank_austria,bankhaus_carl_spangler,bankhaus_schelhammer_und_schattera_ag,bawag_psk_ag,bks_bank_ag,brull_kallmus_bank_ag,btv_vier_lander_bank,capital_bank_grawe_gruppe_ag,dolomitenbank,easybank_ag,erste_bank_und_sparkassen,hypo_alpeadriabank_international_ag,hypo_noe_lb_fur_niederosterreich_u_wien,hypo_oberosterreich_salzburg_steiermark,hypo_tirol_bank_ag,hypo_vorarlberg_bank_ag,hypo_bank_burgenland_aktiengesellschaft,marchfelder_bank,oberbank_ag,raiffeisen_bankengruppe_osterreich,schoellerbank_ag,sparda_bank_wien,volksbank_gruppe,volkskreditbank_ag,vr_bank_braunau"
 ideal.adyen.banks = "abn_amro,asn_bank,bunq,ing,knab,n26,nationale_nederlanden,rabobank,regiobank,revolut,sns_bank,triodos_bank,van_lanschot,yoursafe"
 ideal.stripe.banks = "abn_amro,asn_bank,bunq,handelsbanken,ing,knab,moneyou,rabobank,regiobank,revolut,sns_bank,triodos_bank,van_lanschot"
+ideal.multisafepay.banks = "abn_amro, asn_bank, bunq, handelsbanken, nationale_nederlanden, n26, ing, knab, rabobank, regiobank, revolut, sns_bank,triodos_bank, van_lanschot, yoursafe"
 online_banking_czech_republic.adyen.banks = "ceska_sporitelna,komercni_banka,platnosc_online_karta_platnicza"
 online_banking_fpx.adyen.banks = "affin_bank,agro_bank,alliance_bank,am_bank,bank_islam,bank_muamalat,bank_rakyat,bank_simpanan_nasional,cimb_bank,hong_leong_bank,hsbc_bank,kuwait_finance_house,maybank,ocbc_bank,public_bank,rhb_bank,standard_chartered_bank,uob_bank"
 online_banking_poland.adyen.banks = "blik_psp,place_zipko,m_bank,pay_with_ing,santander_przelew24,bank_pekaosa,bank_millennium,pay_with_alior_bank,banki_spoldzielcze,pay_with_inteligo,bnp_paribas_poland,bank_nowy_sa,credit_agricole,pay_with_bos,pay_with_citi_handlowy,pay_with_plus_bank,toyota_bank,velo_bank,e_transfer_pocztowy24"
@@ -13,12 +14,13 @@ przelewy24.stripe.banks = "alior_bank,bank_millennium,bank_nowy_bfg_sa,bank_peka
 
 [connector_customer]
 connector_list = "stax,stripe,gocardless"
-payout_connector_list = "wise"
+payout_connector_list = "stripe,wise"
 
 [connectors]
 aci.base_url = "https://eu-test.oppwa.com/"
 adyen.base_url = "https://checkout-test.adyen.com/"
 adyen.secondary_base_url = "https://pal-test.adyen.com/"
+adyenplatform.base_url = "https://balanceplatform-api-test.adyen.com/"
 airwallex.base_url = "https://api-demo.airwallex.com/"
 applepay.base_url = "https://apple-pay-gateway.apple.com/"
 authorizedotnet.base_url = "https://apitest.authorize.net/xml/v1/request.api"
@@ -37,6 +39,7 @@ checkout.base_url = "https://api.sandbox.checkout.com/"
 coinbase.base_url = "https://api.commerce.coinbase.com"
 cryptopay.base_url = "https://business-sandbox.cryptopay.me"
 cybersource.base_url = "https://apitest.cybersource.com/"
+datatrans.base_url = "https://api.sandbox.datatrans.com/"
 dlocal.base_url = "https://sandbox.dlocal.com/"
 dummyconnector.base_url = "http://localhost:8080/dummy-connector"
 ebanx.base_url = "https://sandbox.ebanxpay.com/"
@@ -45,9 +48,11 @@ forte.base_url = "https://sandbox.forte.net/api/v3"
 globalpay.base_url = "https://apis.sandbox.globalpay.com/ucp/"
 globepay.base_url = "https://pay.globepay.co/"
 gocardless.base_url = "https://api-sandbox.gocardless.com"
+gpayments.base_url = "https://{{merchant_endpoint_prefix}}-test.api.as1.gpayments.net"
 helcim.base_url = "https://api.helcim.com/"
 iatapay.base_url = "https://sandbox.iata-pay.iata.org/api/v1"
-klarna.base_url = "https://api-na.playground.klarna.com/"
+klarna.base_url = "https://api{{klarna_region}}.playground.klarna.com/"
+mifinity.base_url = "https://demo.mifinity.com/"
 mollie.base_url = "https://api.mollie.com/v2/"
 mollie.secondary_base_url = "https://api.cc.mollie.com/v1/"
 multisafepay.base_url = "https://testapi.multisafepay.com/"
@@ -60,6 +65,7 @@ opayo.base_url = "https://pi-test.sagepay.com/"
 opennode.base_url = "https://dev-api.opennode.com"
 payeezy.base_url = "https://api-cert.payeezy.com/"
 payme.base_url = "https://sandbox.payme.io/"
+payone.base_url = "https://payment.preprod.payone.com/"
 paypal.base_url = "https://api-m.sandbox.paypal.com/"
 payu.base_url = "https://secure.snd.payu.com/"
 placetopay.base_url = "https://test.placetopay.com/rest/gateway"
@@ -110,6 +116,12 @@ refund_tolerance = 100
 refund_ttl = 172800
 slack_invite_url = "https://join.slack.com/t/hyperswitch-io/shared_invite/zt-2awm23agh-p_G5xNpziv6yAiedTkkqLg"
 
+[user]
+password_validity_in_days = 90
+two_factor_auth_expiry_in_secs = 300
+totp_issuer_name = "Hyperswitch Sandbox"
+base_url = "https://app.hyperswitch.io"
+
 [frm]
 enabled = true
 
@@ -123,9 +135,9 @@ pay_later.klarna.connector_list = "adyen"
 wallet.apple_pay.connector_list = "stripe,adyen,cybersource,noon,bankofamerica"
 wallet.google_pay.connector_list = "stripe,adyen,cybersource,bankofamerica"
 wallet.paypal.connector_list = "adyen"
-bank_redirect.ideal.connector_list = "stripe,adyen,globalpay"
+bank_redirect.ideal.connector_list = "stripe,adyen,globalpay,multisafepay"
 bank_redirect.sofort.connector_list = "stripe,adyen,globalpay"
-bank_redirect.giropay.connector_list = "adyen,globalpay"
+bank_redirect.giropay.connector_list = "adyen,globalpay,multisafepay"
 
 [mandates.update_mandate_supported]
 card.credit = { connector_list = "cybersource" }
@@ -171,7 +183,7 @@ we_chat_pay = { country = "AU,NZ,CN,JP,HK,SG,ES,GB,SE,NO,AT,NL,DE,CY,CH,BE,FR,DK
 [pm_filters.adyen]
 ach = { country = "US", currency = "USD" }
 affirm = { country = "US", currency = "USD" }
-afterpay_clearpay = { country = "AU,NZ,ES,GB,FR,IT,CA,US", currency = "GBP" }
+afterpay_clearpay = { country = "US,CA,GB,AU,NZ", currency = "GBP,AUD,NZD,CAD,USD" }
 alfamart = { country = "ID", currency = "IDR" }
 ali_pay = { country = "AU,JP,HK,SG,MY,TH,ES,GB,SE,NO,AT,NL,DE,CY,CH,BE,FR,DK,FI,RO,MT,SI,GR,PT,IE,IT,CA,US", currency = "USD,EUR,GBP,JPY,AUD,SGD,CHF,SEK,NOK,NZD,THB,HKD,CAD" }
 ali_pay_hk = { country = "HK", currency = "HKD" }
@@ -242,6 +254,12 @@ debit = { currency = "USD" }
 apple_pay = { currency = "USD" }
 google_pay = { currency = "USD" }
 
+[pm_filters.cybersource]
+credit = { currency = "USD" }
+debit = { currency = "USD" }
+apple_pay = { currency = "USD" }
+google_pay = { currency = "USD" }
+
 [pm_filters.braintree]
 paypal.currency = "AUD,BRL,CAD,CNY,CZK,DKK,EUR,HKD,HUF,ILS,JPY,MYR,MXN,TWD,NZD,NOK,PHP,PLN,GBP,RUB,SGD,SEK,CHF,THB,USD"
 
@@ -260,9 +278,13 @@ we_chat_pay.currency = "GBP,CNY"
 [pm_filters.klarna]
 klarna = { country = "AU,AT,BE,CA,CZ,DK,FI,FR,DE,GR,IE,IT,NL,NZ,NO,PL,PT,ES,SE,CH,GB,US", currency = "CHF,DKK,EUR,GBP,NOK,PLN,SEK,USD,AUD,NZD,CAD" }
 
+[pm_filters.mifinity]
+mifinity = { country = "BR,CN,SG,MY,DE,CH,DK,GB,ES,AD,GI,FI,FR,GR,HR,IT,JP,MX,AR,CO,CL,PE,VE,UY,PY,BO,EC,GT,HN,SV,NI,CR,PA,DO,CU,PR,NL,NO,PL", currency = "AUD,CAD,CHF,CNY,CZK,DKK,EUR,GBP,INR,JPY,NOK,NZD,PLN,RUB,SEK,ZAR,USD" }
+
 [pm_filters.prophetpay]
 card_redirect.currency = "USD"
 
+
 [pm_filters.stax]
 ach = { country = "US", currency = "USD" }
 
@@ -327,3 +349,6 @@ connectors_with_webhook_source_verification_call = "paypal"
 
 [unmasked_headers]
 keys = "user-agent"
+
+[saved_payment_methods]
+sdk_eligible_payment_methods = "card"
diff --git a/config/deployments/env_specific.toml b/config/deployments/env_specific.toml
index c725a8bd69d3..68df3d28e243 100644
--- a/config/deployments/env_specific.toml
+++ b/config/deployments/env_specific.toml
@@ -58,7 +58,6 @@ wildcard_origin = false                 # If true, allows any origin to make req
 [email]
 sender_email = "[email protected]" # Sender email
 aws_region = ""                      # AWS region used by AWS SES
-base_url = ""                        # Dashboard base url used when adding links that should redirect to self, say https://app.hyperswitch.io for example
 allowed_unverified_days = 1          # Number of days the api calls ( with jwt token ) can be made without verifying the email
 active_email_client = "SES"          # The currently active email client
 
@@ -81,6 +80,8 @@ outgoing_webhook_logs_topic = "topic" # Kafka topic to be used for outgoing webh
 dispute_analytics_topic = "topic"          # Kafka topic to be used for Dispute events
 audit_events_topic = "topic"               # Kafka topic to be used for Payment Audit events
 payout_analytics_topic = "topic"           # Kafka topic to be used for Payouts and PayoutAttempt events
+consolidated_events_topic = "topic"        # Kafka topic to be used for Consolidated events
+authentication_analytics_topic = "topic"   # Kafka topic to be used for Authentication events
 
 # File storage configuration
 [file_storage]
@@ -115,6 +116,8 @@ mock_locker = true                                                    # Emulate
 locker_signing_key_id = "1"                                           # Key_id to sign basilisk hs locker
 locker_enabled = true                                                 # Boolean to enable or disable saving cards in locker
 redis_temp_locker_encryption_key = "redis_temp_locker_encryption_key" # Encryption key for redis temp locker
+ttl_for_storage_in_secs = 220752000                                   # Time to live for storage entries in locker
+
 
 [log.console]
 enabled = true
@@ -136,6 +139,7 @@ otel_exporter_otlp_endpoint = "http://localhost:4317" # endpoint to send metrics
 otel_exporter_otlp_timeout = 5000                     # timeout (in milliseconds) for sending metrics and traces
 use_xray_generator = false                            # Set this to true for AWS X-ray compatible traces
 route_to_trace = ["*/confirm"]
+bg_metrics_collection_interval_in_secs = 15           # Interval for collecting the metrics in background thread
 
 [lock_settings]
 delay_between_retries_in_milliseconds = 500 # Delay between retries in milliseconds
@@ -152,6 +156,31 @@ pool_size = 5             # Number of connections to keep open
 connection_timeout = 10   # Timeout for database connection in seconds
 queue_strategy = "Fifo"   # Add the queue strategy used by the database bb8 client
 
+[generic_link]
+[generic_link.payment_method_collect]
+sdk_url = "http://localhost:9090/0.16.7/v0/HyperLoader.js"
+expiry = 900
+[generic_link.payment_method_collect.ui_config]
+theme = "#4285F4"
+logo = "https://app.hyperswitch.io/HyperswitchFavicon.png"
+merchant_name = "HyperSwitch"
+[generic_link.payment_method_collect.enabled_payment_methods]
+card = ["credit", "debit"]
+bank_transfer = ["ach", "bacs", "sepa"]
+wallet = ["paypal", "pix", "venmo"]
+
+[generic_link.payout_link]
+sdk_url = "http://localhost:9090/0.16.7/v0/HyperLoader.js"
+expiry = 900
+[generic_link.payout_link.ui_config]
+theme = "#4285F4"
+logo = "https://app.hyperswitch.io/HyperswitchFavicon.png"
+merchant_name = "HyperSwitch"
+[generic_link.payout_link.enabled_payment_methods]
+card = ["credit", "debit"]
+bank_transfer = ["ach", "bacs", "sepa"]
+wallet = ["paypal", "pix", "venmo"]
+
 [payment_link]
 sdk_url = "http://localhost:9090/0.16.7/v0/HyperLoader.js"
 
@@ -227,7 +256,6 @@ recon_admin_api_key = "recon_test_admin" # recon_admin API key for recon authent
 
 # Server configuration
 [server]
-base_url = "https://server_base_url"
 workers = 8
 port = 8080
 host = "127.0.0.1"
@@ -250,3 +278,13 @@ encryption_manager = "aws_kms" # Encryption manager client to be used
 [encryption_management.aws_kms]
 key_id = "kms_key_id" # The AWS key ID used by the KMS SDK for decrypting data.
 region = "kms_region" # The AWS region used by the KMS SDK for decrypting data.
+
+[multitenancy]
+enabled = false
+global_tenant = { schema = "public", redis_key_prefix = "" }
+
+[multitenancy.tenants]
+public = { name = "hyperswitch", base_url = "http://localhost:8080", schema = "public", redis_key_prefix = "", clickhouse_database = "default"}
+
+[user_auth_methods]
+encryption_key = "user_auth_table_encryption_key" # Encryption key used for encrypting data in user_authentication_methods table

Full Changelog: v1.108.0...v1.109.0

hyperswitch - Hyperswitch v1.108.0

Published by sai-harsha-vardhan 5 months ago

1.108.0 (2024-05-03)

Docker Release

v1.108.0 (with KMS)

v1.108.0-standalone (without KMS)

Features

  • connector:
    • [3dsecure.io] Add threedsecureio three_ds authentication connector (#4004)
    • [Checkout] add support for external authentication for checkout connector (#4006)
    • [AUTHORIZEDOTNET] Audit Connector (#4035)
    • [billwerk] implement payment and refund flows (#4245)
    • [Netcetera] Integrate netcetera connector with pre authentication flow (#4293)
    • [NMI] External 3DS flow for Cards (#4385)
    • [Netcetera] Implement authentication flow for netcetera (#4334)
    • [Netcetera] Add webhook support for netcetera (#4382)
    • [BOA] implement mandates for cards and wallets (#4232)
    • [Ebanx] Add payout flows (#4146)
    • [Paypal] Add payout flow for wallet(Paypal and Venmo) (#4406)
    • [BOA/Cybersource] add avs_response and cvv validation result in the response (#4376)
    • [Cybersource] Add NTID flow for cybersource (#4193)
  • Add api_models for external 3ds authentication flow (#3858)
  • Add core functions for external authentication (#3969)
  • Confirm flow and authorization api changes for external authentication (#4015)
  • Add incoming header request logs (#3939)
  • Add payments authentication api flow (#3996)
  • Add routing support for token-based mit payments (#4012)
  • Add local bank transfer payment method (#4294)
  • Add external authentication webhooks flow (#4339)
  • Add retrieve poll status api (#4358)
  • Handle authorization for frictionless flow in external 3ds flow (#4471)
  • Customer kv impl (#4267)
  • Add cypress test cases (#4271)
  • Add audit events scaffolding (#3863)
  • Add APIs to list webhook events and webhook delivery attempts (#4131)
  • Add events framework for registering events (#4115)
  • Add payment cancel events (#4166)
  • Dashboard globalsearch apis (#3831)
  • Add kv support for mandate (#4275)
  • Allow off-session payments using payment_method_id (#4132)
  • Added display_sdk_only option for displaying only sdk without payment details (#4363)
  • Add support for saved payment method option for payment link (#4373)
  • API to list countries and currencies supported by a country and payment method type (#4126)
  • Added kv support for payment_methods table (#4311)
  • Implement Single Connector Retry for Payouts (#3908)
  • Implement KVRouterStore (#3889)
  • Implement list and filter APIs (#3651)
  • Support different pm types in PM auth (#3114)
  • Add new API get the user and role details of specific user (#3988)
  • Implement automatic retries for failed webhook deliveries using scheduler (#3842)
  • Allow manually retrying delivery of outgoing webhooks (#4176)
  • Store payment check codes and authentication data from processors (#3958)
  • Stripe connect integration for payouts (#2041)
  • Add support for merchant to pass public key and ttl for encrypting payload (#4456)
  • Add an api for retrieving the extended card info from redis (#4484)

Refactors/Bug Fixes

  • Use fallback to connector_name if merchant_connector_id is not present (#4503)
  • Use first_name if last_name is not passed (#4360)
  • Generate payment_id if not sent (#4125)
  • Send valid sdk information in authentication flow netcetera (#4474)
  • Fix wallet token deserialization error (#4133)
  • Amount received should be zero for pending and failed status (#4331)
  • Amount capturable remain same for processing status in capture (#4229)
  • Fix 3DS mandates, for the connector _mandate_details to be stored in the payment_methods table (#4323)
  • Handle card duplication in payouts flow (#4013)
  • Give higher precedence to connector mandate id over network txn id in mandates (#4073)
  • Store network transaction id only when pg_agnostic config is enabled in the authorize_flow (#4318)
  • Insert locker_id as null in case of payment method not getting stored in locker (#3919)
  • Update payment method status only if existing status is not active (#4149)
  • Fix token fetch logic in complete authorize flow for three ds payments (#4052)
  • Handle redirection to return_url from nested iframe in separate 3ds flow (#4164)
  • Capture billing country in payments request (#4347)
  • Make payment_instrument optional (#4389)
  • Remove enabled payment methods for payouts processor (#3913)
  • Pass payment method billing to the connector module (#3828)
  • Use billing.first_name instead of card_holder_name (#4239)
  • Updated payments response with payment_method_id & payment_method_status (#3883)
  • Log the appropriate error message if the card fails to get saved in locker (#4296)
  • Make performance optimisation for payment_link (#4092)
  • Decouple shimmer css from main payment_link css for better performance (#4286)
  • Add a trait to retrieve billing from payment method data (#4095)
  • Filter applepay payment method from mca based on customer pm (#3953)
  • Enable country currency filter for cards (#4056)
  • Add network_transaction_id column in the payment_methods table (#4005)
  • Revamp payment methods update endpoint (#4305)
  • Store card_network in locker (#4425)
  • Deprecate Signin, Verify email and Invite v1 APIs (#4465)
  • Use single purpose token and auth to accept invite (#4498)
  • [Checkout] change payment and webhooks API contract (#4023)

Compatibility

This version of the Hyperswitch App server is compatible with the following versions of other components:

Database Migrations

-- Your SQL goes here
ALTER TABLE payment_attempt
ADD COLUMN IF NOT EXISTS external_three_ds_authentication_attempted BOOLEAN DEFAULT FALSE,
ADD COLUMN IF NOT EXISTS authentication_connector VARCHAR(64),
ADD COLUMN IF NOT EXISTS authentication_id VARCHAR(64);

-- Your SQL goes here
ALTER TABLE payment_intent
ADD COLUMN IF NOT EXISTS request_external_three_ds_authentication BOOLEAN;

-- Your SQL goes here
ALTER TYPE "ConnectorType"
ADD VALUE IF NOT EXISTS 'authentication_processor';

-- Your SQL goes here
ALTER TABLE authentication
ADD COLUMN IF NOT EXISTS connector_metadata JSONB DEFAULT NULL;

-- Your SQL goes here
ALTER TABLE payment_attempt
ADD COLUMN IF NOT EXISTS payment_method_billing_address_id VARCHAR(64);

-- Your SQL goes here
ALTER TYPE "PaymentSource"
ADD VALUE 'webhook';

ALTER TYPE "PaymentSource"
ADD VALUE 'external_authenticator';

ALTER TABLE PAYOUTS
ADD COLUMN profile_id VARCHAR(64);

UPDATE PAYOUTS AS PO
SET profile_id = POA.profile_id
FROM PAYOUT_ATTEMPT AS POA
WHERE PO.payout_id = POA.payout_id;

ALTER TABLE PAYOUTS
ALTER COLUMN profile_id
SET NOT NULL;

ALTER TABLE PAYOUTS
ADD COLUMN status "PayoutStatus";

UPDATE PAYOUTS AS PO
SET status = POA.status
FROM PAYOUT_ATTEMPT AS POA
WHERE PO.payout_id = POA.payout_id;

ALTER TABLE PAYOUTS
ALTER COLUMN status
SET NOT NULL;

-- Your SQL goes here
ALTER TABLE business_profile
ADD COLUMN IF NOT EXISTS authentication_connector_details JSONB NULL;

-- The following queries must be run before the newer version of the application is deployed.
ALTER TABLE events
ADD COLUMN merchant_id VARCHAR(64) DEFAULT NULL,
ADD COLUMN business_profile_id VARCHAR(64) DEFAULT NULL,
ADD COLUMN primary_object_created_at TIMESTAMP DEFAULT NULL,
ADD COLUMN idempotent_event_id VARCHAR(64) DEFAULT NULL,
ADD COLUMN initial_attempt_id VARCHAR(64) DEFAULT NULL,
ADD COLUMN request BYTEA DEFAULT NULL,
ADD COLUMN response BYTEA DEFAULT NULL;

UPDATE events
SET idempotent_event_id = event_id
WHERE idempotent_event_id IS NULL;

UPDATE events
SET initial_attempt_id = event_id
WHERE initial_attempt_id IS NULL;

ALTER TABLE events
ADD CONSTRAINT idempotent_event_id_unique UNIQUE (idempotent_event_id);

-- Your SQL goes here
ALTER TABLE payment_methods
ADD COLUMN network_transaction_id VARCHAR(255) DEFAULT NULL;

-- Your SQL goes here
ALTER TABLE authentication
ADD COLUMN IF NOT EXISTS maximum_supported_version JSONB,
ADD COLUMN IF NOT EXISTS threeds_server_transaction_id VARCHAR(64),
ADD COLUMN IF NOT EXISTS cavv VARCHAR(64),
ADD COLUMN IF NOT EXISTS authentication_flow_type VARCHAR(64),
ADD COLUMN IF NOT EXISTS message_version JSONB,
ADD COLUMN IF NOT EXISTS eci VARCHAR(64),
ADD COLUMN IF NOT EXISTS trans_status VARCHAR(64),
ADD COLUMN IF NOT EXISTS acquirer_bin VARCHAR(64),
ADD COLUMN IF NOT EXISTS acquirer_merchant_id VARCHAR(64),
ADD COLUMN IF NOT EXISTS three_ds_method_data VARCHAR,
ADD COLUMN IF NOT EXISTS three_ds_method_url VARCHAR,
ADD COLUMN IF NOT EXISTS acs_url VARCHAR,
ADD COLUMN IF NOT EXISTS challenge_request VARCHAR,
ADD COLUMN IF NOT EXISTS acs_reference_number VARCHAR,
ADD COLUMN IF NOT EXISTS acs_trans_id VARCHAR,
ADD COLUMN IF NOT EXISTS three_dsserver_trans_id VARCHAR,
ADD COLUMN IF NOT EXISTS acs_signed_content VARCHAR,
ADD COLUMN IF NOT EXISTS connector_metadata JSONB;

-- Your SQL goes here
ALTER TABLE payment_methods
ADD COLUMN IF NOT EXISTS client_secret VARCHAR(128) DEFAULT NULL;

ALTER TABLE payment_methods
ALTER COLUMN payment_method DROP NOT NULL;

CREATE UNIQUE INDEX events_merchant_id_event_id_index ON events (merchant_id, event_id);

CREATE INDEX events_merchant_id_initial_attempt_id_index ON events (merchant_id, initial_attempt_id);

CREATE INDEX events_merchant_id_initial_events_index ON events (merchant_id, (event_id = initial_attempt_id));

CREATE INDEX events_business_profile_id_initial_attempt_id_index ON events (business_profile_id, initial_attempt_id);

CREATE INDEX events_business_profile_id_initial_events_index ON events (
business_profile_id,
(event_id = initial_attempt_id)
);

CREATE TYPE "WebhookDeliveryAttempt" AS ENUM (
'initial_attempt',
'automatic_retry',
'manual_retry'
);

ALTER TABLE events
ADD COLUMN delivery_attempt "WebhookDeliveryAttempt" DEFAULT NULL;

-- Your SQL goes here
ALTER TABLE authentication
ADD COLUMN profile_id VARCHAR(64) NOT NULL;

-- Your SQL goes here
ALTER TABLE authentication
ADD COLUMN payment_id VARCHAR(255);

-- Your SQL goes here
ALTER TYPE "DashboardMetadata"
ADD VALUE IF NOT EXISTS 'onboarding_survey';

-- Your SQL goes here
ALTER TABLE authentication
ADD COLUMN merchant_connector_id VARCHAR(128) NOT NULL;

[!CAUTION]
Proceed with caution when running the following migrations as they are destructive.

ALTER TABLE events ADD PRIMARY KEY (event_id);

ALTER TABLE events DROP CONSTRAINT event_id_unique;

-- Dropping unused columns
ALTER TABLE events
DROP COLUMN id,
DROP COLUMN intent_reference_id;

Configuration Changes

Diff of configuration changes between v1.107.0 and v1.108.0

diff --git a/config/deployments/production.toml b/config/deployments/production.toml
index 4be067dade24..1bc4319b2d37 100644
--- a/config/deployments/production.toml
+++ b/config/deployments/production.toml
@@ -17,13 +17,15 @@ payout_connector_list = "wise"
 
 [connectors]
 aci.base_url = "https://eu-test.oppwa.com/"
-adyen.base_url = "https://{{merchant_endpoint_prefix}}-checkout-live.adyenpayments.com/"
+adyen.base_url = "https://{{merchant_endpoint_prefix}}-checkout-live.adyenpayments.com/checkout/"
 adyen.secondary_base_url = "https://{{merchant_endpoint_prefix}}-pal-live.adyenpayments.com/"
 airwallex.base_url = "https://api-demo.airwallex.com/"
 applepay.base_url = "https://apple-pay-gateway.apple.com/"
-authorizedotnet.base_url = "https://apitest.authorize.net/xml/v1/request.api"
+authorizedotnet.base_url = "https://api.authorize.net/xml/v1/request.api"
 bambora.base_url = "https://api.na.bambora.com"
 bankofamerica.base_url = "https://api.merchant-services.bankofamerica.com/"
+billwerk.base_url = "https://api.reepay.com/"
+billwerk.secondary_base_url = "https://card.reepay.com/"
 bitpay.base_url = "https://bitpay.com"
 bluesnap.base_url = "https://ws.bluesnap.com/"
 bluesnap.secondary_base_url = "https://pay.bluesnap.com/"
@@ -37,6 +39,7 @@ cryptopay.base_url = "https://business.cryptopay.me/"
 cybersource.base_url = "https://api.cybersource.com/"
 dlocal.base_url = "https://sandbox.dlocal.com/"
 dummyconnector.base_url = "http://localhost:8080/dummy-connector"
+ebanx.base_url = "https://sandbox.ebanxpay.com/"
 fiserv.base_url = "https://cert.api.fiservapps.com/"
 forte.base_url = "https://sandbox.forte.net/api/v3"
 globalpay.base_url = "https://apis.sandbox.globalpay.com/ucp/"
@@ -80,6 +83,9 @@ worldline.base_url = "https://eu.sandbox.api-ingenico.com/"
 worldpay.base_url = "https://try.access.worldpay.com/"
 zen.base_url = "https://api.zen.com/"
 zen.secondary_base_url = "https://secure.zen.com/"
+zsl.base_url = "https://api.sitoffalb.net/"
+threedsecureio.base_url = "https://service.3dsecure.io"
+netcetera.base_url = "https://{{merchant_endpoint_prefix}}.3ds-server.prev.netcetera-cloud-payment.ch"
 
 [delayed_session_response]
 connectors_with_delayed_session_response = "trustpay,payme"
@@ -102,7 +108,7 @@ refund_retrieve_duration = 500
 refund_retrieve_tolerance = 100
 refund_tolerance = 100
 refund_ttl = 172800
-slack_invite_url = "https://join.slack.com/t/hyperswitch-io/shared_invite/zt-1k6cz4lee-SAJzhz6bjmpp4jZCDOtOIg"
+slack_invite_url = "https://join.slack.com/t/hyperswitch-io/shared_invite/zt-2awm23agh-p_G5xNpziv6yAiedTkkqLg"
 
 [frm]
 enabled = false
@@ -111,11 +117,11 @@ enabled = false
 bank_debit.ach.connector_list = "gocardless"
 bank_debit.becs.connector_list = "gocardless"
 bank_debit.sepa.connector_list = "gocardless"
-card.credit.connector_list = "stripe,adyen,authorizedotnet,cybersource,globalpay,worldpay,multisafepay,nmi,nexinets,noon"
-card.debit.connector_list = "stripe,adyen,authorizedotnet,cybersource,globalpay,worldpay,multisafepay,nmi,nexinets,noon"
+card.credit.connector_list = "stripe,adyen,authorizedotnet,cybersource,globalpay,worldpay,multisafepay,nmi,nexinets,noon,bankofamerica"
+card.debit.connector_list = "stripe,adyen,authorizedotnet,cybersource,globalpay,worldpay,multisafepay,nmi,nexinets,noon,bankofamerica"
 pay_later.klarna.connector_list = "adyen"
-wallet.apple_pay.connector_list = "stripe,adyen,cybersource,noon"
-wallet.google_pay.connector_list = "stripe,adyen,cybersource"
+wallet.apple_pay.connector_list = "stripe,adyen,cybersource,noon,bankofamerica"
+wallet.google_pay.connector_list = "stripe,adyen,cybersource,bankofamerica"
 wallet.paypal.connector_list = "adyen"
 bank_redirect.ideal.connector_list = "stripe,adyen,globalpay"
 bank_redirect.sofort.connector_list = "stripe,adyen,globalpay"
@@ -285,6 +291,9 @@ pse = { country = "CO", currency = "COP" }
 red_compra = { country = "CL", currency = "CLP" }
 red_pagos = { country = "UY", currency = "UYU" }
 
+[pm_filters.zsl]
+local_bank_transfer = { country = "CN", currency = "CNY" }
+
 [temp_locker_enable_config]
 bluesnap.payment_method = "card"
 nuvei.payment_method = "card"
@@ -304,9 +313,13 @@ payme = { long_lived_token = false, payment_method = "card" }
 square = { long_lived_token = false, payment_method = "card" }
 stax = { long_lived_token = true, payment_method = "card,bank_debit" }
 stripe = { long_lived_token = false, payment_method = "wallet", payment_method_type = { list = "google_pay", type = "disable_only" } }
+billwerk = {long_lived_token = false, payment_method = "card"}
 
 [webhooks]
 outgoing_enabled = true
 
 [webhook_source_verification_call]
 connectors_with_webhook_source_verification_call = "paypal"
+
+[unmasked_headers]
+keys = "user-agent"

Full Changelog: v1.107.0...v1.108.0

hyperswitch - Hyperswitch v1.107.0

Published by bernard-eugine 7 months ago

1.107.0 (2024-03-12)

Docker Release

v1.107.0 (with KMS)
v1.107.0-standalone (without KMS)

Features

  • connector: [Cybersource] Implement 3DS flow for cards (#3290)
  • connector: [Volt] Add support for Payments Webhooks (#3155)
  • connector: [Volt] Add support for refund webhooks (#3326)
  • connector: [BANKOFAMERICA] Implement 3DS flow for cards (#3343)
  • connector: [Adyen] Add support for PIX Payment Method (#3236)
  • connector: [Payme] Add Void flow to Payme (#3817)
  • Add support for PaymentAuthorized, PaymentCaptured webhook events (#3212)
  • Add outgoing webhook for manual partial_capture events (#3388)
  • Implement hashicorp secrets manager solution (#3297)
  • Add a logging middleware to log all api requests (#3437)
  • Added sdk layout option payment link (#3207)
  • Add capability to store bank details using /payment_methods endpoint (#3113)
  • Add Wallet to Payouts (#3502)
  • Extend routing capabilities to payout operation (#3531)
  • Implement Smart Retries for Payout (#3580)
  • Add recon APIs (#3345)
  • Payment_method block (#3056)
  • Add delete_evidence api for disputes (#3608)
  • Add support to delete user (#3374)
  • Support multiple invites (#3422)
  • Add support for resend invite (#3523)
  • Create apis for custom role (#3763)
  • Invite user without email (#3328)
  • Add transfer org ownership API (#3603)
  • Add deep health check (#3210)
  • Add support for card extended bin in payment attempt (#3312)

Refactors / Bug Fixes

  • Fix the error during surcharge with saved card (#3318)
  • Return surcharge in payment method list response if passed in create request (#3363)
  • Fix mandate_details to store some value only if mandate_data struct is present (#3525)
  • Add column mandate_data for storing the details of a mandate in PaymentAttempt (#3606)
  • Validate amount_to_capture in payment update (#3830)
  • Add merchant_connector_id in refund (#3303)
  • Update amount_capturable based on intent_status and payment flow (#3278)
  • Auto retry once for connection closed (#3426)
  • Add locker config to enable or disable locker (#3352)
  • Restrict requires_customer_action in confirm (#3235)
  • Inclusion of locker to store fingerprints (#3630)
  • Status mapping for Capture for 429 http code (#3897)
  • Change unique constraint to connector label (#3091)
  • Segregated payment link in html css js files, sdk over flow issue, surcharge bug, block SPM customer call for payment link (#3410)
  • Add Miscellaneous charges in cart for payment links (#3645)
  • Handle card duplication (#3146)
  • Restricted list payment method Customer to api-key based (#3100)

Compatibility

This version of the Hyperswitch App server is compatible with the following versions of other components:

Database Migrations

DROP INDEX IF EXISTS "merchant_connector_account_profile_id_connector_id_index";
-- Your SQL goes here
ALTER TABLE payment_intent ADD COLUMN IF NOT EXISTS session_expiry TIMESTAMP DEFAULT NULL;
-- Your SQL goes here

CREATE TYPE "BlocklistDataKind" AS ENUM (
'payment_method',
'card_bin',
'extended_card_bin'
);

CREATE TABLE blocklist_fingerprint (
id SERIAL PRIMARY KEY,
merchant_id VARCHAR(64) NOT NULL,
fingerprint_id VARCHAR(64) NOT NULL,
data_kind "BlocklistDataKind" NOT NULL,
encrypted_fingerprint TEXT NOT NULL,
created_at TIMESTAMP NOT NULL
);

CREATE UNIQUE INDEX blocklist_fingerprint_merchant_id_fingerprint_id_index
ON blocklist_fingerprint (merchant_id, fingerprint_id);
-- Your SQL goes here

CREATE TABLE blocklist (
id SERIAL PRIMARY KEY,
merchant_id VARCHAR(64) NOT NULL,
fingerprint_id VARCHAR(64) NOT NULL,
data_kind "BlocklistDataKind" NOT NULL,
metadata JSONB,
created_at TIMESTAMP NOT NULL
);

CREATE UNIQUE INDEX blocklist_unique_fingerprint_id_index ON blocklist (merchant_id, fingerprint_id);
CREATE INDEX blocklist_merchant_id_data_kind_created_at_index ON blocklist (merchant_id, data_kind, created_at DESC);
-- Your SQL goes here
ALTER TABLE payment_intent ADD COLUMN IF NOT EXISTS fingerprint_id VARCHAR(64);
ALTER TABLE payment_attempt
ADD COLUMN IF NOT EXISTS net_amount BIGINT;
-- Backfill
UPDATE payment_attempt pa
SET net_amount = pa.amount + COALESCE(pa.surcharge_amount, 0) + COALESCE(pa.tax_amount, 0);
-- Your SQL goes here

CREATE TABLE blocklist_lookup (
id SERIAL PRIMARY KEY,
merchant_id VARCHAR(64) NOT NULL,
fingerprint TEXT NOT NULL
);

CREATE UNIQUE INDEX blocklist_lookup_merchant_id_fingerprint_index ON blocklist_lookup (merchant_id, fingerprint);
-- Your SQL goes here
ALTER TABLE business_profile ADD COLUMN IF NOT EXISTS session_expiry BIGINT DEFAULT NULL;
-- Your SQL goes here
ALTER TYPE "EventType" ADD VALUE IF NOT EXISTS 'payment_authorized';
ALTER TYPE "EventType" ADD VALUE IF NOT EXISTS 'payment_captured';
-- Your SQL goes here
ALTER TABLE users ADD COLUMN preferred_merchant_id VARCHAR(64);
-- Your SQL goes here
ALTER TYPE "DashboardMetadata" ADD VALUE IF NOT EXISTS 'integration_completed';
-- Your SQL goes here
ALTER TABLE payout_attempt
ALTER COLUMN connector TYPE JSONB USING jsonb_build_object (
'routed_through', connector, 'algorithm', NULL
);

ALTER TABLE payout_attempt ADD COLUMN routing_info JSONB;

UPDATE payout_attempt
SET
routing_info = connector -> 'algorithm'
WHERE
connector ->> 'algorithm' IS NOT NULL;

ALTER TABLE payout_attempt
ALTER COLUMN connector TYPE VARCHAR(64) USING connector ->> 'routed_through';

ALTER TABLE payout_attempt ALTER COLUMN connector DROP NOT NULL;

CREATE type "TransactionType" as ENUM('payment', 'payout');

ALTER TABLE routing_algorithm
ADD COLUMN algorithm_for "TransactionType" DEFAULT 'payment' NOT NULL;

ALTER TABLE routing_algorithm
ALTER COLUMN algorithm_for
DROP DEFAULT;
-- Your SQL goes here
ALTER TYPE "PayoutType" ADD VALUE IF NOT EXISTS 'wallet';
-- Your SQL goes here
ALTER TABLE payouts
ADD COLUMN attempt_count SMALLINT NOT NULL DEFAULT 1;

UPDATE payouts
SET attempt_count = payout_id_count.count
FROM (SELECT payout_id, count(payout_id) FROM payout_attempt GROUP BY payout_id) as payout_id_count
WHERE payouts.payout_id = payout_id_count.payout_id;
-- Your SQL goes here
ALTER TABLE payment_attempt
ADD COLUMN IF NOT EXISTS mandate_data JSONB DEFAULT NULL;
-- Your SQL goes here
ALTER TABLE payment_attempt ADD COLUMN IF NOT EXISTS fingerprint_id VARCHAR(64);
-- Your SQL goes here
CREATE TYPE "RoleScope" AS ENUM ('merchant','organization');

CREATE TABLE IF NOT EXISTS roles (
id SERIAL PRIMARY KEY,
role_name VARCHAR(64) NOT NULL,
role_id VARCHAR(64) NOT NULL UNIQUE,
merchant_id VARCHAR(64) NOT NULL,
org_id VARCHAR(64) NOT NULL,
groups TEXT[] NOT NULL,
scope "RoleScope" NOT NULL,
created_at TIMESTAMP NOT NULL DEFAULT now(),
created_by VARCHAR(64) NOT NULL,
last_modified_at TIMESTAMP NOT NULL DEFAULT now(),
last_modified_by VARCHAR(64) NOT NULL
);

CREATE UNIQUE INDEX IF NOT EXISTS role_id_index ON roles (role_id);
CREATE INDEX roles_merchant_org_index ON roles (merchant_id, org_id);
-- Your SQL goes here
ALTER TABLE address
ADD COLUMN IF NOT EXISTS email BYTEA;
-- Your SQL goes here
ALTER TYPE "DashboardMetadata" ADD VALUE IF NOT EXISTS 'is_change_password_required';
-- Your SQL goes here

ALTER TABLE payment_methods ADD COLUMN IF NOT EXISTS locker_id VARCHAR(64) DEFAULT NULL;
-- Your SQL goes here
ALTER TABLE payment_methods ADD COLUMN IF NOT EXISTS last_used_at TIMESTAMP NOT NULL DEFAULT now()::TIMESTAMP;
-- Your SQL goes here
ALTER TABLE customers
ADD COLUMN IF NOT EXISTS default_payment_method_id VARCHAR(64);
-- Your SQL goes here

ALTER TABLE payment_methods
ADD COLUMN connector_mandate_details JSONB
DEFAULT NULL;

ALTER TABLE payment_methods
ADD COLUMN customer_acceptance JSONB
DEFAULT NULL;

ALTER TABLE payment_methods
ADD COLUMN status VARCHAR(64)
NOT NULL DEFAULT 'active';
-- Your SQL goes here
CREATE UNIQUE INDEX role_name_org_id_org_scope_index ON roles(org_id, role_name) WHERE scope='organization';
CREATE UNIQUE INDEX role_name_merchant_id_merchant_scope_index ON roles(merchant_id, role_name) WHERE scope='merchant';
-- Your SQL goes here
-- Add the new column with a default value
ALTER TABLE dispute
ADD COLUMN dispute_amount BIGINT NOT NULL DEFAULT 0;

-- Update existing rows to set the default value based on the integer equivalent of the amount column
UPDATE dispute
SET dispute_amount = CAST(amount AS BIGINT);

Comparing v1.105.1..v107.0 - juspay/hyperswitch

Configuration Changes

Full Changelog: v1.105.1...v1.107.0

hyperswitch - Hyperswitch v1.105.1

Published by shakthi-22 9 months ago

1.105.1 (2024-01-11)

Docker Release:

v1.105.1 (with KMS)
v1.105.1-standalone (without KMS)

New Features:

  • connector: [BankofAmerica] Implement support for Google Pay and Applepay (#2940 ) (#3061)
  • connector: [Cybersource] Implement support for Google Pay and Applepay (#3139) (#3149)
  • connector: [NMI] Implement 3DS for Cards and webhooks for payments and refunds (#3143) (#3164)
  • connector: [Paypal]Add Preprocessing flow to complete authorization for Card 3DS Auth Verification (#2757)
  • connector: [Trustpay] Update dynamic fields for trustpay blik (#3042)
  • connector: [BOA] Populate merchant_defined_information with metadata (#3253)
  • Add support for Riskified FRM Connector (#2533)
  • Add ability to verify connector credentials before integrating the connector (#2986)
  • Enable surcharge support for all connectors (#3109)
  • Make core changes in payments flow to support incremental authorization (#3009)
  • Add support for tokenizing bank details and fetching masked details while listing (#2585)
  • Implement change password for user (#2959)
  • Add support to filter payment link based on merchant_id (#2805)
  • Add APIs for user roles (#3013 )
  • Receive card_holder_name in confirm flow when using token for payment (#2982)
  • payments: Add outgoing payments webhooks (#3133)
  • Use card bin to get additional card details (#3036)
  • Add support for passing card_cvc in payment_method_data object along with token (#3024)

Bugs:

  • Accept connector_transaction_id in error_response of connector flows (#2972)
  • Enable payment refund when payment is partially captured (#2991)
  • Make the billing country for apple pay as optional field (#3188)
  • Error propagation for not supporting partial refund (#2976)
  • Mark refund status as failure for not_implemented error from connector flows (#2978)
  • Allow zero amount for payment intent in list payment methods (#3090)
  • Validate refund amount with amount_captured instead of amount (#3120)
  • Make the card_holder_name as an empty string if not sent (#3173)

Database Migration:

Comparing v1.86.0..v1.105.1 · juspay/hyperswitch

Compatibility:

This version of the Hyperswitch App server is compatible with the following versions of other components:
Control Center Version: v1.23.3
Web Client Version: v0.16.7
WooCommerce Plugin Version: v1.2.0
Card Vault Version: v0.2.0

hyperswitch - Hyperswitch v1.86.0

Published by SanchithHegde 11 months ago

1.86.0 (2023-11-21)

Features

  • connector: [Prophetpay] Save card token for Refund and remove Void flow (#2927) (15a255e) by @Sakilmostak
  • Add support for 3ds and surcharge decision through routing rules (#2869) (f8618e0) by @hrithikesh026

Bug Fixes

  • mca: Change the check for disabled field in mca create and update (#2938) (e66ccde) by @ThisIsMani
  • Status goes from pending to partially captured in psync (#2915) (3f3b797) by @hrithikesh026

Testing

  • postman: Update postman collection files (245e489) by @github-actions

Full Changelog: v1.85.0...v1.86.0

hyperswitch - Hyperswitch v1.85.0

Published by SanchithHegde 11 months ago

1.85.0 (2023-11-21)

Features

  • mca: Add new auth_type and a status field for mca (#2883) (25cef38) by @ThisIsMani
  • router: Add unified_code, unified_message in payments response (#2918) (3954001) by @sai-harsha-vardhan

Bug Fixes

  • connector:
    • [fiserv] fix metadata deserialization in merchant_connector_account (#2746) (644709d) by @srujanchikke
    • [CASHTOCODE] Fix Error Response Handling (#2926) (938b63a) by @deepanshu-iiitu
  • router: Associate parent payment token with payment_method_id as hyperswitch token for saved cards (#2130) (efeebc0) by @vspecky
  • Api lock on PaymentsCreate (#2916) (cfabfa6) by @dracarys18
  • Merchant_connector_id null in KV flow (#2810) (e566a4e) by @dracarys18

Refactors

  • connector: [Paypal] Add support for both BodyKey and SignatureKey (#2633) (d8fcd3c) by @swangi-kumari
  • core: Query business profile only once (#2830) (44deeb7) by @Narayanbhat166
  • payment_methods: Added support for pm_auth_connector field in pm list response (#2667) (be4aa3b) by @Sarthak1799
  • Add mapping for ConnectorError in payouts flow (#2608) (5c4e7c9) by @kashif-m

Testing

  • postman: Update postman collection files (ce725ef) by @github-actions

Full Changelog: v1.84.0...v1.85.0

hyperswitch - Hyperswitch v1.84.0

Published by SanchithHegde 11 months ago

1.84.0 (2023-11-17)

Features

  • connector: [BANKOFAMERICA] PSYNC Bugfix (#2897) (bdcc138) by @deepanshu-iiitu

Full Changelog: v1.83.1...v1.84.0

hyperswitch - Hyperswitch v1.83.1

Published by SanchithHegde 11 months ago

1.83.1 (2023-11-17)

Bug Fixes

  • router: Add choice to use the appropriate key for jws verification (#2917) (606daa9) by @ShankarSinghC

Full Changelog: v1.83.0...v1.83.1

hyperswitch - Hyperswitch v1.83.0

Published by SanchithHegde 11 months ago

1.83.0 (2023-11-17)

Features

  • events: Add incoming webhook payload to api events logger (#2852) (aea390a) by @prasunna09
  • router: Custom payment link config for payment create (#2741) (c39beb2) by @sahkal

Bug Fixes

  • router: Add rust locker url in proxy_bypass_urls (#2902) (9a201ae) by @ShankarSinghC

Documentation

  • README: Replace cloudformation deployment template with latest s3 url. (#2891) (375108b) by @nitesh-balla

Full Changelog: v1.82.0...v1.83.0

hyperswitch - Hyperswitch v1.82.0

Published by SanchithHegde 11 months ago

1.82.0 (2023-11-17)

Features

  • router: Add fallback while add card and retrieve card from rust locker (#2888) (f735fb0) by @ShankarSinghC

Bug Fixes

  • core: Introduce new attempt and intent status to handle multiple partial captures (#2802) (cb88be0) by @hrithikesh026

Testing

  • postman: Update postman collection files (7d05b74) by @github-actions

Full Changelog: v1.81.0...v1.82.0

hyperswitch - Hyperswitch v1.81.0

Published by SanchithHegde 11 months ago

1.81.0 (2023-11-16)

Features

  • connector:
    • [BANKOFAMERICA] Implement Cards for Bank of America (#2765) (e8de3a7) by @deepanshu-iiitu
    • [ProphetPay] Implement Card Redirect PaymentMethodType and flows for Authorize, CompleteAuthorize, Psync, Refund, Rsync and Void (#2641) (8d4adc5) by @Sakilmostak

Testing

  • postman: Update postman collection files (f829197) by @github-actions

Full Changelog: v1.80.0...v1.81.0

hyperswitch - Hyperswitch v1.80.0

Published by SanchithHegde 11 months ago

1.80.0 (2023-11-16)

Features

  • router: Add api to migrate card from basilisk to rust (#2853) (b8b20c4) by @ShankarSinghC
  • Spawn webhooks and async scheduling in background (#2780) (f248fe2) by @jarnura

Refactors

  • router: Add openapi spec support for gsm apis (#2871) (62c9cca) by @sai-harsha-vardhan

Full Changelog: v1.79.0...v1.80.0

hyperswitch - Hyperswitch v1.79.0

Published by SanchithHegde 11 months ago

1.79.0 (2023-11-16)

Features

  • Change async-bb8 fork and tokio spawn for concurrent database calls (#2774) (d634fde) by @jarnura

Bug Fixes

  • connector: [noon] add validate psync reference (#2886) (b129023) by @SamraatBansal
  • payment_link: Render SDK for status requires_payment_method (#2887) (d4d2c2c) by @kashif-m
  • Paypal postman collection changes for surcharge feature (#2884) (5956242) by @hrithikesh026

Testing

  • postman: Update postman collection files (5c31365) by @github-actions

Full Changelog: v1.78.0...v1.79.0

hyperswitch - Hyperswitch v1.78.0

Published by SanchithHegde 11 months ago

1.78.0 (2023-11-14)

Features

  • router: Add automatic retries and step up 3ds flow (#2834) (d2968c9) by @sai-harsha-vardhan
  • Payment link status page UI (#2740) (856c7af) by @kashif-m

Bug Fixes

  • Handle session and confirm flow discrepancy in surcharge details (#2696) (cafea45) by @hrithikesh026

Full Changelog: v1.77.0...v1.78.0

hyperswitch - Hyperswitch v1.77.0

Published by SanchithHegde 11 months ago

1.77.0 (2023-11-13)

Features

  • apievent: Added hs latency to api event (#2734) (c124511) by @harsh-sharma-juspay
  • router:
    • Add new JWT authentication variants and use them (#2835) (f88eee7) by @ThisIsMani
    • Profile specific fallback derivation while routing payments (#2806) (8e538db) by @prajjwalkumar17

Build System / Dependencies

  • deps: Remove unused dependencies and features (#2854) (0553587) by @SanchithHegde

Full Changelog: v1.76.0...v1.77.0

hyperswitch - Hyperswitch v1.76.0

Published by SanchithHegde 11 months ago

1.76.0 (2023-11-12)

Features

  • analytics: Analytics APIs (#2792) (f847802) by @ivor-juspay
  • router: Added Payment link new design (#2731) (2a4f5d1) by @sahkal
  • user: Setup user tables (#2803) (20c4226) by @apoorvdixit88

Refactors

  • connector: [Zen] change error message from NotSupported to NotImplemented (#2831) (b5ea8db) by @swangi-kumari
  • core: Remove connector response table and use payment_attempt instead (#2644) (966369b) by @Abhicodes-crypto
  • events: Update api events to follow snake case naming (#2828) (b3d5062) by @lsampras

Documentation

  • README: Add bootstrap button for cloudformation deployment (#2827) (e67e808) by @inventvenkat

Full Changelog: v1.75.0...v1.76.0

hyperswitch - Hyperswitch v1.75.0

Published by SanchithHegde 11 months ago

1.75.0 (2023-11-09)

Features

  • events: Add extracted fields based on req/res types (#2795) (8985794) by @lsampras
  • router:
    • Added merchant custom name support for payment link (#2685) (8b15189) by @sahkal
    • Add gateway_status_map CRUD APIs (#2809) (5c9e235) by @sai-harsha-vardhan

Bug Fixes

  • analytics: Added hs latency to api event for paymentconfirm call (#2787) (aab8f60) by @harsh-sharma-juspay
  • [mollie] locale validation irrespective of auth type (#2814) (25a73c2) by @ArjunKarthik

Full Changelog: v1.74.0...v1.75.0

hyperswitch - Hyperswitch v1.74.0

Published by SanchithHegde 11 months ago

1.74.0 (2023-11-08)

Features

  • core: Use redis as temp locker instead of basilisk (#2789) (6678689) by @Abhicodes-crypto
  • events: Add request details to api events (#2769) (164d1c6) by @lsampras
  • router: Add gateway_status_map interface (#2804) (a429b23) by @sai-harsha-vardhan
  • test_utils: Add custom-headers and custom delay support to rustman (#2636) (1effddd) by @pixincreate

Bug Fixes

  • connector: Add attempt_status in field in error_response (#2794) (5642fef) by @srujanchikke

Refactors

  • config: Update payment method filter of Klarna in Stripe (#2807) (21ce807) by @ShankarSinghC
  • router: Add parameter connectors to get_request_body function (#2708) (7623ea9) by @AkshayaFoiger

Documentation

Full Changelog: v1.73.0...v1.74.0

hyperswitch - Hyperswitch v1.73.0

Published by SanchithHegde 12 months ago

1.73.0 (2023-11-07)

Features

  • connector:
    • [BANKOFAMERICA] Add Connector Template Code (#2764) (4563935) by @deepanshu-iiitu
    • [Bitpay] Add order id as the reference id (#2591) (d47d4ac) by @ashh1215
  • router: Make webhook events config disabled only and by default enable all the events (#2770) (d335879) by @sai-harsha-vardhan
  • Make drainer logs queryable with request_id and global_id (#2771) (ff73aba) by @dracarys18

Bug Fixes

  • connector: Fix amount conversion incase of minor unit (#2793) (34f5226) by @srujanchikke

Refactors

  • payment_methods: Added support for account subtype in pmd (#2651) (e7375d0) by @Sarthak1799

Documentation

  • README: Add one-click deployment information using CDK (#2798) (bb39cd4) by @AnandKGanesh

Full Changelog: v1.72.0...v1.73.0