diff --git a/.github/workflows/CI-pr.yml b/.github/workflows/CI-pr.yml index 369da734da..d01c26d511 100644 --- a/.github/workflows/CI-pr.yml +++ b/.github/workflows/CI-pr.yml @@ -259,7 +259,7 @@ jobs: - name: Run clippy shell: bash - run: just clippy + run: just clippy --jobs 2 - name: Check Cargo.lock changed if: ${{ (github.event.pull_request.head.repo.full_name == github.event.pull_request.base.repo.full_name) }} diff --git a/.github/workflows/CI-push.yml b/.github/workflows/CI-push.yml index 7bc5599588..e17ce46d85 100644 --- a/.github/workflows/CI-push.yml +++ b/.github/workflows/CI-push.yml @@ -42,6 +42,8 @@ jobs: runs-on: ${{ matrix.runner }} env: + # Use `sccache` for caching compilation artifacts + RUSTC_WRAPPER: sccache RUSTFLAGS: "-D warnings" strategy: @@ -75,10 +77,16 @@ jobs: uses: arduino/setup-protoc@v3 with: repo-token: ${{ secrets.GITHUB_TOKEN }} - - - uses: Swatinem/rust-cache@v2.7.0 + + - name: Install sccache + uses: taiki-e/install-action@v2.33.28 with: - save-if: ${{ github.event_name == 'push' }} + tool: sccache + checksum: true + + # - uses: Swatinem/rust-cache@v2.7.0 + # with: + # save-if: ${{ github.event_name == 'push' }} - name: Install cargo-hack uses: baptiste0928/cargo-install@v2.2.0 @@ -131,6 +139,8 @@ jobs: runs-on: ${{ matrix.runner }} env: + # Use `sccache` for caching compilation artifacts + RUSTC_WRAPPER: sccache RUSTFLAGS: "-D warnings" strategy: @@ -160,6 +170,12 @@ jobs: with: repo-token: ${{ secrets.GITHUB_TOKEN }} + - name: Install sccache + uses: taiki-e/install-action@v2.33.28 + with: + tool: sccache + checksum: true + - name: Install cargo-hack uses: baptiste0928/cargo-install@v2.2.0 with: @@ -180,13 +196,13 @@ jobs: # with: # crate: cargo-nextest - - uses: Swatinem/rust-cache@v2.7.0 - with: - save-if: ${{ github.event_name == 'push' }} + # - uses: Swatinem/rust-cache@v2.7.0 + # with: + # save-if: ${{ github.event_name == 'push' }} - name: Run clippy shell: bash - run: just clippy + run: just clippy --jobs 2 - name: Cargo hack if: ${{ github.event_name == 'push' }} diff --git a/.github/workflows/cypress-tests-runner.yml b/.github/workflows/cypress-tests-runner.yml index bc83c2388f..4de046499a 100644 --- a/.github/workflows/cypress-tests-runner.yml +++ b/.github/workflows/cypress-tests-runner.yml @@ -14,7 +14,7 @@ env: CARGO_INCREMENTAL: 0 CARGO_NET_RETRY: 10 PAYMENTS_CONNECTORS: "cybersource stripe" - PAYOUTS_CONNECTORS: "adyenplatform wise" + PAYOUTS_CONNECTORS: "wise" RUST_BACKTRACE: short RUSTUP_MAX_RETRIES: 10 RUN_TESTS: ${{ ((github.event_name == 'pull_request') && (github.event.pull_request.head.repo.full_name == github.event.pull_request.base.repo.full_name)) || (github.event_name == 'merge_group')}} @@ -128,7 +128,7 @@ jobs: CONNECTOR_AUTH_PASSPHRASE: ${{ secrets.CONNECTOR_AUTH_PASSPHRASE }} CONNECTOR_CREDS_S3_BUCKET_URI: ${{ secrets.CONNECTOR_CREDS_S3_BUCKET_URI}} DESTINATION_FILE_NAME: "creds.json.gpg" - S3_SOURCE_FILE_NAME: "aa328308-b34e-41b7-a590-4fe45cfe7991.json.gpg" + S3_SOURCE_FILE_NAME: "5b3ebdad-1067-421b-83e5-3ceb73c3eeeb.json.gpg" shell: bash run: | mkdir -p ".github/secrets" ".github/test" @@ -149,7 +149,7 @@ jobs: run: | LOCAL_ADMIN_API_KEY=$(yq '.secrets.admin_api_key' ${TOML_PATH}) echo "CYPRESS_ADMINAPIKEY=${LOCAL_ADMIN_API_KEY}" >> $GITHUB_ENV - + - name: Install mold linker if: ${{ runner.os == 'Linux' && env.RUN_TESTS == 'true' }} uses: rui314/setup-mold@v1 @@ -170,13 +170,6 @@ jobs: tool: sccache checksum: true - - name: Install cargo-nextest - if: ${{ env.RUN_TESTS == 'true' }} - uses: taiki-e/install-action@v2.41.10 - with: - tool: cargo-nextest - checksum: true - - name: Install Diesel CLI if: ${{ env.RUN_TESTS == 'true' }} uses: baptiste0928/cargo-install@v3.1.1 @@ -222,6 +215,11 @@ jobs: - name: Setup Local Server if: ${{ env.RUN_TESTS == 'true' }} + env: + ROUTER__APPLEPAY_DECRYPT_KEYS__APPLE_PAY_PPC: ${{ secrets.APPLE_PAY_PAYMENT_PROCESSING_CERTIFICATE }} + ROUTER__APPLEPAY_DECRYPT_KEYS__APPLE_PAY_PPC_KEY: ${{ secrets.APPLE_PAY_PAYMENT_PROCESSING_CERTIFICATE_KEY }} + ROUTER__APPLEPAY_DECRYPT_KEYS__APPLE_PAY_MERCHANT_CERT: ${{ secrets.APPLE_PAY_MERCHANT_CERTIFICATE }} + ROUTER__APPLEPAY_DECRYPT_KEYS__APPLE_PAY_MERCHANT_CERT_KEY: ${{ secrets.APPLE_PAY_MERCHANT_CERTIFICATE_KEY }} run: | # Start the server in the background target/debug/router & @@ -261,3 +259,211 @@ jobs: path: | cypress-tests/cypress/reports/ retention-days: 1 + + runner_v2: + name: Run Cypress tests on v2 and generate coverage report + runs-on: hyperswitch-runners + env: + CODECOV_FILE: "lcov.info" + + services: + redis: + image: "public.ecr.aws/docker/library/redis:alpine" + options: >- + --health-cmd "redis-cli ping" + --health-interval 10s + --health-timeout 5s + --health-retries 5 + ports: + - 6379:6379 + postgres: + image: "public.ecr.aws/docker/library/postgres:alpine" + env: + POSTGRES_USER: db_user + POSTGRES_PASSWORD: db_pass + POSTGRES_DB: hyperswitch_db + options: >- + --health-cmd pg_isready + --health-interval 10s + --health-timeout 5s + --health-retries 5 + ports: + - 5432:5432 + + steps: + - name: Skip tests for PRs from forks + shell: bash + if: ${{ env.RUN_TESTS == 'false' }} + run: echo 'Skipping tests for PRs from forks' + + - name: Checkout repository + if: ${{ env.RUN_TESTS == 'true' }} + uses: actions/checkout@v4 + + - name: Download Encrypted TOML from S3 and Decrypt + if: ${{ env.RUN_TESTS == 'true' }} + env: + AWS_ACCESS_KEY_ID: ${{ secrets.CONNECTOR_CREDS_AWS_ACCESS_KEY_ID }} + AWS_REGION: ${{ secrets.CONNECTOR_CREDS_AWS_REGION }} + AWS_SECRET_ACCESS_KEY: ${{ secrets.CONNECTOR_CREDS_AWS_SECRET_ACCESS_KEY }} + CONNECTOR_AUTH_PASSPHRASE: ${{ secrets.CONNECTOR_AUTH_PASSPHRASE }} + CONNECTOR_CREDS_S3_BUCKET_URI: ${{ secrets.CONNECTOR_CREDS_S3_BUCKET_URI}} + DESTINATION_FILE_NAME: "creds.json.gpg" + S3_SOURCE_FILE_NAME: "aa328308-b34e-41b7-a590-4fe45cfe7991.json.gpg" + shell: bash + run: | + mkdir -p ".github/secrets" ".github/test" + + aws s3 cp "${CONNECTOR_CREDS_S3_BUCKET_URI}/${S3_SOURCE_FILE_NAME}" ".github/secrets/${DESTINATION_FILE_NAME}" + gpg --quiet --batch --yes --decrypt --passphrase="${CONNECTOR_AUTH_PASSPHRASE}" --output ".github/test/creds.json" ".github/secrets/${DESTINATION_FILE_NAME}" + + - name: Set paths in env + if: ${{ env.RUN_TESTS == 'true' }} + shell: bash + run: | + echo "CYPRESS_CONNECTOR_AUTH_FILE_PATH=${{ github.workspace }}/.github/test/creds.json" >> $GITHUB_ENV + + - name: Fetch keys + if: ${{ env.RUN_TESTS == 'true' }} + env: + TOML_PATH: "./config/development.toml" + run: | + LOCAL_ADMIN_API_KEY=$(yq '.secrets.admin_api_key' ${TOML_PATH}) + echo "CYPRESS_ADMINAPIKEY=${LOCAL_ADMIN_API_KEY}" >> $GITHUB_ENV + + - name: Install mold linker + if: ${{ runner.os == 'Linux' && env.RUN_TESTS == 'true' }} + uses: rui314/setup-mold@v1 + with: + make-default: true + + - name: Install Rust + if: ${{ env.RUN_TESTS == 'true' }} + uses: dtolnay/rust-toolchain@master + with: + toolchain: stable 2 weeks ago + components: llvm-tools-preview + + - name: Install sccache + if: ${{ env.RUN_TESTS == 'true' }} + uses: taiki-e/install-action@v2.41.10 + with: + tool: sccache + checksum: true + + - name: Install Diesel CLI + if: ${{ env.RUN_TESTS == 'true' }} + uses: baptiste0928/cargo-install@v3.1.1 + with: + crate: diesel_cli + features: postgres + args: --no-default-features + + - name: Install grcov + if: ${{ env.RUN_TESTS == 'true' }} + uses: taiki-e/install-action@v2.41.10 + with: + tool: grcov + checksum: true + + - name: Install Just + if: ${{ env.RUN_TESTS == 'true' }} + uses: taiki-e/install-action@v2.41.10 + with: + tool: just + checksum: true + + - name: Install Node.js + if: ${{ env.RUN_TESTS == 'true' }} + uses: actions/setup-node@v4 + with: + node-version: '20' + cache: 'npm' + + - name: Install Cypress and dependencies + if: ${{ env.RUN_TESTS == 'true' }} + run: | + npm ci --prefix ./cypress-tests-v2 + + - name: Run database migrations + if: ${{ env.RUN_TESTS == 'true' }} + shell: bash + env: + DATABASE_URL: postgres://db_user:db_pass@localhost:5432/hyperswitch_db + run: just migrate_v2 run --locked-schema + + - name: Insert card info into the database + if: ${{ env.RUN_TESTS == 'true' }} + run: | + PGPASSWORD=db_pass psql --host=localhost --port=5432 --username=db_user --dbname=hyperswitch_db --command "\copy cards_info FROM '.github/data/cards_info.csv' DELIMITER ',' CSV HEADER;" + + - name: Build project + if: ${{ env.RUN_TESTS == 'true' }} + env: + RUSTFLAGS: "-Cinstrument-coverage" + run: just build_v2 --jobs 3 + + - name: Setup Local Server + if: ${{ env.RUN_TESTS == 'true' }} + env: + LLVM_PROFILE_FILE: "coverage.profraw" + run: | + # Start the server in the background + target/debug/router & + + SERVER_PID=$! + echo "PID=${SERVER_PID}" >> $GITHUB_ENV + + # Wait for the server to start in port 8080 + COUNT=0 + while ! nc -z localhost 8080; do + if [ $COUNT -gt 12 ]; then # Wait for up to 2 minutes (12 * 10 seconds) + echo "Server did not start within a reasonable time. Exiting." + kill ${SERVER_PID} + exit 1 + else + COUNT=$((COUNT+1)) + sleep 10 + fi + done + + - name: Run Cypress tests + if: ${{ env.RUN_TESTS == 'true' }} + env: + CYPRESS_BASEURL: "http://localhost:8080" + ROUTER__SERVER__WORKERS: 4 + shell: bash -leuo pipefail {0} + continue-on-error: true + # We aren't specifying `command` and `jobs` arguments currently + run: scripts/execute_cypress.sh "" "" "cypress-tests-v2" + + - name: Stop running server + if: ${{ env.RUN_TESTS == 'true' }} && always() + run: | + kill "${{ env.PID }}" + + - name: Upload Cypress test results + if: env.RUN_TESTS == 'true' && failure() + uses: actions/upload-artifact@v4 + with: + name: cypress-v2-test-results + path: | + cypress-tests-v2/cypress/reports/ + retention-days: 1 + + # Notes: + # - The `router` process must be killed (using SIGINT/SIGTERM) to generate the `coverage.profraw` file, otherwise the coverage will only be generated for the buildscripts + # - Trying to generate branch coverage using "-Z coverage-options=branch" currently fails. Both grcov and cargo-llvm-cov crash when trying + # to process the generated `.profraw` files. + # - --keep-only argument is used to exclude external crates in generated lcov.info file (~500MiB -> ~70MiB) + - name: Process coverage report + if: ${{ env.RUN_TESTS == 'true' && github.event_name != 'merge_group' }} + run: grcov . --source-dir . --output-types lcov --output-path ${{ env.CODECOV_FILE }} --binary-path ./target/debug --keep-only "crates/*" + + - name: Upload coverage reports to Codecov + uses: codecov/codecov-action@v5 + if: ${{ env.RUN_TESTS == 'true' && github.event_name != 'merge_group'}} + with: + token: ${{ secrets.CODECOV_TOKEN }} + files: ${{ env.CODECOV_FILE }} + disable_search: true \ No newline at end of file diff --git a/.gitignore b/.gitignore index dcbeddf7ad..d53145b33e 100644 --- a/.gitignore +++ b/.gitignore @@ -241,6 +241,7 @@ $RECYCLE.BIN/ # hyperswitch Project specific excludes # code coverage report *.profraw +lcov.info html/ coverage.json # other diff --git a/CHANGELOG.md b/CHANGELOG.md index ee0640a564..f8594f6be2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,197 @@ All notable changes to HyperSwitch will be documented here. - - - +## 2025.01.23.0 + +### Features + +- **connector:** [ADYEN ] Consume transaction id for PaymentsPreProcessing error ([#7061](https://github.com/juspay/hyperswitch/pull/7061)) ([`199d176`](https://github.com/juspay/hyperswitch/commit/199d1764488f234accab3bfecef9645ee9486057)) + +### Refactors + +- [CYBERSOURCE, BANKOFAMERICA, WELLSFARGO] Move code to crate hyperswitch_connectors ([#6908](https://github.com/juspay/hyperswitch/pull/6908)) ([`be01896`](https://github.com/juspay/hyperswitch/commit/be018963c6696c3f494bdd45825ebc61ba1bbc82)) + +### Miscellaneous Tasks + +- Enable 128-column-tables feature for diesel crate ([#6857](https://github.com/juspay/hyperswitch/pull/6857)) ([`eaf450b`](https://github.com/juspay/hyperswitch/commit/eaf450b91109c21e1091f7936cab009e8e6e2abb)) + +**Full Changelog:** [`2025.01.22.0...2025.01.23.0`](https://github.com/juspay/hyperswitch/compare/2025.01.22.0...2025.01.23.0) + +- - - + +## 2025.01.22.0 + +### Features + +- **connectors:** Fiuu,novalnet,worldpay - extend NTI flows ([#6946](https://github.com/juspay/hyperswitch/pull/6946)) ([`d6b0660`](https://github.com/juspay/hyperswitch/commit/d6b0660569eb8bbbc6557aa6ed29184fe51ab209)) +- **email:** Add mailhog by default in docker-compose for local smtp server ([#6869](https://github.com/juspay/hyperswitch/pull/6869)) ([`100a178`](https://github.com/juspay/hyperswitch/commit/100a1783ac79b1f0888de786c5d12ce813126c21)) +- **router:** Add payment method-specific features to connector feature list ([#6963](https://github.com/juspay/hyperswitch/pull/6963)) ([`e35f707`](https://github.com/juspay/hyperswitch/commit/e35f7079e3fc9ada76d0602739053bdd5d595008)) +- **routing:** Integrate global success rates ([#6950](https://github.com/juspay/hyperswitch/pull/6950)) ([`39d2d6c`](https://github.com/juspay/hyperswitch/commit/39d2d6c43800f609070b61a6148ddef7e40001bc)) + +### Bug Fixes + +- **cypress:** Address cybersource redirection inconsistency ([#7057](https://github.com/juspay/hyperswitch/pull/7057)) ([`90c932a`](https://github.com/juspay/hyperswitch/commit/90c932a6d798453f7e828c55a7668c5c64c933a5)) + +### Refactors + +- Customer email and browser Information ([#7034](https://github.com/juspay/hyperswitch/pull/7034)) ([`d35a922`](https://github.com/juspay/hyperswitch/commit/d35a9222815e9259a6097eabd41cd458650cb62e)) +- Check allowed payment method types in enabled options ([#7019](https://github.com/juspay/hyperswitch/pull/7019)) ([`0eca55f`](https://github.com/juspay/hyperswitch/commit/0eca55f75392f8091a1cf8f378e8cbee9afd3eac)) + +**Full Changelog:** [`2025.01.21.0...2025.01.22.0`](https://github.com/juspay/hyperswitch/compare/2025.01.21.0...2025.01.22.0) + +- - - + +## 2025.01.21.0 + +### Refactors + +- **payment-link:** Use shouldRemoveBeforeUnloadEvents flag for handling removal of beforeunload events through SDK ([#7072](https://github.com/juspay/hyperswitch/pull/7072)) ([`776ed9a`](https://github.com/juspay/hyperswitch/commit/776ed9a2eb0e5ad8125112fe01bb3ea4b34195bc)) +- **router:** Refactor ctp flow to fetch mca_id and get the connector creds instead of connector_name ([#6859](https://github.com/juspay/hyperswitch/pull/6859)) ([`e9fcfc4`](https://github.com/juspay/hyperswitch/commit/e9fcfc4560321ea494afc9a01c06613240592371)) + +**Full Changelog:** [`2025.01.20.0...2025.01.21.0`](https://github.com/juspay/hyperswitch/compare/2025.01.20.0...2025.01.21.0) + +- - - + +## 2025.01.20.0 + +### Bug Fixes + +- **connector:** [NETCETERA] add accept-language in browser_information for netcetera authentication request ([#7059](https://github.com/juspay/hyperswitch/pull/7059)) ([`aa8e2e7`](https://github.com/juspay/hyperswitch/commit/aa8e2e73ebda3d7764c03067fe5bc9b086683dc7)) +- **relay:** Populate connector metadata in the refunds flow ([#7045](https://github.com/juspay/hyperswitch/pull/7045)) ([`e38078f`](https://github.com/juspay/hyperswitch/commit/e38078f152a4326e6ede3d91391a059af399c379)) + +### Miscellaneous Tasks + +- Update creds ([#7054](https://github.com/juspay/hyperswitch/pull/7054)) ([`37f10fb`](https://github.com/juspay/hyperswitch/commit/37f10fb5b4363244bbe133407e632cece1d9a1c6)) +- Update readme with juspay's vision, product offering, architecture diagram, setup steps and output ([#7024](https://github.com/juspay/hyperswitch/pull/7024)) ([`d01172a`](https://github.com/juspay/hyperswitch/commit/d01172a613b8e74564eef792b8a6915c647854fc)) + +**Full Changelog:** [`2025.01.17.0...2025.01.20.0`](https://github.com/juspay/hyperswitch/compare/2025.01.17.0...2025.01.20.0) + +- - - + +## 2025.01.17.0 + +### Refactors + +- **dynamic_routing:** Add info logs to log the grpc request and response ([#6962](https://github.com/juspay/hyperswitch/pull/6962)) ([`7290484`](https://github.com/juspay/hyperswitch/commit/72904842ed0092e16e2d9980e1d4968df03cafb6)) +- **redis_interface:** Make the redis command for using scripts to write into redis Generic ([#6965](https://github.com/juspay/hyperswitch/pull/6965)) ([`3434651`](https://github.com/juspay/hyperswitch/commit/343465165be0a573ec78a99be93386102a2a6615)) + +**Full Changelog:** [`2025.01.16.0...2025.01.17.0`](https://github.com/juspay/hyperswitch/compare/2025.01.16.0...2025.01.17.0) + +- - - + +## 2025.01.16.0 + +### Features + +- **connector:** [Xendit] ADD Cards & Mandates Flow ([#6966](https://github.com/juspay/hyperswitch/pull/6966)) ([`bbf8844`](https://github.com/juspay/hyperswitch/commit/bbf884460c010e6ebc5f93f6fe6ff079e2463d90)) +- **core:** Diesel models, domain models and db interface changes for callback_mapper table ([#6571](https://github.com/juspay/hyperswitch/pull/6571)) ([`043cf8e`](https://github.com/juspay/hyperswitch/commit/043cf8e0c14e1818ec8e931140f1694d10b7b837)) + +### Refactors + +- **dynamic_routing:** Perform db operations for dynamic_routing_stats table only when payments are in terminal state ([#6900](https://github.com/juspay/hyperswitch/pull/6900)) ([`1ec91e5`](https://github.com/juspay/hyperswitch/commit/1ec91e54e2420d4bed10e82ba1e3da5a1f29251a)) +- **proxy:** Specify hosts for proxy exclusion instead of complete URLs ([#6957](https://github.com/juspay/hyperswitch/pull/6957)) ([`bd1f077`](https://github.com/juspay/hyperswitch/commit/bd1f07705747ebe915ddf88cf860f2ac7c65e9b5)) + +### Miscellaneous Tasks + +- Address Rust 1.84.0 clippy lints ([#7021](https://github.com/juspay/hyperswitch/pull/7021)) ([`4664d4b`](https://github.com/juspay/hyperswitch/commit/4664d4bc4b7e685ab6dfb9176a3309026d3032e9)) + +**Full Changelog:** [`2025.01.14.0...2025.01.16.0`](https://github.com/juspay/hyperswitch/compare/2025.01.14.0...2025.01.16.0) + +- - - + +## 2025.01.14.0 + +### Features + +- **connector:** [Deutschebank] Implement Card 3ds ([#6844](https://github.com/juspay/hyperswitch/pull/6844)) ([`ac75335`](https://github.com/juspay/hyperswitch/commit/ac753352769a67003eedd183e957bee6eb83b103)) +- **payment_methods_v2:** Add payment methods list endpoint ([#6938](https://github.com/juspay/hyperswitch/pull/6938)) ([`6a1f5a8`](https://github.com/juspay/hyperswitch/commit/6a1f5a88750f0683d5e95814c349244ae9c483b0)) + +### Refactors + +- **cypress:** Verify payment status after payment redirection ([#6187](https://github.com/juspay/hyperswitch/pull/6187)) ([`1d99305`](https://github.com/juspay/hyperswitch/commit/1d993055d221eba72c81e3ba0c0b0e6a7e1313a0)) + +**Full Changelog:** [`2025.01.13.0...2025.01.14.0`](https://github.com/juspay/hyperswitch/compare/2025.01.13.0...2025.01.14.0) + +- - - + +## 2025.01.13.0 + +### Features + +- **connector:** [Novalnet] Add zero auth mandate ([#6631](https://github.com/juspay/hyperswitch/pull/6631)) ([`7b306a9`](https://github.com/juspay/hyperswitch/commit/7b306a9015a55b573731414c210d4c684c802f7a)) +- **router:** Add support for relay refund incoming webhooks ([#6974](https://github.com/juspay/hyperswitch/pull/6974)) ([`d850f17`](https://github.com/juspay/hyperswitch/commit/d850f17b87e4eedc66836925136ffbd513d09124)) + +**Full Changelog:** [`2025.01.10.0...2025.01.13.0`](https://github.com/juspay/hyperswitch/compare/2025.01.10.0...2025.01.13.0) + +- - - + +## 2025.01.10.0 + +### Testing + +- **cypress:** Add test for In Memory Cache ([#6961](https://github.com/juspay/hyperswitch/pull/6961)) ([`d8d8c40`](https://github.com/juspay/hyperswitch/commit/d8d8c400bbda49b9a0cd5edbe37e929ae6d38eb4)) + +**Full Changelog:** [`2025.01.09.1...2025.01.10.0`](https://github.com/juspay/hyperswitch/compare/2025.01.09.1...2025.01.10.0) + +- - - + +## 2025.01.09.1 + +### Bug Fixes + +- **dummyconnector:** Add tenant id in dummyconnector requests ([#7008](https://github.com/juspay/hyperswitch/pull/7008)) ([`9c983b6`](https://github.com/juspay/hyperswitch/commit/9c983b68bd834e33c5c57d1d050aa5d41cb10f56)) + +**Full Changelog:** [`2025.01.09.0...2025.01.09.1`](https://github.com/juspay/hyperswitch/compare/2025.01.09.0...2025.01.09.1) + +- - - + +## 2025.01.09.0 + +### Features + +- **users:** Handle edge features for users in tenancy ([#6990](https://github.com/juspay/hyperswitch/pull/6990)) ([`d04e840`](https://github.com/juspay/hyperswitch/commit/d04e840c958595d86590149d92b03cbd61fd69ed)) + +### Bug Fixes + +- **cypress:** Backup and restore sessions when using user apis ([#6978](https://github.com/juspay/hyperswitch/pull/6978)) ([`0b54b37`](https://github.com/juspay/hyperswitch/commit/0b54b375ef42bc46830871db6d0f7b68e386c3f5)) + +### Miscellaneous Tasks + +- **dynamic-fields:** [Worldpay] update dynamic fields for payments ([#7002](https://github.com/juspay/hyperswitch/pull/7002)) ([`b46a921`](https://github.com/juspay/hyperswitch/commit/b46a921ccb05dc194253659c12991d9df7abe71e)) + +**Full Changelog:** [`2025.01.08.0...2025.01.09.0`](https://github.com/juspay/hyperswitch/compare/2025.01.08.0...2025.01.09.0) + +- - - + +## 2025.01.08.0 + +### Features + +- **connector:** [Fiuu] Consume transaction id for error cases for Fiuu ([#6998](https://github.com/juspay/hyperswitch/pull/6998)) ([`6b1e5b0`](https://github.com/juspay/hyperswitch/commit/6b1e5b0aec190b9563df83703efee9cbeaee59fd)) +- **core:** Add columns unified error code and error message in refund table ([#6933](https://github.com/juspay/hyperswitch/pull/6933)) ([`c4d36b5`](https://github.com/juspay/hyperswitch/commit/c4d36b506e159f39acff17e13f72b5c53edec184)) + +### Bug Fixes + +- Consider status of payment method before filtering wallets in list pm ([#7004](https://github.com/juspay/hyperswitch/pull/7004)) ([`d2212cb`](https://github.com/juspay/hyperswitch/commit/d2212cb7eafa37c00ce3a8897a6ae4f1266f01cf)) + +### Documentation + +- **cypress:** Update cypress documentation ([#6956](https://github.com/juspay/hyperswitch/pull/6956)) ([`099bd99`](https://github.com/juspay/hyperswitch/commit/099bd995851a3aa9688f5e160a744c6924f8ec7a)) + +**Full Changelog:** [`2025.01.07.0...2025.01.08.0`](https://github.com/juspay/hyperswitch/compare/2025.01.07.0...2025.01.08.0) + +- - - + +## 2025.01.07.0 + +### Miscellaneous Tasks + +- **keymanager:** Add tenant-id to keymanager requests ([#6968](https://github.com/juspay/hyperswitch/pull/6968)) ([`7901302`](https://github.com/juspay/hyperswitch/commit/79013024ff371efc6062310564b8b56e9bb22701)) + +**Full Changelog:** [`2025.01.06.0...2025.01.07.0`](https://github.com/juspay/hyperswitch/compare/2025.01.06.0...2025.01.07.0) + +- - - + ## 2025.01.06.0 ### Miscellaneous Tasks diff --git a/Cargo.lock b/Cargo.lock index e34c80bd92..7583fb2eee 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4003,6 +4003,7 @@ dependencies = [ "hyperswitch_domain_models", "hyperswitch_interfaces", "image", + "josekit", "lazy_static", "masking", "mime", @@ -9266,9 +9267,9 @@ checksum = "b8dad83b4f25e74f184f64c43b150b91efe7647395b42289f38e50566d82855b" [[package]] name = "wasm-bindgen" -version = "0.2.93" +version = "0.2.99" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a82edfc16a6c469f5f44dc7b571814045d60404b55a0ee849f9bcfa2e63dd9b5" +checksum = "a474f6281d1d70c17ae7aa6a613c87fce69a127e2624002df63dcb39d6cf6396" dependencies = [ "cfg-if 1.0.0", "once_cell", @@ -9277,13 +9278,12 @@ dependencies = [ [[package]] name = "wasm-bindgen-backend" -version = "0.2.93" +version = "0.2.99" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9de396da306523044d3302746f1208fa71d7532227f15e347e2d93e4145dd77b" +checksum = "5f89bb38646b4f81674e8f5c3fb81b562be1fd936d84320f3264486418519c79" dependencies = [ "bumpalo", "log", - "once_cell", "proc-macro2", "quote", "syn 2.0.77", @@ -9304,9 +9304,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro" -version = "0.2.93" +version = "0.2.99" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "585c4c91a46b072c92e908d99cb1dcdf95c5218eeb6f3bf1efa991ee7a68cccf" +checksum = "2cc6181fd9a7492eef6fef1f33961e3695e4579b9872a6f7c83aee556666d4fe" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -9314,9 +9314,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.93" +version = "0.2.99" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "afc340c74d9005395cf9dd098506f7f44e38f2b4a21c6aaacf9a105ea5e1e836" +checksum = "30d7a95b763d3c45903ed6c81f156801839e5ee968bb07e534c44df0fcd330c2" dependencies = [ "proc-macro2", "quote", @@ -9327,9 +9327,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-shared" -version = "0.2.93" +version = "0.2.99" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c62a0a307cb4a311d3a07867860911ca130c3494e8c2719593806c08bc5d0484" +checksum = "943aab3fdaaa029a6e0271b35ea10b72b943135afe9bffca82384098ad0e06a6" [[package]] name = "web-sys" diff --git a/README.md b/README.md index 10fdb6afc7..5b5518d31f 100644 --- a/README.md +++ b/README.md @@ -3,22 +3,11 @@
-
- Try a Payment •
- Quick Setup •
- Local Setup Guide (Hyperswitch App Server) •
- API Docs
-
- Community and Contributions •
- Bugs and feature requests •
- Versioning •
- Copyright and License
-
@@ -30,6 +19,10 @@ The single API to access payment ecosystems across 130+ countries + +
@@ -45,28 +38,46 @@ The single API to access payment ecosystems across 130+ countries
-Hyperswitch is a community-led, open payments switch designed to empower digital businesses by providing fast, reliable, and affordable access to the best payments infrastructure.
+## Table of Contents
-Here are the components of Hyperswitch that deliver the whole solution:
+1. [Introduction](#introduction)
+2. [Architectural Overview](#architectural-overview)
+3. [Try Hyperswitch](#try-hyperswitch)
+4. [Support, Feature requests & Bugs](#support-feature-requests)
+5. [Our Vision](#our-vision)
+6. [Versioning](#versioning)
+7. [Copyright and License](#copyright-and-license)
-* [Hyperswitch Backend](https://github.com/juspay/hyperswitch): Powering Payment Processing
+
+ Introduction
+
+Juspay, founded in 2012, is a global leader in payment orchestration and checkout solutions, trusted by 400+ leading enterprises and brands worldwide. Hyperswitch is Juspay's new generation of composable, commercial open-source payments platform for merchant and brands. It is an enterprise-grade, transparent and modular payments platform designed to provide digital businesses access to the best payments infrastructure.
-* [SDK (Frontend)](https://github.com/juspay/hyperswitch-web): Simplifying Integration and Powering the UI
+Here are the key components of Hyperswitch that deliver the whole solution:
-* [Control Centre](https://github.com/juspay/hyperswitch-control-center): Managing Operations with Ease
+* [Hyperswitch Backend](https://github.com/juspay/hyperswitch): Hyperswitch backend enables seamless payment processing with comprehensive support for various payment flows - authorization, authentication, void and capture workflows along with robust management of post-payment processes like refunds and chargeback handling. Additionally, Hyperswitch supports non-payment use cases by enabling connections with external FRM or authentication providers as part of the payment flow. The backend optimizes payment routing with customizable workflows, including success rate-based routing, rule-based routing, volume distribution, fallback handling, and intelligent retry mechanisms for failed payments based on specific error codes.
-Jump in and contribute to these repositories to help improve and expand Hyperswitch!
+* [SDK (Frontend)](https://github.com/juspay/hyperswitch-web): The SDK, available for web, [Android, and iOS](https://github.com/juspay/hyperswitch-client-core), unifies the payment experience across various methods such as cards, wallets, BNPL, bank transfers, and more, while supporting the diverse payment flows of underlying PSPs. When paired with the locker, it surfaces the user's saved payment methods.
-
+* [Control Center](https://github.com/juspay/hyperswitch-control-center): The Control Center enables users to manage the entire payments stack without any coding. It allows the creation of workflows for routing, payment retries, and defining conditions to invoke 3DS, fraud risk management (FRM), and surcharge modules. The Control Center provides access to transaction, refund, and chargeback operations across all integrated PSPs, transaction-level logs for initial debugging, and detailed analytics and insights into payment performance.
+
+Read more at [Hyperswitch docs](https://docs.hyperswitch.io/).
+
+
+ Architectural Overview
+
+
+
+
-
- ⚡️ Quick Setup
+
+ Try Hyperswitch
-### Docker Compose
+### 1. Local Setup
-You can run Hyperswitch on your system using Docker Compose after cloning this repository:
+You can run Hyperswitch on your system using Docker compose after cloning this repository.
```shell
git clone --depth 1 --branch latest https://github.com/juspay/hyperswitch
@@ -74,23 +85,49 @@ cd hyperswitch
docker compose up -d
```
-This will start the app server, web client/SDK and control center.
-
-Check out the [local setup guide][local-setup-guide] for a more comprehensive
-setup, which includes the [scheduler and monitoring services][docker-compose-scheduler-monitoring].
+Check out the [local setup guide][local-setup-guide] for a more details on setting up the entire stack or component wise. This takes 15-mins and gives the following output
+```shell
+[+] Running 2/2
+✔ hyperswitch-control-center Pulled 2.9s
+✔ hyperswitch-server Pulled 3.0s
+[+] Running 6/0
+
+✔ Container hyperswitch-pg-1 Created 0.0s
+✔ Container hyperswitch-redis-standalone-1 Created 0.0s
+✔ Container hyperswitch-migration_runner-1 Created 0.0s
+✔ Container hyperswitch-hyperswitch-server-1 Created 0.0s
+✔ Container hyperswitch-hyperswitch-web-1 Created 0.0s
+✔ Container hyperswitch-hyperswitch-control-center-1 Created 0.0s
+
+Attaching to hyperswitch-control-center-1, hyperswitch-server-1, hyperswitch-web-1, migration_runner-1, pg-1, redis-standalone-1
+```
-### One-click deployment on AWS cloud
+### 2. Deployment on cloud
-The fastest and easiest way to try Hyperswitch is via our CDK scripts
+The fastest and easiest way to try Hyperswitch on AWS is via our CDK scripts
1. Click on the following button for a quick standalone deployment on AWS, suitable for prototyping.
No code or setup is required in your system and the deployment is covered within the AWS free-tier setup.
-
+
2. Sign-in to your AWS console.
-3. Follow the instructions provided on the console to successfully deploy Hyperswitch
+3. Follow the instructions provided on the console to successfully deploy Hyperswitch. This takes 30-45mins and gives the following output
+
+| Service| Host|
+|----------------------------------------------|----------------------------------------------|
+| App server running on | `http://hyperswitch-⚡️ Try a Payment
-
-
-To quickly experience the ease of Hyperswitch, sign up on the [Hyperswitch Control Center](https://app.hyperswitch.io/) and try a payment. Once you've completed your first transaction, you’ve successfully made your first payment with Hyperswitch!
-
- ✅ Community & Contributions
+
+ Support, Feature requests & Bugs
-The community and core team are available in [GitHub Discussions](https://github.com/juspay/hyperswitch/discussions), where you can ask for support, discuss roadmap, and share ideas.
+For any support, join the conversation in [Slack](https://join.slack.com/t/hyperswitch-io/shared_invite/zt-2jqxmpsbm-WXUENx022HjNEy~Ark7Orw)
-Our [Contribution Guide](https://github.com/juspay/hyperswitch/blob/main/docs/CONTRIBUTING.md) describes how to contribute to the codebase and Docs.
+For new product features, enhancements, roadmap discussions, or to share queries and ideas, visit our [GitHub Discussions](https://github.com/juspay/hyperswitch/discussions)
-Join our Conversation in [Slack](https://join.slack.com/t/hyperswitch-io/shared_invite/zt-2jqxmpsbm-WXUENx022HjNEy~Ark7Orw), [Discord](https://discord.gg/wJZ7DVW8mm), [Twitter](https://x.com/hyperswitchio)
+For reporting a bug, please read the issue guidelines and search for [existing and closed issues]. If your problem or idea is not addressed yet, please [open a new issue].
+[existing and closed issues]: https://github.com/juspay/hyperswitch/issues
+[open a new issue]: https://github.com/juspay/hyperswitch/issues/new/choose
-
- 💪 Join us in building Hyperswitch
+
+ Our Vision
-### 🤝 Our Belief
+> Linux for Payments
-> Payments should be open, fast, reliable and affordable to serve
-> the billions of people at scale.
+Payments are evolving rapidly worldwide, with hundreds of processors, fraud detection systems, authentication modules, and new payment methods and flows emerging. Businesses building or managing their own payment stacks often face similar challenges, struggle with comparable issues, and find it hard to innovate at the desired pace.
-Globally payment diversity has been growing at a rapid pace.
-There are hundreds of payment processors and new payment methods like BNPL,
-RTP etc.
-Businesses need to embrace this diversity to increase conversion, reduce cost
-and improve control.
-But integrating and maintaining multiple processors needs a lot of dev effort.
-Why should devs across companies repeat the same work?
-Why can't it be unified and reused? Hence, Hyperswitch was born to create that
-reusable core and let companies build and customise it as per their specific requirements.
+Hyperswitch serves as a well-architected designed reference platform, built on best-in-class design principles, empowering businesses to own and customize their payment stack. It provides a reusable core payments stack that can be tailored to specific requirements while relying on the Hyperswitch team for enhancements, support, and continuous innovation.
-### ✨ Our Values
+### Our Values
1. Embrace Payments Diversity: It will drive innovation in the ecosystem in
multiple ways.
@@ -150,33 +175,24 @@ reusable core and let companies build and customise it as per their specific req
This project is being created and maintained by [Juspay](https://juspay.io)
-
- 🐞 Bugs and feature requests
-
-
-Please read the issue guidelines and search for [existing and closed issues].
-If your problem or idea is not addressed yet, please [open a new issue].
-
-[existing and closed issues]: https://github.com/juspay/hyperswitch/issues
-[open a new issue]: https://github.com/juspay/hyperswitch/issues/new/choose
-
-
- 🔖 Versioning
+
+ Versioning
Check the [CHANGELOG.md](./CHANGELOG.md) file for details.
-
- ©️ Copyright and License
+
+ Copyright and License
This product is licensed under the [Apache 2.0 License](LICENSE).
-
- ✨ Thanks to all contributors
+
+
+ Team behind Hyperswitch
-Thank you for your support in hyperswitch's growth. Keep up the great work! 🥂
+The core team of 150+ engineers building Hyperswitch. Keep up the great work! 🥂
diff --git a/api-reference-v2/api-reference/payment-methods/payment-method--payment-methods-list.mdx b/api-reference-v2/api-reference/payment-methods/payment-method--payment-methods-list.mdx
new file mode 100644
index 0000000000..13eb3b58aa
--- /dev/null
+++ b/api-reference-v2/api-reference/payment-methods/payment-method--payment-methods-list.mdx
@@ -0,0 +1,3 @@
+---
+openapi: get /v2/payment-methods/{id}/list-enabled-payment-methods
+---
diff --git a/api-reference-v2/mint.json b/api-reference-v2/mint.json
index 080adae5ad..d47cf7aee6 100644
--- a/api-reference-v2/mint.json
+++ b/api-reference-v2/mint.json
@@ -49,13 +49,12 @@
"group": "Payment Methods",
"pages": [
"api-reference/payment-methods/payment-method--create",
- "api-reference/payment-methods/payment-method--retrieve",
- "api-reference/payment-methods/payment-method--update",
- "api-reference/payment-methods/payment-method--delete",
"api-reference/payment-methods/payment-method--create-intent",
+ "api-reference/payment-methods/payment-method--payment-methods-list",
"api-reference/payment-methods/payment-method--confirm-intent",
- "api-reference/payment-methods/list-customer-saved-payment-methods-for-a-payment",
- "api-reference/payment-methods/list-payment-methods-for-a-customer"
+ "api-reference/payment-methods/payment-method--update",
+ "api-reference/payment-methods/payment-method--retrieve",
+ "api-reference/payment-methods/payment-method--delete"
]
},
{
diff --git a/api-reference-v2/openapi_spec.json b/api-reference-v2/openapi_spec.json
index f1caede89c..892931256b 100644
--- a/api-reference-v2/openapi_spec.json
+++ b/api-reference-v2/openapi_spec.json
@@ -2190,62 +2190,19 @@
]
}
},
- "/v2/payments/{id}/saved-payment-methods": {
- "get": {
- "tags": [
- "Payment Methods"
- ],
- "summary": "List customer saved payment methods for a payment",
- "description": "To filter and list the applicable payment methods for a particular Customer ID, is to be associated with a payment",
- "operationId": "List all Payment Methods for a Customer",
- "requestBody": {
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/PaymentMethodListRequest"
- }
- }
- },
- "required": true
- },
- "responses": {
- "200": {
- "description": "Payment Methods retrieved for customer tied to its respective client-secret passed in the param",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/CustomerPaymentMethodsListResponse"
- }
- }
- }
- },
- "400": {
- "description": "Invalid Data"
- },
- "404": {
- "description": "Payment Methods does not exist in records"
- }
- },
- "security": [
- {
- "publishable_key": []
- }
- ]
- }
- },
- "/v2/customers/{id}/saved-payment-methods": {
- "get": {
+ "/v2/payment-methods": {
+ "post": {
"tags": [
"Payment Methods"
],
- "summary": "List saved payment methods for a Customer",
- "description": "To filter and list the applicable payment methods for a particular Customer ID, to be used in a non-payments context",
- "operationId": "List all Payment Methods for a Customer",
+ "summary": "Payment Method - Create",
+ "description": "Creates and stores a payment method against a customer. In case of cards, this API should be used only by PCI compliant merchants.",
+ "operationId": "Create Payment Method",
"requestBody": {
"content": {
"application/json": {
"schema": {
- "$ref": "#/components/schemas/PaymentMethodListRequest"
+ "$ref": "#/components/schemas/PaymentMethodCreate"
}
}
},
@@ -2253,20 +2210,17 @@
},
"responses": {
"200": {
- "description": "Payment Methods retrieved",
+ "description": "Payment Method Created",
"content": {
"application/json": {
"schema": {
- "$ref": "#/components/schemas/CustomerPaymentMethodsListResponse"
+ "$ref": "#/components/schemas/PaymentMethodResponse"
}
}
}
},
"400": {
"description": "Invalid Data"
- },
- "404": {
- "description": "Payment Methods does not exist in records"
}
},
"security": [
@@ -2276,19 +2230,19 @@
]
}
},
- "/v2/payment-methods": {
+ "/v2/payment-methods/create-intent": {
"post": {
"tags": [
"Payment Methods"
],
- "summary": "Payment Method - Create",
- "description": "Creates and stores a payment method against a customer. In case of cards, this API should be used only by PCI compliant merchants.",
- "operationId": "Create Payment Method",
+ "summary": "Payment Method - Create Intent",
+ "description": "Creates a payment method for customer with billing information and other metadata.",
+ "operationId": "Create Payment Method Intent",
"requestBody": {
"content": {
"application/json": {
"schema": {
- "$ref": "#/components/schemas/PaymentMethodCreate"
+ "$ref": "#/components/schemas/PaymentMethodIntentCreate"
}
}
},
@@ -2296,7 +2250,7 @@
},
"responses": {
"200": {
- "description": "Payment Method Created",
+ "description": "Payment Method Intent Created",
"content": {
"application/json": {
"schema": {
@@ -2316,42 +2270,56 @@
]
}
},
- "/v2/payment-methods/create-intent": {
- "post": {
+ "/v2/payment-methods/{id}/list-enabled-payment-methods": {
+ "get": {
"tags": [
"Payment Methods"
],
- "summary": "Payment Method - Create Intent",
- "description": "Creates a payment method for customer with billing information and other metadata.",
- "operationId": "Create Payment Method Intent",
- "requestBody": {
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/PaymentMethodIntentCreate"
- }
+ "summary": "Payment Methods - Payment Methods List",
+ "description": "List the payment methods eligible for a payment method.",
+ "operationId": "List Payment methods for a Payment Method Intent",
+ "parameters": [
+ {
+ "name": "id",
+ "in": "path",
+ "description": "The global payment method id",
+ "required": true,
+ "schema": {
+ "type": "string"
}
},
- "required": true
- },
+ {
+ "name": "X-Profile-Id",
+ "in": "header",
+ "description": "Profile ID associated to the payment method intent",
+ "required": true,
+ "schema": {
+ "type": "string"
+ },
+ "example": {
+ "X-Profile-Id": "pro_abcdefghijklmnop"
+ }
+ }
+ ],
"responses": {
"200": {
- "description": "Payment Method Intent Created",
+ "description": "Get the payment methods",
"content": {
"application/json": {
"schema": {
- "$ref": "#/components/schemas/PaymentMethodResponse"
+ "$ref": "#/components/schemas/PaymentMethodListResponseForPayments"
}
}
}
},
- "400": {
- "description": "Invalid Data"
+ "404": {
+ "description": "No payment method found with the given id"
}
},
"security": [
{
- "api_key": []
+ "api_key": [],
+ "ephemeral_key": []
}
]
}
@@ -6425,6 +6393,29 @@
}
}
},
+ "CardSpecificFeatures": {
+ "type": "object",
+ "required": [
+ "three_ds",
+ "non_three_ds",
+ "supported_card_networks"
+ ],
+ "properties": {
+ "three_ds": {
+ "$ref": "#/components/schemas/FeatureStatus"
+ },
+ "non_three_ds": {
+ "$ref": "#/components/schemas/FeatureStatus"
+ },
+ "supported_card_networks": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/CardNetwork"
+ },
+ "description": "List of supported card networks"
+ }
+ }
+ },
"CardToken": {
"type": "object",
"required": [
@@ -6612,7 +6603,6 @@
},
"Connector": {
"type": "string",
- "description": "A connector is an integration to fulfill payments",
"enum": [
"adyenplatform",
"phonypay",
@@ -6696,6 +6686,7 @@
"signifyd",
"plaid",
"riskified",
+ "xendit",
"zen",
"zsl"
]
@@ -7461,39 +7452,6 @@
},
"additionalProperties": false
},
- "CustomerDefaultPaymentMethodResponse": {
- "type": "object",
- "required": [
- "customer_id",
- "payment_method"
- ],
- "properties": {
- "default_payment_method_id": {
- "type": "string",
- "description": "The unique identifier of the Payment method",
- "example": "card_rGK4Vi5iSW70MY7J2mIg",
- "nullable": true
- },
- "customer_id": {
- "type": "string",
- "description": "The unique identifier of the customer.",
- "example": "cus_y3oqhf46pyzuxjbcn2giaqnb44",
- "maxLength": 64,
- "minLength": 1
- },
- "payment_method": {
- "$ref": "#/components/schemas/PaymentMethod"
- },
- "payment_method_type": {
- "allOf": [
- {
- "$ref": "#/components/schemas/PaymentMethodType"
- }
- ],
- "nullable": true
- }
- }
- },
"CustomerDeleteResponse": {
"type": "object",
"required": [
@@ -7994,24 +7952,6 @@
"frictionless"
]
},
- "DefaultPaymentMethod": {
- "type": "object",
- "required": [
- "customer_id",
- "payment_method_id"
- ],
- "properties": {
- "customer_id": {
- "type": "string",
- "example": "cus_y3oqhf46pyzuxjbcn2giaqnb44",
- "maxLength": 64,
- "minLength": 1
- },
- "payment_method_id": {
- "type": "string"
- }
- }
- },
"DeviceChannel": {
"type": "string",
"description": "Device Channel indicating whether request is coming from App or Browser",
@@ -13896,13 +13836,13 @@
"PaymentMethodDeleteResponse": {
"type": "object",
"required": [
- "payment_method_id"
+ "id"
],
"properties": {
- "payment_method_id": {
+ "id": {
"type": "string",
"description": "The unique identifier of the Payment method",
- "example": "card_rGK4Vi5iSW70MY7J2mIg"
+ "example": "12345_pm_01926c58bc6e77c09e809964e72af8c8"
}
}
},
@@ -14079,67 +14019,15 @@
"PaymentMethodListResponse": {
"type": "object",
"required": [
- "currency",
- "payment_methods",
- "mandate_payment",
- "show_surcharge_breakup_screen",
- "request_external_three_ds_authentication",
- "is_tax_calculation_enabled"
+ "payment_methods_enabled"
],
"properties": {
- "redirect_url": {
- "type": "string",
- "description": "Redirect URL of the merchant",
- "example": "https://www.google.com",
- "nullable": true
- },
- "currency": {
- "$ref": "#/components/schemas/Currency"
- },
- "payment_methods": {
+ "payment_methods_enabled": {
"type": "array",
"items": {
- "$ref": "#/components/schemas/ResponsePaymentMethodsEnabled"
+ "$ref": "#/components/schemas/ResponsePaymentMethodTypes"
},
- "description": "Information about the payment method"
- },
- "mandate_payment": {
- "$ref": "#/components/schemas/MandateType"
- },
- "merchant_name": {
- "type": "string",
- "nullable": true
- },
- "show_surcharge_breakup_screen": {
- "type": "boolean",
- "description": "flag to indicate if surcharge and tax breakup screen should be shown or not"
- },
- "payment_type": {
- "allOf": [
- {
- "$ref": "#/components/schemas/PaymentType"
- }
- ],
- "nullable": true
- },
- "request_external_three_ds_authentication": {
- "type": "boolean",
- "description": "flag to indicate whether to perform external 3ds authentication",
- "example": true
- },
- "collect_shipping_details_from_wallets": {
- "type": "boolean",
- "description": "flag that indicates whether to collect shipping details from wallets or from the customer",
- "nullable": true
- },
- "collect_billing_details_from_wallets": {
- "type": "boolean",
- "description": "flag that indicates whether to collect billing details from wallets or from the customer",
- "nullable": true
- },
- "is_tax_calculation_enabled": {
- "type": "boolean",
- "description": "flag that indicates whether to calculate tax on the order amount"
+ "description": "The list of payment methods that are enabled for the business profile"
}
}
},
@@ -14152,7 +14040,7 @@
"payment_methods_enabled": {
"type": "array",
"items": {
- "$ref": "#/components/schemas/ResponsePaymentMethodTypes"
+ "$ref": "#/components/schemas/ResponsePaymentMethodTypesForPayments"
},
"description": "The list of payment methods that are enabled for the business profile"
},
@@ -14169,13 +14057,18 @@
"PaymentMethodResponse": {
"type": "object",
"required": [
+ "id",
"merchant_id",
"customer_id",
- "payment_method_id",
"payment_method_type",
"recurring_enabled"
],
"properties": {
+ "id": {
+ "type": "string",
+ "description": "The unique identifier of the Payment method",
+ "example": "12345_pm_01926c58bc6e77c09e809964e72af8c8"
+ },
"merchant_id": {
"type": "string",
"description": "Unique identifier for a merchant",
@@ -14188,11 +14081,6 @@
"maxLength": 64,
"minLength": 32
},
- "payment_method_id": {
- "type": "string",
- "description": "The unique identifier of the Payment method",
- "example": "card_rGK4Vi5iSW70MY7J2mIg"
- },
"payment_method_type": {
"$ref": "#/components/schemas/PaymentMethod"
},
@@ -14252,6 +14140,13 @@
}
]
},
+ "PaymentMethodSpecificFeatures": {
+ "oneOf": [
+ {
+ "$ref": "#/components/schemas/CardSpecificFeatures"
+ }
+ ]
+ },
"PaymentMethodStatus": {
"type": "string",
"description": "Payment Method Status",
@@ -14266,6 +14161,7 @@
"oneOf": [
{
"type": "object",
+ "title": "card",
"required": [
"card_networks"
],
@@ -14280,6 +14176,7 @@
},
{
"type": "object",
+ "title": "bank",
"required": [
"bank_names"
],
@@ -19194,21 +19091,56 @@
"type": "object",
"required": [
"payment_method_type",
- "payment_method_subtype"
+ "payment_method_subtype",
+ "required_fields"
],
"properties": {
"payment_method_type": {
- "$ref": "#/components/schemas/PaymentMethodType"
+ "$ref": "#/components/schemas/PaymentMethod"
},
"payment_method_subtype": {
"$ref": "#/components/schemas/PaymentMethodType"
},
"required_fields": {
- "type": "object",
- "description": "Required fields for the payment_method_type.\nThis is the union of all the required fields for the payment method type enabled in all the connectors.",
- "additionalProperties": {
+ "type": "array",
+ "items": {
"$ref": "#/components/schemas/RequiredFieldInfo"
},
+ "description": "Required fields for the payment_method_type.\nThis is the union of all the required fields for the payment method type enabled in all the connectors."
+ }
+ }
+ }
+ ]
+ },
+ "ResponsePaymentMethodTypesForPayments": {
+ "allOf": [
+ {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/PaymentMethodSubtypeSpecificData"
+ }
+ ],
+ "nullable": true
+ },
+ {
+ "type": "object",
+ "required": [
+ "payment_method_type",
+ "payment_method_subtype"
+ ],
+ "properties": {
+ "payment_method_type": {
+ "$ref": "#/components/schemas/PaymentMethod"
+ },
+ "payment_method_subtype": {
+ "$ref": "#/components/schemas/PaymentMethodType"
+ },
+ "required_fields": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/RequiredFieldInfo"
+ }
+ ],
"nullable": true
},
"surcharge_details": {
@@ -19441,7 +19373,7 @@
},
"RoutableConnectors": {
"type": "string",
- "description": "Connectors eligible for payments routing",
+ "description": "RoutableConnectors are the subset of Connectors that are eligible for payments routing",
"enum": [
"adyenplatform",
"phonypay",
@@ -20678,50 +20610,62 @@
"additionalProperties": false
},
"SupportedPaymentMethod": {
- "type": "object",
- "required": [
- "payment_method",
- "payment_method_type",
- "mandates",
- "refunds",
- "supported_capture_methods"
- ],
- "properties": {
- "payment_method": {
- "$ref": "#/components/schemas/PaymentMethod"
- },
- "payment_method_type": {
- "$ref": "#/components/schemas/PaymentMethodType"
- },
- "mandates": {
- "$ref": "#/components/schemas/FeatureStatus"
- },
- "refunds": {
- "$ref": "#/components/schemas/FeatureStatus"
- },
- "supported_capture_methods": {
- "type": "array",
- "items": {
- "$ref": "#/components/schemas/CaptureMethod"
- }
- },
- "supported_countries": {
- "type": "array",
- "items": {
- "$ref": "#/components/schemas/CountryAlpha2"
- },
- "uniqueItems": true,
+ "allOf": [
+ {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/PaymentMethodSpecificFeatures"
+ }
+ ],
"nullable": true
},
- "supported_currencies": {
- "type": "array",
- "items": {
- "$ref": "#/components/schemas/Currency"
- },
- "uniqueItems": true,
- "nullable": true
+ {
+ "type": "object",
+ "required": [
+ "payment_method",
+ "payment_method_type",
+ "mandates",
+ "refunds",
+ "supported_capture_methods"
+ ],
+ "properties": {
+ "payment_method": {
+ "$ref": "#/components/schemas/PaymentMethod"
+ },
+ "payment_method_type": {
+ "$ref": "#/components/schemas/PaymentMethodType"
+ },
+ "mandates": {
+ "$ref": "#/components/schemas/FeatureStatus"
+ },
+ "refunds": {
+ "$ref": "#/components/schemas/FeatureStatus"
+ },
+ "supported_capture_methods": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/CaptureMethod"
+ }
+ },
+ "supported_countries": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/CountryAlpha2"
+ },
+ "uniqueItems": true,
+ "nullable": true
+ },
+ "supported_currencies": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/Currency"
+ },
+ "uniqueItems": true,
+ "nullable": true
+ }
+ }
}
- }
+ ]
},
"SurchargeCalculationOverride": {
"type": "string",
diff --git a/api-reference/mint.json b/api-reference/mint.json
index 5e9c9c6d36..1130da2ffb 100644
--- a/api-reference/mint.json
+++ b/api-reference/mint.json
@@ -253,5 +253,15 @@
"openapi": ["openapi_spec.json", "rust_locker_open_api_spec.yml"],
"api": {
"maintainOrder": true
+ },
+ "analytics": {
+ "gtm": {
+ "tagId": "GTM-PLBNKQFQ"
+ }
+ },
+ "analytics": {
+ "mixpanel": {
+ "projectToken": "b00355f29d9548d1333608df71d5d53d"
+ }
}
}
diff --git a/api-reference/openapi_spec.json b/api-reference/openapi_spec.json
index df7e96431d..d218e4d207 100644
--- a/api-reference/openapi_spec.json
+++ b/api-reference/openapi_spec.json
@@ -9053,6 +9053,29 @@
}
}
},
+ "CardSpecificFeatures": {
+ "type": "object",
+ "required": [
+ "three_ds",
+ "non_three_ds",
+ "supported_card_networks"
+ ],
+ "properties": {
+ "three_ds": {
+ "$ref": "#/components/schemas/FeatureStatus"
+ },
+ "non_three_ds": {
+ "$ref": "#/components/schemas/FeatureStatus"
+ },
+ "supported_card_networks": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/CardNetwork"
+ },
+ "description": "List of supported card networks"
+ }
+ }
+ },
"CardToken": {
"type": "object",
"required": [
@@ -9233,7 +9256,6 @@
},
"Connector": {
"type": "string",
- "description": "A connector is an integration to fulfill payments",
"enum": [
"adyenplatform",
"phonypay",
@@ -9317,6 +9339,7 @@
"signifyd",
"plaid",
"riskified",
+ "xendit",
"zen",
"zsl"
]
@@ -17190,6 +17213,13 @@
}
}
},
+ "PaymentMethodSpecificFeatures": {
+ "oneOf": [
+ {
+ "$ref": "#/components/schemas/CardSpecificFeatures"
+ }
+ ]
+ },
"PaymentMethodStatus": {
"type": "string",
"description": "Payment Method Status",
@@ -23241,6 +23271,16 @@
"description": "The code for the error",
"nullable": true
},
+ "unified_code": {
+ "type": "string",
+ "description": "Error code unified across the connectors is received here if there was an error while calling connector",
+ "nullable": true
+ },
+ "unified_message": {
+ "type": "string",
+ "description": "Error message unified across the connectors is received here if there was an error while calling connector",
+ "nullable": true
+ },
"created_at": {
"type": "string",
"format": "date-time",
@@ -23888,7 +23928,7 @@
},
"RoutableConnectors": {
"type": "string",
- "description": "Connectors eligible for payments routing",
+ "description": "RoutableConnectors are the subset of Connectors that are eligible for payments routing",
"enum": [
"adyenplatform",
"phonypay",
@@ -25162,54 +25202,76 @@
}
],
"nullable": true
+ },
+ "specificity_level": {
+ "$ref": "#/components/schemas/SuccessRateSpecificityLevel"
}
}
},
+ "SuccessRateSpecificityLevel": {
+ "type": "string",
+ "enum": [
+ "merchant",
+ "global"
+ ]
+ },
"SupportedPaymentMethod": {
- "type": "object",
- "required": [
- "payment_method",
- "payment_method_type",
- "mandates",
- "refunds",
- "supported_capture_methods"
- ],
- "properties": {
- "payment_method": {
- "$ref": "#/components/schemas/PaymentMethod"
- },
- "payment_method_type": {
- "$ref": "#/components/schemas/PaymentMethodType"
- },
- "mandates": {
- "$ref": "#/components/schemas/FeatureStatus"
- },
- "refunds": {
- "$ref": "#/components/schemas/FeatureStatus"
- },
- "supported_capture_methods": {
- "type": "array",
- "items": {
- "$ref": "#/components/schemas/CaptureMethod"
- }
- },
- "supported_countries": {
- "type": "array",
- "items": {
- "$ref": "#/components/schemas/CountryAlpha2"
- },
- "uniqueItems": true,
+ "allOf": [
+ {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/PaymentMethodSpecificFeatures"
+ }
+ ],
"nullable": true
},
- "supported_currencies": {
- "type": "array",
- "items": {
- "$ref": "#/components/schemas/Currency"
- },
- "uniqueItems": true,
- "nullable": true
+ {
+ "type": "object",
+ "required": [
+ "payment_method",
+ "payment_method_type",
+ "mandates",
+ "refunds",
+ "supported_capture_methods"
+ ],
+ "properties": {
+ "payment_method": {
+ "$ref": "#/components/schemas/PaymentMethod"
+ },
+ "payment_method_type": {
+ "$ref": "#/components/schemas/PaymentMethodType"
+ },
+ "mandates": {
+ "$ref": "#/components/schemas/FeatureStatus"
+ },
+ "refunds": {
+ "$ref": "#/components/schemas/FeatureStatus"
+ },
+ "supported_capture_methods": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/CaptureMethod"
+ }
+ },
+ "supported_countries": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/CountryAlpha2"
+ },
+ "uniqueItems": true,
+ "nullable": true
+ },
+ "supported_currencies": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/Currency"
+ },
+ "uniqueItems": true,
+ "nullable": true
+ }
+ }
}
- }
+ ]
},
"SurchargeDetailsResponse": {
"type": "object",
diff --git a/config/config.example.toml b/config/config.example.toml
index 9992663211..c860420da3 100644
--- a/config/config.example.toml
+++ b/config/config.example.toml
@@ -23,11 +23,10 @@ certificate = "/path/to/certificate.pem"
# Proxy server configuration for connecting to payment gateways.
# Don't define the fields if a Proxy isn't needed. Empty strings will cause failure.
[proxy]
-# http_url = "http proxy url" # Proxy all HTTP traffic via this proxy
-# https_url = "https proxy url" # Proxy all HTTPS traffic via this proxy
-idle_pool_connection_timeout = 90 # Timeout for idle pool connections (defaults to 90s)
-bypass_proxy_urls = [] # A list of URLs that should bypass the proxy
-
+# http_url = "http proxy url" # Proxy all HTTP traffic via this proxy
+# https_url = "https proxy url" # Proxy all HTTPS traffic via this proxy
+idle_pool_connection_timeout = 90 # Timeout for idle pool connections (defaults to 90s)
+bypass_proxy_hosts = "localhost, cluster.local" # A comma-separated list of domains or IP addresses that should not use the proxy. Whitespace between entries would be ignored.
# Configuration for the Key Manager Service
[key_manager]
@@ -468,8 +467,8 @@ bank_redirect.giropay = { connector_list = "adyen,globalpay" }
[mandates.update_mandate_supported]
-card.credit = { connector_list = "cybersource" } # Update Mandate supported payment method type and connector for card
-card.debit = { connector_list = "cybersource" } # Update Mandate supported payment method type and connector for card
+card.credit = { connector_list = "cybersource" } # Update Mandate supported payment method type and connector for card
+card.debit = { connector_list = "cybersource" } # Update Mandate supported payment method type and connector for card
# Required fields info used while listing the payment_method_data
[required_fields.pay_later] # payment_method = "pay_later"
@@ -762,7 +761,7 @@ sdk_eligible_payment_methods = "card"
[multitenancy]
enabled = false
-global_tenant = { schema = "public", redis_key_prefix = "", clickhouse_database = "default"}
+global_tenant = { tenant_id = "global", schema = "public", redis_key_prefix = "", clickhouse_database = "default"}
[multitenancy.tenants.public]
base_url = "http://localhost:8080" # URL of the tenant
@@ -803,7 +802,7 @@ check_token_status_url= "" # base url to check token status from token servic
connector_list = "cybersource" # Supported connectors for network tokenization
[network_transaction_id_supported_connectors]
-connector_list = "stripe,adyen,cybersource" # Supported connectors for network transaction id
+connector_list = "adyen,cybersource,novalnet,stripe,worldpay" # Supported connectors for network transaction id
[grpc_client.dynamic_routing_client] # Dynamic Routing Client Configuration
host = "localhost" # Client Host
diff --git a/config/deployments/env_specific.toml b/config/deployments/env_specific.toml
index 967b847dae..84550922d4 100644
--- a/config/deployments/env_specific.toml
+++ b/config/deployments/env_specific.toml
@@ -195,9 +195,9 @@ pm_auth_key = "pm_auth_key" # Payment method auth key used for authorization
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
+http_url = "http://proxy_http_url" # Proxy all HTTP traffic via this proxy
+https_url = "https://proxy_https_url" # Proxy all HTTPS traffic via this proxy
+bypass_proxy_hosts = "localhost, cluster.local" # A comma-separated list of domains or IP addresses that should not use the proxy. Whitespace between entries would be ignored.
# Redis credentials
[redis]
@@ -303,11 +303,11 @@ region = "kms_region" # The AWS region used by the KMS SDK for decrypting data.
[multitenancy]
enabled = false
-global_tenant = { schema = "public", redis_key_prefix = "", clickhouse_database = "default"}
+global_tenant = { tenant_id = "global", schema = "public", redis_key_prefix = "", clickhouse_database = "default"}
[multitenancy.tenants.public]
-base_url = "http://localhost:8080"
-schema = "public"
+base_url = "http://localhost:8080"
+schema = "public"
redis_key_prefix = ""
clickhouse_database = "default"
diff --git a/config/deployments/integration_test.toml b/config/deployments/integration_test.toml
index 6283382258..b6e487e5a3 100644
--- a/config/deployments/integration_test.toml
+++ b/config/deployments/integration_test.toml
@@ -191,7 +191,7 @@ card.credit = { connector_list = "cybersource" } # Update Mandate sup
card.debit = { connector_list = "cybersource" } # Update Mandate supported payment method type and connector for card
[network_transaction_id_supported_connectors]
-connector_list = "stripe,adyen,cybersource"
+connector_list = "adyen,cybersource,novalnet,stripe,worldpay"
[payouts]
diff --git a/config/deployments/sandbox.toml b/config/deployments/sandbox.toml
index fcfadb339d..7242f26367 100644
--- a/config/deployments/sandbox.toml
+++ b/config/deployments/sandbox.toml
@@ -191,7 +191,7 @@ card.credit = { connector_list = "cybersource" } # Update Mandate sup
card.debit = { connector_list = "cybersource" } # Update Mandate supported payment method type and connector for card
[network_transaction_id_supported_connectors]
-connector_list = "stripe,adyen,cybersource"
+connector_list = "adyen,cybersource,novalnet,stripe,worldpay"
[payouts]
diff --git a/config/development.toml b/config/development.toml
index 4c9b8516b5..a32102aeeb 100644
--- a/config/development.toml
+++ b/config/development.toml
@@ -229,8 +229,8 @@ elavon.base_url = "https://api.demo.convergepay.com/VirtualMerchantDemo/"
fiserv.base_url = "https://cert.api.fiservapps.com/"
fiservemea.base_url = "https://prod.emea.api.fiservapps.com/sandbox"
fiuu.base_url = "https://sandbox.merchant.razer.com/"
-fiuu.secondary_base_url="https://sandbox.merchant.razer.com/"
-fiuu.third_base_url="https://api.merchant.razer.com/"
+fiuu.secondary_base_url = "https://sandbox.merchant.razer.com/"
+fiuu.third_base_url = "https://api.merchant.razer.com/"
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/"
@@ -241,7 +241,7 @@ iatapay.base_url = "https://sandbox.iata-pay.iata.org/api/v1"
inespay.base_url = "https://apiflow.inespay.com/san/v21"
itaubank.base_url = "https://sandbox.devportal.itau.com.br/"
jpmorgan.base_url = "https://api-mock.payments.jpmorgan.com/api/v2"
-jpmorgan.secondary_base_url= "https://id.payments.jpmorgan.com"
+jpmorgan.secondary_base_url = "https://id.payments.jpmorgan.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/"
@@ -259,7 +259,7 @@ nuvei.base_url = "https://ppp-test.nuvei.com/"
opayo.base_url = "https://pi-test.sagepay.com/"
opennode.base_url = "https://dev-api.opennode.com"
paybox.base_url = "https://preprod-ppps.paybox.com/PPPS.php"
-paybox.secondary_base_url="https://preprod-tpeweb.paybox.com/"
+paybox.secondary_base_url = "https://preprod-tpeweb.paybox.com/"
payeezy.base_url = "https://api-cert.payeezy.com/"
payme.base_url = "https://sandbox.payme.io/"
payone.base_url = "https://payment.preprod.payone.com/"
@@ -343,7 +343,7 @@ adyen = { banks = "bank_austria,bawag_psk_ag,dolomitenbank,easybank_ag,erste_ban
[bank_config.ideal]
stripe = { banks = "abn_amro,asn_bank,bunq,handelsbanken,ing,knab,moneyou,rabobank,regiobank,revolut,sns_bank,triodos_bank,van_lanschot" }
adyen = { banks = "abn_amro,asn_bank,bunq,ing,knab,n26,nationale_nederlanden,rabobank,regiobank,revolut,sns_bank,triodos_bank,van_lanschot, yoursafe" }
-multisafepay = { banks="abn_amro, asn_bank, bunq, handelsbanken, nationale_nederlanden, n26, ing, knab, rabobank, regiobank, revolut, sns_bank,triodos_bank, van_lanschot, yoursafe" }
+multisafepay = { banks = "abn_amro, asn_bank, bunq, handelsbanken, nationale_nederlanden, n26, ing, knab, rabobank, regiobank, revolut, sns_bank,triodos_bank, van_lanschot, yoursafe" }
[bank_config.online_banking_czech_republic]
adyen = { banks = "ceska_sporitelna,komercni_banka,platnosc_online_karta_platnicza" }
@@ -395,10 +395,10 @@ cashapp = { country = "US", currency = "USD" }
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"}
+upi_collect = { country = "IN", currency = "INR" }
[pm_filters.plaid]
-open_banking_pis = {currency = "EUR,GBP"}
+open_banking_pis = { currency = "EUR,GBP" }
[pm_filters.adyen]
google_pay = { country = "AU,NZ,JP,HK,SG,MY,TH,VN,BH,AE,KW,BR,ES,GB,SE,NO,SK,AT,NL,DE,HU,CY,LU,CH,BE,FR,DK,RO,HR,LI,MT,SI,GR,PT,IE,CZ,EE,LT,LV,IT,PL,TR,IS,CA,US", currency = "AED,ALL,AMD,ANG,AOA,ARS,AUD,AWG,AZN,BAM,BBD,BDT,BGN,BHD,BMD,BND,BOB,BRL,BSD,BWP,BYN,BZD,CAD,CHF,CLP,CNY,COP,CRC,CUP,CVE,CZK,DJF,DKK,DOP,DZD,EGP,ETB,EUR,FJD,FKP,GBP,GEL,GHS,GIP,GMD,GNF,GTQ,GYD,HKD,HNL,HTG,HUF,IDR,ILS,INR,IQD,JMD,JOD,JPY,KES,KGS,KHR,KMF,KRW,KWD,KYD,KZT,LAK,LBP,LKR,LYD,MAD,MDL,MKD,MMK,MNT,MOP,MRU,MUR,MVR,MWK,MXN,MYR,MZN,NAD,NGN,NIO,NOK,NPR,NZD,OMR,PAB,PEN,PGK,PHP,PKR,PLN,PYG,QAR,RON,RSD,RUB,RWF,SAR,SBD,SCR,SEK,SGD,SHP,SLE,SOS,SRD,STN,SVC,SZL,THB,TND,TOP,TRY,TTD,TWD,TZS,UAH,UGX,USD,UYU,UZS,VES,VND,VUV,WST,XAF,XCD,XOF,XPF,YER,ZAR,ZMW" }
@@ -483,11 +483,11 @@ credit = { country = "AT,BE,CY,EE,FI,FR,DE,GR,IE,IT,LV,LT,LU,MT,NL,PT,SK,SI,ES,B
debit = { country = "AT,BE,CY,EE,FI,FR,DE,GR,IE,IT,LV,LT,LU,MT,NL,PT,SK,SI,ES,BG,HR,DK,GB,NO,PL,CZ,RO,SE,CH,HU", currency = "ARS,AUD,BHD,CAD,CLP,CNY,COP,HRK,CZK,DKK,HKD,HUF,INR,JPY,KZT,JOD,KRW,KWD,MYR,MXN,NGN,NOK,PHP,QAR,RUB,SAR,SGD,VND,ZAR,SEK,CHF,THB,AED,EGP,GBP,USD,TWD,BYN,RSD,AZN,RON,TRY,AOA,BGN,EUR,UAH,PLN,BRL" }
[pm_filters.novalnet]
-credit = { country = "AD,AE,AL,AM,AR,AT,AU,AZ,BA,BB,BD,BE,BG,BH,BI,BM,BN,BO,BR,BS,BW,BY,BZ,CA,CD,CH,CL,CN,CO,CR,CU,CY,CZ,DE,DJ,DK,DO,DZ,EE,EG,ET,ES,FI,FJ,FR,GB,GE,GH,GI,GM,GR,GT,GY,HK,HN,HR,HU,ID,IE,IL,IN,IS,IT,JM,JO,JP,KE,KH,KR,KW,KY,KZ,LB,LK,LT,LV,LY,MA,MC,MD,ME,MG,MK,MN,MO,MT,MV,MW,MX,MY,NG,NI,NO,NP,NL,NZ,OM,PA,PE,PG,PH,PK,PL,PT,PY,QA,RO,RS,RU,RW,SA,SB,SC,SE,SG,SH,SI,SK,SL,SO,SM,SR,ST,SV,SY,TH,TJ,TN,TO,TR,TW,TZ,UA,UG,US,UY,UZ,VE,VA,VN,VU,WS,CF,AG,DM,GD,KN,LC,VC,YE,ZA,ZM", currency = "AED,ALL,AMD,ARS,AUD,AZN,BAM,BBD,BDT,BGN,BHD,BIF,BMD,BND,BOB,BRL,BSD,BWP,BYN,BZD,CAD,CDF,CHF,CLP,CNY,COP,CRC,CUP,CZK,DJF,DKK,DOP,DZD,EGP,ETB,EUR,FJD,GBP,GEL,GHS,GIP,GMD,GTQ,GYD,HKD,HNL,HRK,HUF,IDR,ILS,INR,ISK,JMD,JOD,JPY,KES,KHR,KRW,KWD,KYD,KZT,LBP,LKR,LYD,MAD,MDL,MGA,MKD,MNT,MOP,MVR,MWK,MXN,MYR,NGN,NIO,NOK,NPR,NZD,OMR,PAB,PEN,PGK,PHP,PKR,PLN,PYG,QAR,RON,RSD,RUB,RWF,SAR,SBD,SCR,SEK,SGD,SHP,SLL,SOS,SRD,STN,SVC,SYP,THB,TJS,TND,TOP,TRY,TWD,TZS,UAH,UGX,USD,UYU,UZS,VES,VND,VUV,WST,XAF,XCD,YER,ZAR,ZMW"}
-debit = { country = "AD,AE,AL,AM,AR,AT,AU,AZ,BA,BB,BD,BE,BG,BH,BI,BM,BN,BO,BR,BS,BW,BY,BZ,CA,CD,CH,CL,CN,CO,CR,CU,CY,CZ,DE,DJ,DK,DO,DZ,EE,EG,ET,ES,FI,FJ,FR,GB,GE,GH,GI,GM,GR,GT,GY,HK,HN,HR,HU,ID,IE,IL,IN,IS,IT,JM,JO,JP,KE,KH,KR,KW,KY,KZ,LB,LK,LT,LV,LY,MA,MC,MD,ME,MG,MK,MN,MO,MT,MV,MW,MX,MY,NG,NI,NO,NP,NL,NZ,OM,PA,PE,PG,PH,PK,PL,PT,PY,QA,RO,RS,RU,RW,SA,SB,SC,SE,SG,SH,SI,SK,SL,SO,SM,SR,ST,SV,SY,TH,TJ,TN,TO,TR,TW,TZ,UA,UG,US,UY,UZ,VE,VA,VN,VU,WS,CF,AG,DM,GD,KN,LC,VC,YE,ZA,ZM", currency = "AED,ALL,AMD,ARS,AUD,AZN,BAM,BBD,BDT,BGN,BHD,BIF,BMD,BND,BOB,BRL,BSD,BWP,BYN,BZD,CAD,CDF,CHF,CLP,CNY,COP,CRC,CUP,CZK,DJF,DKK,DOP,DZD,EGP,ETB,EUR,FJD,GBP,GEL,GHS,GIP,GMD,GTQ,GYD,HKD,HNL,HRK,HUF,IDR,ILS,INR,ISK,JMD,JOD,JPY,KES,KHR,KRW,KWD,KYD,KZT,LBP,LKR,LYD,MAD,MDL,MGA,MKD,MNT,MOP,MVR,MWK,MXN,MYR,NGN,NIO,NOK,NPR,NZD,OMR,PAB,PEN,PGK,PHP,PKR,PLN,PYG,QAR,RON,RSD,RUB,RWF,SAR,SBD,SCR,SEK,SGD,SHP,SLL,SOS,SRD,STN,SVC,SYP,THB,TJS,TND,TOP,TRY,TWD,TZS,UAH,UGX,USD,UYU,UZS,VES,VND,VUV,WST,XAF,XCD,YER,ZAR,ZMW"}
-apple_pay = { country = "AD,AE,AL,AM,AR,AT,AU,AZ,BA,BB,BD,BE,BG,BH,BI,BM,BN,BO,BR,BS,BW,BY,BZ,CA,CD,CH,CL,CN,CO,CR,CU,CY,CZ,DE,DJ,DK,DO,DZ,EE,EG,ET,ES,FI,FJ,FR,GB,GE,GH,GI,GM,GR,GT,GY,HK,HN,HR,HU,ID,IE,IL,IN,IS,IT,JM,JO,JP,KE,KH,KR,KW,KY,KZ,LB,LK,LT,LV,LY,MA,MC,MD,ME,MG,MK,MN,MO,MT,MV,MW,MX,MY,NG,NI,NO,NP,NL,NZ,OM,PA,PE,PG,PH,PK,PL,PT,PY,QA,RO,RS,RU,RW,SA,SB,SC,SE,SG,SH,SI,SK,SL,SO,SM,SR,ST,SV,SY,TH,TJ,TN,TO,TR,TW,TZ,UA,UG,US,UY,UZ,VE,VA,VN,VU,WS,CF,AG,DM,GD,KN,LC,VC,YE,ZA,ZM", currency = "AED,ALL,AMD,ARS,AUD,AZN,BAM,BBD,BDT,BGN,BHD,BIF,BMD,BND,BOB,BRL,BSD,BWP,BYN,BZD,CAD,CDF,CHF,CLP,CNY,COP,CRC,CUP,CZK,DJF,DKK,DOP,DZD,EGP,ETB,EUR,FJD,GBP,GEL,GHS,GIP,GMD,GTQ,GYD,HKD,HNL,HRK,HUF,IDR,ILS,INR,ISK,JMD,JOD,JPY,KES,KHR,KRW,KWD,KYD,KZT,LBP,LKR,LYD,MAD,MDL,MGA,MKD,MNT,MOP,MVR,MWK,MXN,MYR,NGN,NIO,NOK,NPR,NZD,OMR,PAB,PEN,PGK,PHP,PKR,PLN,PYG,QAR,RON,RSD,RUB,RWF,SAR,SBD,SCR,SEK,SGD,SHP,SLL,SOS,SRD,STN,SVC,SYP,THB,TJS,TND,TOP,TRY,TWD,TZS,UAH,UGX,USD,UYU,UZS,VES,VND,VUV,WST,XAF,XCD,YER,ZAR,ZMW"}
-google_pay = { country = "AD,AE,AL,AM,AR,AT,AU,AZ,BA,BB,BD,BE,BG,BH,BI,BM,BN,BO,BR,BS,BW,BY,BZ,CA,CD,CH,CL,CN,CO,CR,CU,CY,CZ,DE,DJ,DK,DO,DZ,EE,EG,ET,ES,FI,FJ,FR,GB,GE,GH,GI,GM,GR,GT,GY,HK,HN,HR,HU,ID,IE,IL,IN,IS,IT,JM,JO,JP,KE,KH,KR,KW,KY,KZ,LB,LK,LT,LV,LY,MA,MC,MD,ME,MG,MK,MN,MO,MT,MV,MW,MX,MY,NG,NI,NO,NP,NL,NZ,OM,PA,PE,PG,PH,PK,PL,PT,PY,QA,RO,RS,RU,RW,SA,SB,SC,SE,SG,SH,SI,SK,SL,SO,SM,SR,ST,SV,SY,TH,TJ,TN,TO,TR,TW,TZ,UA,UG,US,UY,UZ,VE,VA,VN,VU,WS,CF,AG,DM,GD,KN,LC,VC,YE,ZA,ZM", currency = "AED,ALL,AMD,ARS,AUD,AZN,BAM,BBD,BDT,BGN,BHD,BIF,BMD,BND,BOB,BRL,BSD,BWP,BYN,BZD,CAD,CDF,CHF,CLP,CNY,COP,CRC,CUP,CZK,DJF,DKK,DOP,DZD,EGP,ETB,EUR,FJD,GBP,GEL,GHS,GIP,GMD,GTQ,GYD,HKD,HNL,HRK,HUF,IDR,ILS,INR,ISK,JMD,JOD,JPY,KES,KHR,KRW,KWD,KYD,KZT,LBP,LKR,LYD,MAD,MDL,MGA,MKD,MNT,MOP,MVR,MWK,MXN,MYR,NGN,NIO,NOK,NPR,NZD,OMR,PAB,PEN,PGK,PHP,PKR,PLN,PYG,QAR,RON,RSD,RUB,RWF,SAR,SBD,SCR,SEK,SGD,SHP,SLL,SOS,SRD,STN,SVC,SYP,THB,TJS,TND,TOP,TRY,TWD,TZS,UAH,UGX,USD,UYU,UZS,VES,VND,VUV,WST,XAF,XCD,YER,ZAR,ZMW"}
-paypal = { country = "AD,AE,AL,AM,AR,AT,AU,AZ,BA,BB,BD,BE,BG,BH,BI,BM,BN,BO,BR,BS,BW,BY,BZ,CA,CD,CH,CL,CN,CO,CR,CU,CY,CZ,DE,DJ,DK,DO,DZ,EE,EG,ET,ES,FI,FJ,FR,GB,GE,GH,GI,GM,GR,GT,GY,HK,HN,HR,HU,ID,IE,IL,IN,IS,IT,JM,JO,JP,KE,KH,KR,KW,KY,KZ,LB,LK,LT,LV,LY,MA,MC,MD,ME,MG,MK,MN,MO,MT,MV,MW,MX,MY,NG,NI,NO,NP,NL,NZ,OM,PA,PE,PG,PH,PK,PL,PT,PY,QA,RO,RS,RU,RW,SA,SB,SC,SE,SG,SH,SI,SK,SL,SO,SM,SR,ST,SV,SY,TH,TJ,TN,TO,TR,TW,TZ,UA,UG,US,UY,UZ,VE,VA,VN,VU,WS,CF,AG,DM,GD,KN,LC,VC,YE,ZA,ZM", currency = "AED,ALL,AMD,ARS,AUD,AZN,BAM,BBD,BDT,BGN,BHD,BIF,BMD,BND,BOB,BRL,BSD,BWP,BYN,BZD,CAD,CDF,CHF,CLP,CNY,COP,CRC,CUP,CZK,DJF,DKK,DOP,DZD,EGP,ETB,EUR,FJD,GBP,GEL,GHS,GIP,GMD,GTQ,GYD,HKD,HNL,HRK,HUF,IDR,ILS,INR,ISK,JMD,JOD,JPY,KES,KHR,KRW,KWD,KYD,KZT,LBP,LKR,LYD,MAD,MDL,MGA,MKD,MNT,MOP,MVR,MWK,MXN,MYR,NGN,NIO,NOK,NPR,NZD,OMR,PAB,PEN,PGK,PHP,PKR,PLN,PYG,QAR,RON,RSD,RUB,RWF,SAR,SBD,SCR,SEK,SGD,SHP,SLL,SOS,SRD,STN,SVC,SYP,THB,TJS,TND,TOP,TRY,TWD,TZS,UAH,UGX,USD,UYU,UZS,VES,VND,VUV,WST,XAF,XCD,YER,ZAR,ZMW"}
+credit = { country = "AD,AE,AL,AM,AR,AT,AU,AZ,BA,BB,BD,BE,BG,BH,BI,BM,BN,BO,BR,BS,BW,BY,BZ,CA,CD,CH,CL,CN,CO,CR,CU,CY,CZ,DE,DJ,DK,DO,DZ,EE,EG,ET,ES,FI,FJ,FR,GB,GE,GH,GI,GM,GR,GT,GY,HK,HN,HR,HU,ID,IE,IL,IN,IS,IT,JM,JO,JP,KE,KH,KR,KW,KY,KZ,LB,LK,LT,LV,LY,MA,MC,MD,ME,MG,MK,MN,MO,MT,MV,MW,MX,MY,NG,NI,NO,NP,NL,NZ,OM,PA,PE,PG,PH,PK,PL,PT,PY,QA,RO,RS,RU,RW,SA,SB,SC,SE,SG,SH,SI,SK,SL,SO,SM,SR,ST,SV,SY,TH,TJ,TN,TO,TR,TW,TZ,UA,UG,US,UY,UZ,VE,VA,VN,VU,WS,CF,AG,DM,GD,KN,LC,VC,YE,ZA,ZM", currency = "AED,ALL,AMD,ARS,AUD,AZN,BAM,BBD,BDT,BGN,BHD,BIF,BMD,BND,BOB,BRL,BSD,BWP,BYN,BZD,CAD,CDF,CHF,CLP,CNY,COP,CRC,CUP,CZK,DJF,DKK,DOP,DZD,EGP,ETB,EUR,FJD,GBP,GEL,GHS,GIP,GMD,GTQ,GYD,HKD,HNL,HRK,HUF,IDR,ILS,INR,ISK,JMD,JOD,JPY,KES,KHR,KRW,KWD,KYD,KZT,LBP,LKR,LYD,MAD,MDL,MGA,MKD,MNT,MOP,MVR,MWK,MXN,MYR,NGN,NIO,NOK,NPR,NZD,OMR,PAB,PEN,PGK,PHP,PKR,PLN,PYG,QAR,RON,RSD,RUB,RWF,SAR,SBD,SCR,SEK,SGD,SHP,SLL,SOS,SRD,STN,SVC,SYP,THB,TJS,TND,TOP,TRY,TWD,TZS,UAH,UGX,USD,UYU,UZS,VES,VND,VUV,WST,XAF,XCD,YER,ZAR,ZMW" }
+debit = { country = "AD,AE,AL,AM,AR,AT,AU,AZ,BA,BB,BD,BE,BG,BH,BI,BM,BN,BO,BR,BS,BW,BY,BZ,CA,CD,CH,CL,CN,CO,CR,CU,CY,CZ,DE,DJ,DK,DO,DZ,EE,EG,ET,ES,FI,FJ,FR,GB,GE,GH,GI,GM,GR,GT,GY,HK,HN,HR,HU,ID,IE,IL,IN,IS,IT,JM,JO,JP,KE,KH,KR,KW,KY,KZ,LB,LK,LT,LV,LY,MA,MC,MD,ME,MG,MK,MN,MO,MT,MV,MW,MX,MY,NG,NI,NO,NP,NL,NZ,OM,PA,PE,PG,PH,PK,PL,PT,PY,QA,RO,RS,RU,RW,SA,SB,SC,SE,SG,SH,SI,SK,SL,SO,SM,SR,ST,SV,SY,TH,TJ,TN,TO,TR,TW,TZ,UA,UG,US,UY,UZ,VE,VA,VN,VU,WS,CF,AG,DM,GD,KN,LC,VC,YE,ZA,ZM", currency = "AED,ALL,AMD,ARS,AUD,AZN,BAM,BBD,BDT,BGN,BHD,BIF,BMD,BND,BOB,BRL,BSD,BWP,BYN,BZD,CAD,CDF,CHF,CLP,CNY,COP,CRC,CUP,CZK,DJF,DKK,DOP,DZD,EGP,ETB,EUR,FJD,GBP,GEL,GHS,GIP,GMD,GTQ,GYD,HKD,HNL,HRK,HUF,IDR,ILS,INR,ISK,JMD,JOD,JPY,KES,KHR,KRW,KWD,KYD,KZT,LBP,LKR,LYD,MAD,MDL,MGA,MKD,MNT,MOP,MVR,MWK,MXN,MYR,NGN,NIO,NOK,NPR,NZD,OMR,PAB,PEN,PGK,PHP,PKR,PLN,PYG,QAR,RON,RSD,RUB,RWF,SAR,SBD,SCR,SEK,SGD,SHP,SLL,SOS,SRD,STN,SVC,SYP,THB,TJS,TND,TOP,TRY,TWD,TZS,UAH,UGX,USD,UYU,UZS,VES,VND,VUV,WST,XAF,XCD,YER,ZAR,ZMW" }
+apple_pay = { country = "AD,AE,AL,AM,AR,AT,AU,AZ,BA,BB,BD,BE,BG,BH,BI,BM,BN,BO,BR,BS,BW,BY,BZ,CA,CD,CH,CL,CN,CO,CR,CU,CY,CZ,DE,DJ,DK,DO,DZ,EE,EG,ET,ES,FI,FJ,FR,GB,GE,GH,GI,GM,GR,GT,GY,HK,HN,HR,HU,ID,IE,IL,IN,IS,IT,JM,JO,JP,KE,KH,KR,KW,KY,KZ,LB,LK,LT,LV,LY,MA,MC,MD,ME,MG,MK,MN,MO,MT,MV,MW,MX,MY,NG,NI,NO,NP,NL,NZ,OM,PA,PE,PG,PH,PK,PL,PT,PY,QA,RO,RS,RU,RW,SA,SB,SC,SE,SG,SH,SI,SK,SL,SO,SM,SR,ST,SV,SY,TH,TJ,TN,TO,TR,TW,TZ,UA,UG,US,UY,UZ,VE,VA,VN,VU,WS,CF,AG,DM,GD,KN,LC,VC,YE,ZA,ZM", currency = "AED,ALL,AMD,ARS,AUD,AZN,BAM,BBD,BDT,BGN,BHD,BIF,BMD,BND,BOB,BRL,BSD,BWP,BYN,BZD,CAD,CDF,CHF,CLP,CNY,COP,CRC,CUP,CZK,DJF,DKK,DOP,DZD,EGP,ETB,EUR,FJD,GBP,GEL,GHS,GIP,GMD,GTQ,GYD,HKD,HNL,HRK,HUF,IDR,ILS,INR,ISK,JMD,JOD,JPY,KES,KHR,KRW,KWD,KYD,KZT,LBP,LKR,LYD,MAD,MDL,MGA,MKD,MNT,MOP,MVR,MWK,MXN,MYR,NGN,NIO,NOK,NPR,NZD,OMR,PAB,PEN,PGK,PHP,PKR,PLN,PYG,QAR,RON,RSD,RUB,RWF,SAR,SBD,SCR,SEK,SGD,SHP,SLL,SOS,SRD,STN,SVC,SYP,THB,TJS,TND,TOP,TRY,TWD,TZS,UAH,UGX,USD,UYU,UZS,VES,VND,VUV,WST,XAF,XCD,YER,ZAR,ZMW" }
+google_pay = { country = "AD,AE,AL,AM,AR,AT,AU,AZ,BA,BB,BD,BE,BG,BH,BI,BM,BN,BO,BR,BS,BW,BY,BZ,CA,CD,CH,CL,CN,CO,CR,CU,CY,CZ,DE,DJ,DK,DO,DZ,EE,EG,ET,ES,FI,FJ,FR,GB,GE,GH,GI,GM,GR,GT,GY,HK,HN,HR,HU,ID,IE,IL,IN,IS,IT,JM,JO,JP,KE,KH,KR,KW,KY,KZ,LB,LK,LT,LV,LY,MA,MC,MD,ME,MG,MK,MN,MO,MT,MV,MW,MX,MY,NG,NI,NO,NP,NL,NZ,OM,PA,PE,PG,PH,PK,PL,PT,PY,QA,RO,RS,RU,RW,SA,SB,SC,SE,SG,SH,SI,SK,SL,SO,SM,SR,ST,SV,SY,TH,TJ,TN,TO,TR,TW,TZ,UA,UG,US,UY,UZ,VE,VA,VN,VU,WS,CF,AG,DM,GD,KN,LC,VC,YE,ZA,ZM", currency = "AED,ALL,AMD,ARS,AUD,AZN,BAM,BBD,BDT,BGN,BHD,BIF,BMD,BND,BOB,BRL,BSD,BWP,BYN,BZD,CAD,CDF,CHF,CLP,CNY,COP,CRC,CUP,CZK,DJF,DKK,DOP,DZD,EGP,ETB,EUR,FJD,GBP,GEL,GHS,GIP,GMD,GTQ,GYD,HKD,HNL,HRK,HUF,IDR,ILS,INR,ISK,JMD,JOD,JPY,KES,KHR,KRW,KWD,KYD,KZT,LBP,LKR,LYD,MAD,MDL,MGA,MKD,MNT,MOP,MVR,MWK,MXN,MYR,NGN,NIO,NOK,NPR,NZD,OMR,PAB,PEN,PGK,PHP,PKR,PLN,PYG,QAR,RON,RSD,RUB,RWF,SAR,SBD,SCR,SEK,SGD,SHP,SLL,SOS,SRD,STN,SVC,SYP,THB,TJS,TND,TOP,TRY,TWD,TZS,UAH,UGX,USD,UYU,UZS,VES,VND,VUV,WST,XAF,XCD,YER,ZAR,ZMW" }
+paypal = { country = "AD,AE,AL,AM,AR,AT,AU,AZ,BA,BB,BD,BE,BG,BH,BI,BM,BN,BO,BR,BS,BW,BY,BZ,CA,CD,CH,CL,CN,CO,CR,CU,CY,CZ,DE,DJ,DK,DO,DZ,EE,EG,ET,ES,FI,FJ,FR,GB,GE,GH,GI,GM,GR,GT,GY,HK,HN,HR,HU,ID,IE,IL,IN,IS,IT,JM,JO,JP,KE,KH,KR,KW,KY,KZ,LB,LK,LT,LV,LY,MA,MC,MD,ME,MG,MK,MN,MO,MT,MV,MW,MX,MY,NG,NI,NO,NP,NL,NZ,OM,PA,PE,PG,PH,PK,PL,PT,PY,QA,RO,RS,RU,RW,SA,SB,SC,SE,SG,SH,SI,SK,SL,SO,SM,SR,ST,SV,SY,TH,TJ,TN,TO,TR,TW,TZ,UA,UG,US,UY,UZ,VE,VA,VN,VU,WS,CF,AG,DM,GD,KN,LC,VC,YE,ZA,ZM", currency = "AED,ALL,AMD,ARS,AUD,AZN,BAM,BBD,BDT,BGN,BHD,BIF,BMD,BND,BOB,BRL,BSD,BWP,BYN,BZD,CAD,CDF,CHF,CLP,CNY,COP,CRC,CUP,CZK,DJF,DKK,DOP,DZD,EGP,ETB,EUR,FJD,GBP,GEL,GHS,GIP,GMD,GTQ,GYD,HKD,HNL,HRK,HUF,IDR,ILS,INR,ISK,JMD,JOD,JPY,KES,KHR,KRW,KWD,KYD,KZT,LBP,LKR,LYD,MAD,MDL,MGA,MKD,MNT,MOP,MVR,MWK,MXN,MYR,NGN,NIO,NOK,NPR,NZD,OMR,PAB,PEN,PGK,PHP,PKR,PLN,PYG,QAR,RON,RSD,RUB,RWF,SAR,SBD,SCR,SEK,SGD,SHP,SLL,SOS,SRD,STN,SVC,SYP,THB,TJS,TND,TOP,TRY,TWD,TZS,UAH,UGX,USD,UYU,UZS,VES,VND,VUV,WST,XAF,XCD,YER,ZAR,ZMW" }
[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" }
@@ -526,7 +526,6 @@ credit = { not_available_flows = { capture_method = "manual" } }
debit = { not_available_flows = { capture_method = "manual" } }
-
[pm_filters.mollie]
credit = { not_available_flows = { capture_method = "manual" } }
debit = { not_available_flows = { capture_method = "manual" } }
@@ -566,7 +565,7 @@ credit = { currency = "USD" }
debit = { currency = "USD" }
[pm_filters.fiuu]
-duit_now = { country ="MY", currency = "MYR" }
+duit_now = { country = "MY", currency = "MYR" }
[tokenization]
stripe = { long_lived_token = false, payment_method = "wallet", payment_method_type = { type = "disable_only", list = "google_pay" } }
@@ -623,16 +622,16 @@ connectors_with_delayed_session_response = "trustpay,payme"
connectors_with_webhook_source_verification_call = "paypal"
[mandates.supported_payment_methods]
-bank_debit.ach = { connector_list = "gocardless,adyen,stripe" }
-bank_debit.becs = { connector_list = "gocardless,stripe,adyen" }
-bank_debit.bacs = { connector_list = "stripe,gocardless" }
-bank_debit.sepa = { connector_list = "gocardless,adyen,stripe,deutschebank" }
-card.credit.connector_list = "stripe,adyen,authorizedotnet,cybersource,globalpay,worldpay,multisafepay,nmi,nexinets,noon,bankofamerica,braintree,nuvei,payme,wellsfargo,bamboraapac,elavon,fiuu,nexixpay,novalnet,paybox,paypal"
-card.debit.connector_list = "stripe,adyen,authorizedotnet,cybersource,globalpay,worldpay,multisafepay,nmi,nexinets,noon,bankofamerica,braintree,nuvei,payme,wellsfargo,bamboraapac,elavon,fiuu,nexixpay,novalnet,paybox,paypal"
-pay_later.klarna.connector_list = "adyen"
-wallet.apple_pay.connector_list = "stripe,adyen,cybersource,noon,bankofamerica,nexinets,novalnet"
-wallet.google_pay.connector_list = "stripe,adyen,cybersource,bankofamerica,noon,globalpay,multisafepay,novalnet"
-wallet.paypal.connector_list = "adyen,globalpay,nexinets,novalnet,paypal"
+bank_debit.ach = { connector_list = "gocardless,adyen,stripe" }
+bank_debit.becs = { connector_list = "gocardless,stripe,adyen" }
+bank_debit.bacs = { connector_list = "stripe,gocardless" }
+bank_debit.sepa = { connector_list = "gocardless,adyen,stripe,deutschebank" }
+card.credit.connector_list = "stripe,adyen,authorizedotnet,cybersource,globalpay,worldpay,multisafepay,nmi,nexinets,noon,bankofamerica,braintree,nuvei,payme,wellsfargo,bamboraapac,elavon,fiuu,nexixpay,novalnet,paybox,paypal"
+card.debit.connector_list = "stripe,adyen,authorizedotnet,cybersource,globalpay,worldpay,multisafepay,nmi,nexinets,noon,bankofamerica,braintree,nuvei,payme,wellsfargo,bamboraapac,elavon,fiuu,nexixpay,novalnet,paybox,paypal"
+pay_later.klarna.connector_list = "adyen"
+wallet.apple_pay.connector_list = "stripe,adyen,cybersource,noon,bankofamerica,nexinets,novalnet"
+wallet.google_pay.connector_list = "stripe,adyen,cybersource,bankofamerica,noon,globalpay,multisafepay,novalnet"
+wallet.paypal.connector_list = "adyen,globalpay,nexinets,novalnet,paypal"
wallet.momo.connector_list = "adyen"
wallet.kakao_pay.connector_list = "adyen"
wallet.go_pay.connector_list = "adyen"
@@ -641,20 +640,20 @@ wallet.dana.connector_list = "adyen"
wallet.twint.connector_list = "adyen"
wallet.vipps.connector_list = "adyen"
-bank_redirect.ideal.connector_list = "stripe,adyen,globalpay,multisafepay,nexinets"
-bank_redirect.sofort.connector_list = "stripe,adyen,globalpay"
-bank_redirect.giropay.connector_list = "adyen,globalpay,multisafepay,nexinets"
-bank_redirect.bancontact_card.connector_list="adyen,stripe"
-bank_redirect.trustly.connector_list="adyen"
-bank_redirect.open_banking_uk.connector_list="adyen"
-bank_redirect.eps.connector_list="globalpay,nexinets"
+bank_redirect.ideal.connector_list = "stripe,adyen,globalpay,multisafepay,nexinets"
+bank_redirect.sofort.connector_list = "stripe,adyen,globalpay"
+bank_redirect.giropay.connector_list = "adyen,globalpay,multisafepay,nexinets"
+bank_redirect.bancontact_card.connector_list = "adyen,stripe"
+bank_redirect.trustly.connector_list = "adyen"
+bank_redirect.open_banking_uk.connector_list = "adyen"
+bank_redirect.eps.connector_list = "globalpay,nexinets"
[mandates.update_mandate_supported]
card.credit = { connector_list = "cybersource" }
card.debit = { connector_list = "cybersource" }
[network_transaction_id_supported_connectors]
-connector_list = "stripe,adyen,cybersource"
+connector_list = "adyen,cybersource,novalnet,stripe,worldpay"
[connector_request_reference_id_config]
merchant_ids_send_payment_id_as_connector_request_id = []
@@ -697,7 +696,7 @@ merchant_name = "HyperSwitch"
card = "credit,debit"
[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" }
+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" }
@@ -725,7 +724,7 @@ source = "logs"
[events.kafka]
brokers = ["localhost:9092"]
-fraud_check_analytics_topic= "hyperswitch-fraud-check-events"
+fraud_check_analytics_topic = "hyperswitch-fraud-check-events"
intent_analytics_topic = "hyperswitch-payment-intent-events"
attempt_analytics_topic = "hyperswitch-payment-attempt-events"
refund_analytics_topic = "hyperswitch-refund-events"
@@ -794,7 +793,7 @@ sdk_eligible_payment_methods = "card"
[multitenancy]
enabled = false
-global_tenant = { schema = "public", redis_key_prefix = "", clickhouse_database = "default"}
+global_tenant = { tenant_id = "global", schema = "public", redis_key_prefix = "global", clickhouse_database = "default" }
[multitenancy.tenants.public]
base_url = "http://localhost:8080"
@@ -803,7 +802,7 @@ redis_key_prefix = ""
clickhouse_database = "default"
[multitenancy.tenants.public.user]
-control_center_url = "http://localhost:9000"
+control_center_url = "http://localhost:9000"
[user_auth_methods]
encryption_key = "A8EF32E029BC3342E54BF2E172A4D7AA43E8EF9D2C3A624A9F04E2EF79DC698F"
diff --git a/config/docker_compose.toml b/config/docker_compose.toml
index 75699d0a96..4296a5931d 100644
--- a/config/docker_compose.toml
+++ b/config/docker_compose.toml
@@ -55,9 +55,9 @@ master_enc_key = "73ad7bbbbc640c845a150f67d058b279849370cd2c1f3c67c4dd6c869213e1
password_validity_in_days = 90
two_factor_auth_expiry_in_secs = 300
totp_issuer_name = "Hyperswitch"
-base_url = "http://localhost:8080"
+base_url = "http://localhost:9000"
force_two_factor_auth = false
-force_cookies = true
+force_cookies = false
[locker]
host = ""
@@ -540,7 +540,7 @@ card.credit = { connector_list = "cybersource" }
card.debit = { connector_list = "cybersource" }
[network_transaction_id_supported_connectors]
-connector_list = "stripe,adyen,cybersource"
+connector_list = "adyen,cybersource,novalnet,stripe,worldpay"
[connector_customer]
connector_list = "gocardless,stax,stripe"
@@ -572,6 +572,7 @@ authentication_analytics_topic = "hyperswitch-authentication-events"
[analytics]
source = "sqlx"
+forex_enabled = false # Enable or disable forex conversion for analytics
[analytics.clickhouse]
username = "default"
@@ -635,7 +636,7 @@ sdk_eligible_payment_methods = "card"
[multitenancy]
enabled = false
-global_tenant = { schema = "public", redis_key_prefix = "", clickhouse_database = "default" }
+global_tenant = { tenant_id = "global", schema = "public", redis_key_prefix = "", clickhouse_database = "default" }
[multitenancy.tenants.public]
base_url = "http://localhost:8080"
@@ -695,7 +696,7 @@ connector_list = "cybersource"
sender_email = "example@example.com" # Sender email
aws_region = "" # AWS region used by AWS SES
allowed_unverified_days = 1 # Number of days the api calls ( with jwt token ) can be made without verifying the email
-active_email_client = "NO_EMAIL_CLIENT" # The currently active email client
+active_email_client = "SMTP" # The currently active email client
recon_recipient_email = "recon@example.com" # Recipient email for recon request email
prod_intent_recipient_email = "business@example.com" # Recipient email for prod intent email
@@ -707,6 +708,13 @@ sts_role_session_name = "" # An identifier for the assumed role session, used to
[theme.storage]
file_storage_backend = "file_system" # Theme storage backend to be used
+# Configuration for smtp, applicable when the active email client is SMTP
+[email.smtp]
+host = "mailhog" # SMTP host
+port = 1025 # SMTP port
+timeout = 10 # Timeout for SMTP connection in seconds
+connection = "plaintext" #currently plaintext and starttls are supported
+
[theme.email_config]
entity_name = "Hyperswitch" # Name of the entity to be showed in emails
entity_logo_url = "https://example.com/logo.svg" # Logo URL of the entity to be used in emails
diff --git a/config/payment_required_fields_v2.toml b/config/payment_required_fields_v2.toml
new file mode 100644
index 0000000000..8cc5e62c35
--- /dev/null
+++ b/config/payment_required_fields_v2.toml
@@ -0,0 +1,16 @@
+[[required_fields.card.credit.fields.stripe.common]]
+required_field = "payment_method_data.card.card_number"
+display_name = "card_number"
+field_type = "user_card_number"
+[[required_fields.card.credit.fields.stripe.common]]
+required_field = "payment_method_data.card.card_exp_year"
+display_name = "card_exp_year"
+field_type = "user_card_expiry_year"
+[[required_fields.card.credit.fields.stripe.common]]
+required_field = "payment_method_data.card.card_cvc"
+display_name = "card_cvc"
+field_type = "user_card_cvc"
+[[required_fields.card.credit.fields.stripe.common]]
+required_field = "payment_method_data.card.card_exp_month"
+display_name = "card_exp_month"
+field_type = "user_card_expiry_month"
diff --git a/crates/api_models/src/admin.rs b/crates/api_models/src/admin.rs
index ef25a4350d..321ee5305f 100644
--- a/crates/api_models/src/admin.rs
+++ b/crates/api_models/src/admin.rs
@@ -1009,9 +1009,10 @@ pub struct MerchantConnectorResponse {
/// Type of the Connector for the financial use case. Could range from Payments to Accounting to Banking.
#[schema(value_type = ConnectorType, example = "payment_processor")]
pub connector_type: api_enums::ConnectorType,
+
/// Name of the Connector
#[schema(value_type = Connector, example = "stripe")]
- pub connector_name: String,
+ pub connector_name: common_enums::connector_enums::Connector,
/// A unique label to identify the connector account created under a profile
#[schema(example = "stripe_US_travel")]
@@ -1310,9 +1311,10 @@ pub struct MerchantConnectorListResponse {
/// Type of the Connector for the financial use case. Could range from Payments to Accounting to Banking.
#[schema(value_type = ConnectorType, example = "payment_processor")]
pub connector_type: api_enums::ConnectorType,
+
/// Name of the Connector
#[schema(value_type = Connector, example = "stripe")]
- pub connector_name: String,
+ pub connector_name: common_enums::connector_enums::Connector,
/// A unique label to identify the connector account created under a profile
#[schema(example = "stripe_US_travel")]
@@ -1862,8 +1864,9 @@ pub struct ProfileCreate {
pub is_click_to_pay_enabled: bool,
/// Product authentication ids
- #[schema(value_type = Option