From 3b2c4ab239d350833eeadf082da351fc5c21f4b5 Mon Sep 17 00:00:00 2001 From: Przemyslaw Poznienski Date: Thu, 30 Apr 2026 14:15:50 +0200 Subject: [PATCH 1/5] [COREP-5519] introduce dual brand schemes --- .../com/pensio/api/PensioMerchantAPI.java | 13 ++- .../request/PaymentReservationRequest.java | 12 +++ src/main/resources/xsd/APIResponse.xsd | 20 +++++ .../merchantApiChosenSchemeMappingTests.java | 82 +++++++++++++++++++ .../PaymentReservationRequestTest.java | 40 +++++++++ 5 files changed, 164 insertions(+), 3 deletions(-) create mode 100644 src/test/java/com/pensio/api/merchantApiChosenSchemeMappingTests.java create mode 100644 src/test/java/com/pensio/api/request/PaymentReservationRequestTest.java diff --git a/src/main/java/com/pensio/api/PensioMerchantAPI.java b/src/main/java/com/pensio/api/PensioMerchantAPI.java index 7035d6c..241829f 100644 --- a/src/main/java/com/pensio/api/PensioMerchantAPI.java +++ b/src/main/java/com/pensio/api/PensioMerchantAPI.java @@ -89,16 +89,17 @@ public APIResponse updateOrder(UpdateOrderRequest request) throws PensioAPIExcep return getAPIResponse("updateOrder", HttpMethod.POST, params); } - public APIResponse reservation(PaymentReservationRequest request) throws PensioAPIException + public APIResponse reservation(PaymentReservationRequest request) throws PensioAPIException { HashMap params = new HashMap<>(); setPaymentRequestParameters(request, params); setCreditCardRequestParameters(request, params); setPaymentSource(request, params); - + setChosenScheme(request, params); + return getAPIResponse("reservation", HttpMethod.POST, params); } - + private void setPaymentSource(PaymentReservationRequest request, HashMap params) { @@ -107,6 +108,12 @@ private void setPaymentSource(PaymentReservationRequest request, addParam(params, "payment_source", request.getSource().name()); } } + + void setChosenScheme(PaymentReservationRequest request, + HashMap params) + { + addParam(params, "chosen_scheme", request.getChosenScheme()); + } public APIResponse capture(CaptureReservationRequest request) throws PensioAPIException { diff --git a/src/main/java/com/pensio/api/request/PaymentReservationRequest.java b/src/main/java/com/pensio/api/request/PaymentReservationRequest.java index 0331456..e4d3c2e 100644 --- a/src/main/java/com/pensio/api/request/PaymentReservationRequest.java +++ b/src/main/java/com/pensio/api/request/PaymentReservationRequest.java @@ -24,6 +24,7 @@ public PaymentReservationRequest(String paymentRequestId) protected String startMonth; protected String startYear; protected String paymentRequestId; + protected String chosenScheme; public PaymentSource getSource() { @@ -130,4 +131,15 @@ public void setPaymentRequestId(String paymentRequestId) this.paymentRequestId = paymentRequestId; } + public String getChosenScheme() + { + return chosenScheme; + } + + public PaymentReservationRequest setChosenScheme(String chosenScheme) + { + this.chosenScheme = chosenScheme; + return this; + } + } diff --git a/src/main/resources/xsd/APIResponse.xsd b/src/main/resources/xsd/APIResponse.xsd index 6a6480f..ea60574 100644 --- a/src/main/resources/xsd/APIResponse.xsd +++ b/src/main/resources/xsd/APIResponse.xsd @@ -188,6 +188,8 @@ + + @@ -250,6 +252,24 @@ + + + + + + + + + + + + + + + + + + diff --git a/src/test/java/com/pensio/api/merchantApiChosenSchemeMappingTests.java b/src/test/java/com/pensio/api/merchantApiChosenSchemeMappingTests.java new file mode 100644 index 0000000..51e58bd --- /dev/null +++ b/src/test/java/com/pensio/api/merchantApiChosenSchemeMappingTests.java @@ -0,0 +1,82 @@ +package com.pensio.api; + +import com.pensio.Amount; +import com.pensio.Currency; +import com.pensio.api.generated.APIResponse; +import com.pensio.api.request.PaymentReservationRequest; +import org.junit.jupiter.api.Assertions; + +import org.junit.jupiter.api.Test; + +import java.util.Map; +import java.util.concurrent.atomic.AtomicReference; + +class MerchantApiChosenSchemeMappingTests { + + @Test + void chosenScheme_isForwardedAsTopLevelFormParam_onReservationCall() throws PensioAPIException { + AtomicReference> capturedParams = new AtomicReference<>(); + AtomicReference capturedMethod = new AtomicReference<>(); + + final var api = new PensioMerchantAPI("http://base", "user", "pass") { + @Override + protected APIResponse getAPIResponse(String method, HttpMethod httpMethod, Map requestVars) { + capturedMethod.set(method); + capturedParams.set(requestVars); + return null; + } + }; + + PaymentReservationRequest request = new PaymentReservationRequest( + "order-1", "terminal-1", Amount.get(10.0, Currency.EUR)); + request.setChosenScheme("Visa"); + + api.reservation(request); + + Assertions.assertEquals("reservation", capturedMethod.get()); + Assertions.assertEquals("Visa", capturedParams.get().get("chosen_scheme")); + } + + @Test + void chosenScheme_null_isNotEmittedOnTheWire() throws PensioAPIException { + AtomicReference> capturedParams = new AtomicReference<>(); + + final var api = new PensioMerchantAPI("http://base", "user", "pass") { + @Override + protected APIResponse getAPIResponse(String method, HttpMethod httpMethod, Map requestVars) { + capturedParams.set(requestVars); + return null; + } + }; + + PaymentReservationRequest request = new PaymentReservationRequest( + "order-1", "terminal-1", Amount.get(10.0, Currency.EUR)); + + api.reservation(request); + + Assertions.assertFalse( + capturedParams.get().containsKey("chosen_scheme"), + "chosen_scheme should not be present on the wire when not set"); + } + + @Test + void chosenScheme_mastercard_isForwarded() throws PensioAPIException { + AtomicReference> capturedParams = new AtomicReference<>(); + + final var api = new PensioMerchantAPI("http://base", "user", "pass") { + @Override + protected APIResponse getAPIResponse(String method, HttpMethod httpMethod, Map requestVars) { + capturedParams.set(requestVars); + return null; + } + }; + + PaymentReservationRequest request = new PaymentReservationRequest( + "order-2", "terminal-2", Amount.get(25.0, Currency.USD)); + request.setChosenScheme("Mastercard"); + + api.reservation(request); + + Assertions.assertEquals("Mastercard", capturedParams.get().get("chosen_scheme")); + } +} diff --git a/src/test/java/com/pensio/api/request/PaymentReservationRequestTest.java b/src/test/java/com/pensio/api/request/PaymentReservationRequestTest.java new file mode 100644 index 0000000..f52ca44 --- /dev/null +++ b/src/test/java/com/pensio/api/request/PaymentReservationRequestTest.java @@ -0,0 +1,40 @@ +package com.pensio.api.request; + +import com.pensio.Amount; +import com.pensio.Currency; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNull; +import static org.junit.jupiter.api.Assertions.assertSame; + +class PaymentReservationRequestTest { + + @Test + void chosenScheme_defaultsToNull() { + PaymentReservationRequest request = new PaymentReservationRequest( + "order-1", "terminal-1", Amount.get(10.0, Currency.EUR)); + + assertNull(request.getChosenScheme()); + } + + @Test + void chosenScheme_setterGetterRoundTrip() { + PaymentReservationRequest request = new PaymentReservationRequest( + "order-1", "terminal-1", Amount.get(10.0, Currency.EUR)); + + request.setChosenScheme("Visa"); + + assertEquals("Visa", request.getChosenScheme()); + } + + @Test + void chosenScheme_setterReturnsSameInstance_forFluentChaining() { + PaymentReservationRequest request = new PaymentReservationRequest( + "order-1", "terminal-1", Amount.get(10.0, Currency.EUR)); + + PaymentReservationRequest returned = request.setChosenScheme("Mastercard"); + + assertSame(request, returned); + } +} From 1807edf7ce5797ddf688491ee1b3db25a6cef3ce Mon Sep 17 00:00:00 2001 From: Przemyslaw Poznienski Date: Mon, 4 May 2026 09:06:38 +0200 Subject: [PATCH 2/5] [COREP-5519] use single data model --- src/main/resources/xsd/APIResponse.xsd | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/src/main/resources/xsd/APIResponse.xsd b/src/main/resources/xsd/APIResponse.xsd index ea60574..7d8f1e1 100644 --- a/src/main/resources/xsd/APIResponse.xsd +++ b/src/main/resources/xsd/APIResponse.xsd @@ -188,8 +188,7 @@ - - + @@ -252,14 +251,9 @@ - + - - - - - From 21a5ca003a897916576c1fd9f50faeb70625a723 Mon Sep 17 00:00:00 2001 From: Przemyslaw Poznienski Date: Mon, 4 May 2026 14:48:22 +0200 Subject: [PATCH 3/5] [COREP-5519] remove chosen scheme --- .../com/pensio/api/PensioMerchantAPI.java | 7 -- .../request/PaymentReservationRequest.java | 12 --- .../merchantApiChosenSchemeMappingTests.java | 82 ------------------- .../PaymentReservationRequestTest.java | 40 --------- 4 files changed, 141 deletions(-) delete mode 100644 src/test/java/com/pensio/api/merchantApiChosenSchemeMappingTests.java delete mode 100644 src/test/java/com/pensio/api/request/PaymentReservationRequestTest.java diff --git a/src/main/java/com/pensio/api/PensioMerchantAPI.java b/src/main/java/com/pensio/api/PensioMerchantAPI.java index 241829f..3ce32d1 100644 --- a/src/main/java/com/pensio/api/PensioMerchantAPI.java +++ b/src/main/java/com/pensio/api/PensioMerchantAPI.java @@ -95,7 +95,6 @@ public APIResponse reservation(PaymentReservationRequest request) throws PensioA setPaymentRequestParameters(request, params); setCreditCardRequestParameters(request, params); setPaymentSource(request, params); - setChosenScheme(request, params); return getAPIResponse("reservation", HttpMethod.POST, params); } @@ -108,12 +107,6 @@ private void setPaymentSource(PaymentReservationRequest request, addParam(params, "payment_source", request.getSource().name()); } } - - void setChosenScheme(PaymentReservationRequest request, - HashMap params) - { - addParam(params, "chosen_scheme", request.getChosenScheme()); - } public APIResponse capture(CaptureReservationRequest request) throws PensioAPIException { diff --git a/src/main/java/com/pensio/api/request/PaymentReservationRequest.java b/src/main/java/com/pensio/api/request/PaymentReservationRequest.java index e4d3c2e..0331456 100644 --- a/src/main/java/com/pensio/api/request/PaymentReservationRequest.java +++ b/src/main/java/com/pensio/api/request/PaymentReservationRequest.java @@ -24,7 +24,6 @@ public PaymentReservationRequest(String paymentRequestId) protected String startMonth; protected String startYear; protected String paymentRequestId; - protected String chosenScheme; public PaymentSource getSource() { @@ -131,15 +130,4 @@ public void setPaymentRequestId(String paymentRequestId) this.paymentRequestId = paymentRequestId; } - public String getChosenScheme() - { - return chosenScheme; - } - - public PaymentReservationRequest setChosenScheme(String chosenScheme) - { - this.chosenScheme = chosenScheme; - return this; - } - } diff --git a/src/test/java/com/pensio/api/merchantApiChosenSchemeMappingTests.java b/src/test/java/com/pensio/api/merchantApiChosenSchemeMappingTests.java deleted file mode 100644 index 51e58bd..0000000 --- a/src/test/java/com/pensio/api/merchantApiChosenSchemeMappingTests.java +++ /dev/null @@ -1,82 +0,0 @@ -package com.pensio.api; - -import com.pensio.Amount; -import com.pensio.Currency; -import com.pensio.api.generated.APIResponse; -import com.pensio.api.request.PaymentReservationRequest; -import org.junit.jupiter.api.Assertions; - -import org.junit.jupiter.api.Test; - -import java.util.Map; -import java.util.concurrent.atomic.AtomicReference; - -class MerchantApiChosenSchemeMappingTests { - - @Test - void chosenScheme_isForwardedAsTopLevelFormParam_onReservationCall() throws PensioAPIException { - AtomicReference> capturedParams = new AtomicReference<>(); - AtomicReference capturedMethod = new AtomicReference<>(); - - final var api = new PensioMerchantAPI("http://base", "user", "pass") { - @Override - protected APIResponse getAPIResponse(String method, HttpMethod httpMethod, Map requestVars) { - capturedMethod.set(method); - capturedParams.set(requestVars); - return null; - } - }; - - PaymentReservationRequest request = new PaymentReservationRequest( - "order-1", "terminal-1", Amount.get(10.0, Currency.EUR)); - request.setChosenScheme("Visa"); - - api.reservation(request); - - Assertions.assertEquals("reservation", capturedMethod.get()); - Assertions.assertEquals("Visa", capturedParams.get().get("chosen_scheme")); - } - - @Test - void chosenScheme_null_isNotEmittedOnTheWire() throws PensioAPIException { - AtomicReference> capturedParams = new AtomicReference<>(); - - final var api = new PensioMerchantAPI("http://base", "user", "pass") { - @Override - protected APIResponse getAPIResponse(String method, HttpMethod httpMethod, Map requestVars) { - capturedParams.set(requestVars); - return null; - } - }; - - PaymentReservationRequest request = new PaymentReservationRequest( - "order-1", "terminal-1", Amount.get(10.0, Currency.EUR)); - - api.reservation(request); - - Assertions.assertFalse( - capturedParams.get().containsKey("chosen_scheme"), - "chosen_scheme should not be present on the wire when not set"); - } - - @Test - void chosenScheme_mastercard_isForwarded() throws PensioAPIException { - AtomicReference> capturedParams = new AtomicReference<>(); - - final var api = new PensioMerchantAPI("http://base", "user", "pass") { - @Override - protected APIResponse getAPIResponse(String method, HttpMethod httpMethod, Map requestVars) { - capturedParams.set(requestVars); - return null; - } - }; - - PaymentReservationRequest request = new PaymentReservationRequest( - "order-2", "terminal-2", Amount.get(25.0, Currency.USD)); - request.setChosenScheme("Mastercard"); - - api.reservation(request); - - Assertions.assertEquals("Mastercard", capturedParams.get().get("chosen_scheme")); - } -} diff --git a/src/test/java/com/pensio/api/request/PaymentReservationRequestTest.java b/src/test/java/com/pensio/api/request/PaymentReservationRequestTest.java deleted file mode 100644 index f52ca44..0000000 --- a/src/test/java/com/pensio/api/request/PaymentReservationRequestTest.java +++ /dev/null @@ -1,40 +0,0 @@ -package com.pensio.api.request; - -import com.pensio.Amount; -import com.pensio.Currency; -import org.junit.jupiter.api.Test; - -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertNull; -import static org.junit.jupiter.api.Assertions.assertSame; - -class PaymentReservationRequestTest { - - @Test - void chosenScheme_defaultsToNull() { - PaymentReservationRequest request = new PaymentReservationRequest( - "order-1", "terminal-1", Amount.get(10.0, Currency.EUR)); - - assertNull(request.getChosenScheme()); - } - - @Test - void chosenScheme_setterGetterRoundTrip() { - PaymentReservationRequest request = new PaymentReservationRequest( - "order-1", "terminal-1", Amount.get(10.0, Currency.EUR)); - - request.setChosenScheme("Visa"); - - assertEquals("Visa", request.getChosenScheme()); - } - - @Test - void chosenScheme_setterReturnsSameInstance_forFluentChaining() { - PaymentReservationRequest request = new PaymentReservationRequest( - "order-1", "terminal-1", Amount.get(10.0, Currency.EUR)); - - PaymentReservationRequest returned = request.setChosenScheme("Mastercard"); - - assertSame(request, returned); - } -} From 3baf34a2c1da0797a04578c9779731189d106c9a Mon Sep 17 00:00:00 2001 From: Przemyslaw Poznienski Date: Tue, 5 May 2026 07:47:30 +0200 Subject: [PATCH 4/5] [COREP-5519] update changelog --- CHANGELOG.md | 3 +++ build.gradle | 2 +- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 8f03295..5162c65 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,9 @@ # Changelog All notable changes to this project will be documented in this file. +## [3.1.11] +- Added `Schemes` element to `Terminal` in `/getTerminals` API response, carrying the per-terminal supported card schemes and the MarketPay dual-brand pairs (`DualBrandPair` with `schemeA`, `schemeB`, `default` attributes) + ## [3.1.10] - Add `source` parameter to Apple Pay request data to support APPLE_PAY_JS_API / PASSKIT scenarios diff --git a/build.gradle b/build.gradle index b09d0d8..5a62a0a 100644 --- a/build.gradle +++ b/build.gradle @@ -9,7 +9,7 @@ plugins { } group = 'com.altapay' -version = '3.1.10' +version = '3.1.11' repositories { mavenCentral() From 9969d3bd8b3211423c58e2c5fbda6f14924172fc Mon Sep 17 00:00:00 2001 From: pprzemek-alta Date: Tue, 5 May 2026 09:37:12 +0200 Subject: [PATCH 5/5] Apply suggestion from @mzasonski Co-authored-by: mzasonski <128836096+mzasonski@users.noreply.github.com> --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 5162c65..d93803b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,7 +2,7 @@ All notable changes to this project will be documented in this file. ## [3.1.11] -- Added `Schemes` element to `Terminal` in `/getTerminals` API response, carrying the per-terminal supported card schemes and the MarketPay dual-brand pairs (`DualBrandPair` with `schemeA`, `schemeB`, `default` attributes) +- Added `Schemes` element to `Terminal` in `/getTerminals` API response, carrying the per-terminal supported card schemes and dual-brand pairs (`DualBrandPair` with `schemeA`, `schemeB`, `default` attributes) ## [3.1.10] - Add `source` parameter to Apple Pay request data to support APPLE_PAY_JS_API / PASSKIT scenarios