From 37c3ba2bc8ff99d2b835163b476ef95f950a99e7 Mon Sep 17 00:00:00 2001 From: Luis Sanchez Date: Wed, 26 Aug 2026 14:51:39 -0500 Subject: [PATCH 1/3] fix: correct credential-on-file network data --- .../client/order/OrderAutomaticPaymentsRequest.java | 4 ++++ .../client/payment/PaymentNetworkDataRequest.java | 2 +- .../client/payment/PaymentNetworkTransactionDataRequest.java | 5 ++++- .../client/payment/PaymentPointOfInteractionRequest.java | 1 - .../client/payment/PaymentTransactionDataRequest.java | 2 ++ .../mercadopago/resources/payment/PaymentNetworkData.java | 2 +- .../resources/payment/PaymentPointOfInteraction.java | 1 - .../resources/payment/PaymentTransactionData.java | 2 ++ 8 files changed, 14 insertions(+), 5 deletions(-) diff --git a/src/main/java/com/mercadopago/client/order/OrderAutomaticPaymentsRequest.java b/src/main/java/com/mercadopago/client/order/OrderAutomaticPaymentsRequest.java index 768177d8..56e9b3b6 100644 --- a/src/main/java/com/mercadopago/client/order/OrderAutomaticPaymentsRequest.java +++ b/src/main/java/com/mercadopago/client/order/OrderAutomaticPaymentsRequest.java @@ -2,6 +2,7 @@ import lombok.Builder; import lombok.Getter; +import java.util.Map; // API version: 1ff4822a-2dfd-4393-800e-a562edb3fe32 @@ -24,4 +25,7 @@ public class OrderAutomaticPaymentsRequest { /** Due date for the payment, in ISO 8601 format. */ private String dueDate; + + /** Subscription metadata (id, sequence, and invoice) for the automatic payment. */ + private Map subscription; } diff --git a/src/main/java/com/mercadopago/client/payment/PaymentNetworkDataRequest.java b/src/main/java/com/mercadopago/client/payment/PaymentNetworkDataRequest.java index 34be15e2..6c7862bc 100644 --- a/src/main/java/com/mercadopago/client/payment/PaymentNetworkDataRequest.java +++ b/src/main/java/com/mercadopago/client/payment/PaymentNetworkDataRequest.java @@ -6,6 +6,6 @@ @Getter @Builder public class PaymentNetworkDataRequest { - private final String networkTransactionId; + private final String transactionId; private final String transactionLinkId; } diff --git a/src/main/java/com/mercadopago/client/payment/PaymentNetworkTransactionDataRequest.java b/src/main/java/com/mercadopago/client/payment/PaymentNetworkTransactionDataRequest.java index ada8e473..59341d2e 100644 --- a/src/main/java/com/mercadopago/client/payment/PaymentNetworkTransactionDataRequest.java +++ b/src/main/java/com/mercadopago/client/payment/PaymentNetworkTransactionDataRequest.java @@ -1,5 +1,7 @@ package com.mercadopago.client.payment; +import com.mercadopago.resources.payment.PaymentNetworkData; + import lombok.Builder; import lombok.Getter; @@ -13,4 +15,5 @@ public class PaymentNetworkTransactionDataRequest { /** Network transaction identifier assigned by the card brand (Visa/Mastercard). */ private final String networkTransactionId; -} \ No newline at end of file + private final PaymentNetworkData networkData; +} diff --git a/src/main/java/com/mercadopago/client/payment/PaymentPointOfInteractionRequest.java b/src/main/java/com/mercadopago/client/payment/PaymentPointOfInteractionRequest.java index 9fa79629..3d5d6f84 100644 --- a/src/main/java/com/mercadopago/client/payment/PaymentPointOfInteractionRequest.java +++ b/src/main/java/com/mercadopago/client/payment/PaymentPointOfInteractionRequest.java @@ -23,6 +23,5 @@ public class PaymentPointOfInteractionRequest { /** Transaction data associated with the point of interaction. */ private final PaymentTransactionDataRequest transactionData; - private final PaymentNetworkDataRequest networkData; } diff --git a/src/main/java/com/mercadopago/client/payment/PaymentTransactionDataRequest.java b/src/main/java/com/mercadopago/client/payment/PaymentTransactionDataRequest.java index c002927b..818a1c25 100644 --- a/src/main/java/com/mercadopago/client/payment/PaymentTransactionDataRequest.java +++ b/src/main/java/com/mercadopago/client/payment/PaymentTransactionDataRequest.java @@ -25,6 +25,8 @@ public class PaymentTransactionDataRequest { private String billingDate; /** Legacy card-network transaction identifier within transaction data. */ private String networkTransactionId; + /** Card-network identifiers for this credential-on-file transaction. */ + private PaymentNetworkDataRequest networkData; /** * Whether this is the first transaction for a CREDENTIAL_ON_FILE payment. * Replaces the legacy {@code firstTimeUse} field in new integrations. diff --git a/src/main/java/com/mercadopago/resources/payment/PaymentNetworkData.java b/src/main/java/com/mercadopago/resources/payment/PaymentNetworkData.java index 0a2798c8..74668ef6 100644 --- a/src/main/java/com/mercadopago/resources/payment/PaymentNetworkData.java +++ b/src/main/java/com/mercadopago/resources/payment/PaymentNetworkData.java @@ -4,6 +4,6 @@ @Getter public class PaymentNetworkData { - private String networkTransactionId; + private String transactionId; private String transactionLinkId; } diff --git a/src/main/java/com/mercadopago/resources/payment/PaymentPointOfInteraction.java b/src/main/java/com/mercadopago/resources/payment/PaymentPointOfInteraction.java index ef6985f4..42ac3a17 100644 --- a/src/main/java/com/mercadopago/resources/payment/PaymentPointOfInteraction.java +++ b/src/main/java/com/mercadopago/resources/payment/PaymentPointOfInteraction.java @@ -28,5 +28,4 @@ public class PaymentPointOfInteraction { /** Transaction-level data from the interaction channel (e.g. QR code, ticket URL). */ private PaymentTransactionData transactionData; - private PaymentNetworkData networkData; } diff --git a/src/main/java/com/mercadopago/resources/payment/PaymentTransactionData.java b/src/main/java/com/mercadopago/resources/payment/PaymentTransactionData.java index 413a1ba0..9f06d8de 100644 --- a/src/main/java/com/mercadopago/resources/payment/PaymentTransactionData.java +++ b/src/main/java/com/mercadopago/resources/payment/PaymentTransactionData.java @@ -55,6 +55,8 @@ public class PaymentTransactionData { /** Legacy card-network transaction identifier within transaction data. */ private String networkTransactionId; + /** Card-network identifiers for this credential-on-file transaction. */ + private PaymentNetworkData networkData; /** * Whether this is the first transaction for a CREDENTIAL_ON_FILE payment. From b01baffc959a5db01b6078ba42f7893551b0a521 Mon Sep 17 00:00:00 2001 From: Luis Sanchez Date: Wed, 26 Aug 2026 15:52:05 -0500 Subject: [PATCH 2/3] test: cover automatic payment subscriptions --- .../OrderCreateRequestSerializationTest.java | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/src/test/java/com/mercadopago/client/order/OrderCreateRequestSerializationTest.java b/src/test/java/com/mercadopago/client/order/OrderCreateRequestSerializationTest.java index 388c3f08..398aa4cf 100644 --- a/src/test/java/com/mercadopago/client/order/OrderCreateRequestSerializationTest.java +++ b/src/test/java/com/mercadopago/client/order/OrderCreateRequestSerializationTest.java @@ -2,6 +2,7 @@ import com.google.gson.JsonObject; import com.mercadopago.serialization.Serializer; +import java.util.Map; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; @@ -116,4 +117,22 @@ void existingBuilderStillWorksWithoutNewFields() { Assertions.assertFalse(json.has("currency")); Assertions.assertFalse(json.has("integration_data")); } + + @Test + void automaticPaymentsSubscriptionSerializesWithItsNestedFields() { + OrderAutomaticPaymentsRequest request = + OrderAutomaticPaymentsRequest.builder() + .subscription( + Map.of( + "id", "subscription-1", + "sequence", Map.of("number", 1, "total", 12), + "invoice", Map.of("id", "invoice-1", "period", Map.of("interval", 1, "type", "month")))) + .build(); + + JsonObject subscription = Serializer.serializeToJson(request).getAsJsonObject("subscription"); + + Assertions.assertEquals("subscription-1", subscription.get("id").getAsString()); + Assertions.assertEquals(12, subscription.getAsJsonObject("sequence").get("total").getAsInt()); + Assertions.assertEquals("month", subscription.getAsJsonObject("invoice").getAsJsonObject("period").get("type").getAsString()); + } } From c278b142a07e86c69e724bb525af3a0c667eba7d Mon Sep 17 00:00:00 2001 From: Luis Sanchez Date: Wed, 26 Aug 2026 16:05:53 -0500 Subject: [PATCH 3/3] feat: support expanded network data responses --- .../PaymentNetworkTransactionDataRequest.java | 3 --- .../order/OrderAutomaticPayments.java | 6 ++++- .../resources/payment/PaymentExpanded.java | 5 ++-- .../payment/PaymentGatewayReference.java | 15 ++++++++++++ .../order/OrderAutomaticPaymentsTest.java | 24 +++++++++++++++++++ .../payment/PaymentExpandedTest.java | 21 ++++++++++++++++ 6 files changed, 67 insertions(+), 7 deletions(-) create mode 100644 src/main/java/com/mercadopago/resources/payment/PaymentGatewayReference.java create mode 100644 src/test/java/com/mercadopago/resources/order/OrderAutomaticPaymentsTest.java create mode 100644 src/test/java/com/mercadopago/resources/payment/PaymentExpandedTest.java diff --git a/src/main/java/com/mercadopago/client/payment/PaymentNetworkTransactionDataRequest.java b/src/main/java/com/mercadopago/client/payment/PaymentNetworkTransactionDataRequest.java index 59341d2e..53d9ffa5 100644 --- a/src/main/java/com/mercadopago/client/payment/PaymentNetworkTransactionDataRequest.java +++ b/src/main/java/com/mercadopago/client/payment/PaymentNetworkTransactionDataRequest.java @@ -1,7 +1,5 @@ package com.mercadopago.client.payment; -import com.mercadopago.resources.payment.PaymentNetworkData; - import lombok.Builder; import lombok.Getter; @@ -15,5 +13,4 @@ public class PaymentNetworkTransactionDataRequest { /** Network transaction identifier assigned by the card brand (Visa/Mastercard). */ private final String networkTransactionId; - private final PaymentNetworkData networkData; } diff --git a/src/main/java/com/mercadopago/resources/order/OrderAutomaticPayments.java b/src/main/java/com/mercadopago/resources/order/OrderAutomaticPayments.java index fd2f20aa..0ad40aaa 100644 --- a/src/main/java/com/mercadopago/resources/order/OrderAutomaticPayments.java +++ b/src/main/java/com/mercadopago/resources/order/OrderAutomaticPayments.java @@ -2,6 +2,7 @@ import lombok.Builder; import lombok.Getter; +import java.util.Map; // API version: 1ff4822a-2dfd-4393-800e-a562edb3fe32 @@ -24,4 +25,7 @@ public class OrderAutomaticPayments { /** ISO 8601 date-time by which the automatic payment must be completed. */ private String dueDate; -} \ No newline at end of file + + /** Subscription metadata (id, sequence, and invoice) returned for the automatic payment. */ + private Map subscription; +} diff --git a/src/main/java/com/mercadopago/resources/payment/PaymentExpanded.java b/src/main/java/com/mercadopago/resources/payment/PaymentExpanded.java index 77180316..afe56f88 100644 --- a/src/main/java/com/mercadopago/resources/payment/PaymentExpanded.java +++ b/src/main/java/com/mercadopago/resources/payment/PaymentExpanded.java @@ -1,6 +1,5 @@ package com.mercadopago.resources.payment; -import com.mercadopago.client.payment.PaymentNetworkTransactionDataRequest; import lombok.Getter; /** @@ -25,6 +24,6 @@ public class PaymentExpanded { @Getter public static class Gateway { /** Network transaction data reference from the payment gateway. */ - private PaymentNetworkTransactionDataRequest reference; + private PaymentGatewayReference reference; } -} \ No newline at end of file +} diff --git a/src/main/java/com/mercadopago/resources/payment/PaymentGatewayReference.java b/src/main/java/com/mercadopago/resources/payment/PaymentGatewayReference.java new file mode 100644 index 00000000..11f9574a --- /dev/null +++ b/src/main/java/com/mercadopago/resources/payment/PaymentGatewayReference.java @@ -0,0 +1,15 @@ +package com.mercadopago.resources.payment; + +import lombok.Getter; + +/** + * Network references returned by an expanded payment gateway response. + */ +@Getter +public class PaymentGatewayReference { + /** Card-network transaction identifier. */ + private String networkTransactionId; + + /** Card-network transaction and link identifiers. */ + private PaymentNetworkData networkData; +} diff --git a/src/test/java/com/mercadopago/resources/order/OrderAutomaticPaymentsTest.java b/src/test/java/com/mercadopago/resources/order/OrderAutomaticPaymentsTest.java new file mode 100644 index 00000000..4e39dcff --- /dev/null +++ b/src/test/java/com/mercadopago/resources/order/OrderAutomaticPaymentsTest.java @@ -0,0 +1,24 @@ +package com.mercadopago.resources.order; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +import com.mercadopago.exceptions.MPJsonParseException; +import com.mercadopago.serialization.Serializer; +import java.util.Map; +import org.junit.jupiter.api.Test; + +class OrderAutomaticPaymentsTest { + + @Test + void subscriptionDeserializesFromResponse() throws MPJsonParseException { + Order order = + Serializer.deserializeFromJson( + Order.class, + "{\"transactions\":{\"payments\":[{\"automatic_payments\":{\"subscription\":{\"id\":\"subscription-1\",\"sequence\":{\"number\":1,\"total\":12}}}}]}}"); + + Map subscription = + order.getTransactions().getPayments().get(0).getAutomaticPayments().getSubscription(); + assertEquals("subscription-1", subscription.get("id")); + assertEquals(12.0, ((Map) subscription.get("sequence")).get("total")); + } +} diff --git a/src/test/java/com/mercadopago/resources/payment/PaymentExpandedTest.java b/src/test/java/com/mercadopago/resources/payment/PaymentExpandedTest.java new file mode 100644 index 00000000..e1e596c5 --- /dev/null +++ b/src/test/java/com/mercadopago/resources/payment/PaymentExpandedTest.java @@ -0,0 +1,21 @@ +package com.mercadopago.resources.payment; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +import com.mercadopago.exceptions.MPJsonParseException; +import com.mercadopago.serialization.Serializer; +import org.junit.jupiter.api.Test; + +class PaymentExpandedTest { + + @Test + void gatewayReferenceDeserializesNetworkData() throws MPJsonParseException { + Payment payment = + Serializer.deserializeFromJson( + Payment.class, + "{\"expanded\":{\"gateway\":{\"reference\":{\"network_data\":{\"transaction_id\":\"ABC123\",\"transaction_link_id\":\"550e8400\"}}}}}"); + + assertEquals("ABC123", payment.getExpanded().getGateway().getReference().getNetworkData().getTransactionId()); + assertEquals("550e8400", payment.getExpanded().getGateway().getReference().getNetworkData().getTransactionLinkId()); + } +}