From a66419d9ecc4f920e40f38ab38d71850436b22a9 Mon Sep 17 00:00:00 2001 From: Stripe OpenAPI <105521251+stripe-openapi[bot]@users.noreply.github.com> Date: Wed, 4 Mar 2026 22:26:25 +0000 Subject: [PATCH 1/5] Update generated code for v2189 and --- CODEGEN_VERSION | 2 +- .../BalanceTransactionSourceTypeAdapterFactory.java | 11 +++++++---- .../model/ExternalAccountTypeAdapterFactory.java | 9 ++++++--- .../stripe/model/PaymentSourceTypeAdapterFactory.java | 9 ++++++--- 4 files changed, 20 insertions(+), 11 deletions(-) diff --git a/CODEGEN_VERSION b/CODEGEN_VERSION index b7a4b42e31e..0f9f7f07fc5 100644 --- a/CODEGEN_VERSION +++ b/CODEGEN_VERSION @@ -1 +1 @@ -49b1e23eef1a5004ed00987c41d5ec8447a19e27 \ No newline at end of file +46812bb1234aef25ae1070b402c602491ee66f8d \ No newline at end of file diff --git a/src/main/java/com/stripe/model/BalanceTransactionSourceTypeAdapterFactory.java b/src/main/java/com/stripe/model/BalanceTransactionSourceTypeAdapterFactory.java index 29e3c7c60be..fc84822c515 100644 --- a/src/main/java/com/stripe/model/BalanceTransactionSourceTypeAdapterFactory.java +++ b/src/main/java/com/stripe/model/BalanceTransactionSourceTypeAdapterFactory.java @@ -25,9 +25,6 @@ public TypeAdapter create(Gson gson, TypeToken type) { } final String discriminator = "object"; final TypeAdapter jsonElementAdapter = gson.getAdapter(JsonElement.class); - final TypeAdapter balanceTransactionSourceAdapter = - gson.getDelegateAdapter( - this, TypeToken.get(com.stripe.model.BalanceTransactionSource.class)); final TypeAdapter applicationFeeAdapter = gson.getDelegateAdapter(this, TypeToken.get(com.stripe.model.ApplicationFee.class)); final TypeAdapter chargeAdapter = @@ -68,7 +65,13 @@ public TypeAdapter create(Gson gson, TypeToken type) { new TypeAdapter() { @Override public void write(JsonWriter out, BalanceTransactionSource value) throws IOException { - balanceTransactionSourceAdapter.write(out, value); + @SuppressWarnings("unchecked") + TypeAdapter adapter = + (TypeAdapter) + gson.getDelegateAdapter( + BalanceTransactionSourceTypeAdapterFactory.this, + TypeToken.get(value.getClass())); + adapter.write(out, value); } @Override diff --git a/src/main/java/com/stripe/model/ExternalAccountTypeAdapterFactory.java b/src/main/java/com/stripe/model/ExternalAccountTypeAdapterFactory.java index 1d24a1d21a3..a4c99067782 100644 --- a/src/main/java/com/stripe/model/ExternalAccountTypeAdapterFactory.java +++ b/src/main/java/com/stripe/model/ExternalAccountTypeAdapterFactory.java @@ -28,8 +28,6 @@ public TypeAdapter create(Gson gson, TypeToken type) { } final String discriminator = "object"; final TypeAdapter jsonElementAdapter = gson.getAdapter(JsonElement.class); - final TypeAdapter externalAccountAdapter = - gson.getDelegateAdapter(this, TypeToken.get(com.stripe.model.ExternalAccount.class)); final TypeAdapter bankAccountAdapter = gson.getDelegateAdapter(this, TypeToken.get(com.stripe.model.BankAccount.class)); final TypeAdapter cardAdapter = @@ -39,7 +37,12 @@ public TypeAdapter create(Gson gson, TypeToken type) { new TypeAdapter() { @Override public void write(JsonWriter out, ExternalAccount value) throws IOException { - externalAccountAdapter.write(out, value); + @SuppressWarnings("unchecked") + TypeAdapter adapter = + (TypeAdapter) + gson.getDelegateAdapter( + ExternalAccountTypeAdapterFactory.this, TypeToken.get(value.getClass())); + adapter.write(out, value); } @Override diff --git a/src/main/java/com/stripe/model/PaymentSourceTypeAdapterFactory.java b/src/main/java/com/stripe/model/PaymentSourceTypeAdapterFactory.java index 309770b166e..59a32b6884f 100644 --- a/src/main/java/com/stripe/model/PaymentSourceTypeAdapterFactory.java +++ b/src/main/java/com/stripe/model/PaymentSourceTypeAdapterFactory.java @@ -25,8 +25,6 @@ public TypeAdapter create(Gson gson, TypeToken type) { } final String discriminator = "object"; final TypeAdapter jsonElementAdapter = gson.getAdapter(JsonElement.class); - final TypeAdapter paymentSourceAdapter = - gson.getDelegateAdapter(this, TypeToken.get(com.stripe.model.PaymentSource.class)); final TypeAdapter accountAdapter = gson.getDelegateAdapter(this, TypeToken.get(com.stripe.model.Account.class)); final TypeAdapter bankAccountAdapter = @@ -40,7 +38,12 @@ public TypeAdapter create(Gson gson, TypeToken type) { new TypeAdapter() { @Override public void write(JsonWriter out, PaymentSource value) throws IOException { - paymentSourceAdapter.write(out, value); + @SuppressWarnings("unchecked") + TypeAdapter adapter = + (TypeAdapter) + gson.getDelegateAdapter( + PaymentSourceTypeAdapterFactory.this, TypeToken.get(value.getClass())); + adapter.write(out, value); } @Override From 191492e44244269a6ec9b894e511c9544a73ef73 Mon Sep 17 00:00:00 2001 From: jar-stripe Date: Wed, 4 Mar 2026 14:42:58 -0800 Subject: [PATCH 2/5] Support serializing Stripe objects with ApiResource.GSON (#2168) --- ...ceTransactionSourceTypeAdapterFactory.java | 11 +- .../ExternalAccountTypeAdapterFactory.java | 9 +- .../PaymentSourceTypeAdapterFactory.java | 9 +- .../model/StripeRawJsonObjectSerializer.java | 18 +++ src/main/java/com/stripe/net/ApiResource.java | 2 + .../com/stripe/model/GsonRoundTripTest.java | 144 ++++++++++++++++++ .../java/com/stripe/model/InvoiceTest.java | 17 +++ 7 files changed, 200 insertions(+), 10 deletions(-) create mode 100644 src/main/java/com/stripe/model/StripeRawJsonObjectSerializer.java create mode 100644 src/test/java/com/stripe/model/GsonRoundTripTest.java diff --git a/src/main/java/com/stripe/model/BalanceTransactionSourceTypeAdapterFactory.java b/src/main/java/com/stripe/model/BalanceTransactionSourceTypeAdapterFactory.java index 29e3c7c60be..fc84822c515 100644 --- a/src/main/java/com/stripe/model/BalanceTransactionSourceTypeAdapterFactory.java +++ b/src/main/java/com/stripe/model/BalanceTransactionSourceTypeAdapterFactory.java @@ -25,9 +25,6 @@ public TypeAdapter create(Gson gson, TypeToken type) { } final String discriminator = "object"; final TypeAdapter jsonElementAdapter = gson.getAdapter(JsonElement.class); - final TypeAdapter balanceTransactionSourceAdapter = - gson.getDelegateAdapter( - this, TypeToken.get(com.stripe.model.BalanceTransactionSource.class)); final TypeAdapter applicationFeeAdapter = gson.getDelegateAdapter(this, TypeToken.get(com.stripe.model.ApplicationFee.class)); final TypeAdapter chargeAdapter = @@ -68,7 +65,13 @@ public TypeAdapter create(Gson gson, TypeToken type) { new TypeAdapter() { @Override public void write(JsonWriter out, BalanceTransactionSource value) throws IOException { - balanceTransactionSourceAdapter.write(out, value); + @SuppressWarnings("unchecked") + TypeAdapter adapter = + (TypeAdapter) + gson.getDelegateAdapter( + BalanceTransactionSourceTypeAdapterFactory.this, + TypeToken.get(value.getClass())); + adapter.write(out, value); } @Override diff --git a/src/main/java/com/stripe/model/ExternalAccountTypeAdapterFactory.java b/src/main/java/com/stripe/model/ExternalAccountTypeAdapterFactory.java index 1d24a1d21a3..a4c99067782 100644 --- a/src/main/java/com/stripe/model/ExternalAccountTypeAdapterFactory.java +++ b/src/main/java/com/stripe/model/ExternalAccountTypeAdapterFactory.java @@ -28,8 +28,6 @@ public TypeAdapter create(Gson gson, TypeToken type) { } final String discriminator = "object"; final TypeAdapter jsonElementAdapter = gson.getAdapter(JsonElement.class); - final TypeAdapter externalAccountAdapter = - gson.getDelegateAdapter(this, TypeToken.get(com.stripe.model.ExternalAccount.class)); final TypeAdapter bankAccountAdapter = gson.getDelegateAdapter(this, TypeToken.get(com.stripe.model.BankAccount.class)); final TypeAdapter cardAdapter = @@ -39,7 +37,12 @@ public TypeAdapter create(Gson gson, TypeToken type) { new TypeAdapter() { @Override public void write(JsonWriter out, ExternalAccount value) throws IOException { - externalAccountAdapter.write(out, value); + @SuppressWarnings("unchecked") + TypeAdapter adapter = + (TypeAdapter) + gson.getDelegateAdapter( + ExternalAccountTypeAdapterFactory.this, TypeToken.get(value.getClass())); + adapter.write(out, value); } @Override diff --git a/src/main/java/com/stripe/model/PaymentSourceTypeAdapterFactory.java b/src/main/java/com/stripe/model/PaymentSourceTypeAdapterFactory.java index 309770b166e..59a32b6884f 100644 --- a/src/main/java/com/stripe/model/PaymentSourceTypeAdapterFactory.java +++ b/src/main/java/com/stripe/model/PaymentSourceTypeAdapterFactory.java @@ -25,8 +25,6 @@ public TypeAdapter create(Gson gson, TypeToken type) { } final String discriminator = "object"; final TypeAdapter jsonElementAdapter = gson.getAdapter(JsonElement.class); - final TypeAdapter paymentSourceAdapter = - gson.getDelegateAdapter(this, TypeToken.get(com.stripe.model.PaymentSource.class)); final TypeAdapter accountAdapter = gson.getDelegateAdapter(this, TypeToken.get(com.stripe.model.Account.class)); final TypeAdapter bankAccountAdapter = @@ -40,7 +38,12 @@ public TypeAdapter create(Gson gson, TypeToken type) { new TypeAdapter() { @Override public void write(JsonWriter out, PaymentSource value) throws IOException { - paymentSourceAdapter.write(out, value); + @SuppressWarnings("unchecked") + TypeAdapter adapter = + (TypeAdapter) + gson.getDelegateAdapter( + PaymentSourceTypeAdapterFactory.this, TypeToken.get(value.getClass())); + adapter.write(out, value); } @Override diff --git a/src/main/java/com/stripe/model/StripeRawJsonObjectSerializer.java b/src/main/java/com/stripe/model/StripeRawJsonObjectSerializer.java new file mode 100644 index 00000000000..b72548746d6 --- /dev/null +++ b/src/main/java/com/stripe/model/StripeRawJsonObjectSerializer.java @@ -0,0 +1,18 @@ +package com.stripe.model; + +import com.google.gson.JsonElement; +import com.google.gson.JsonNull; +import com.google.gson.JsonSerializationContext; +import com.google.gson.JsonSerializer; +import java.lang.reflect.Type; + +public class StripeRawJsonObjectSerializer implements JsonSerializer { + @Override + public JsonElement serialize( + StripeRawJsonObject src, Type typeOfSrc, JsonSerializationContext context) { + if (src.json != null) { + return src.json; + } + return JsonNull.INSTANCE; + } +} diff --git a/src/main/java/com/stripe/net/ApiResource.java b/src/main/java/com/stripe/net/ApiResource.java index d23ce045463..8f6abb033a0 100644 --- a/src/main/java/com/stripe/net/ApiResource.java +++ b/src/main/java/com/stripe/net/ApiResource.java @@ -57,9 +57,11 @@ private static Gson createGson(boolean shouldSetResponseGetter) { .registerTypeAdapter(Event.Request.class, new EventRequestDeserializer()) .registerTypeAdapter(StripeContext.class, new StripeContextDeserializer()) .registerTypeAdapter(ExpandableField.class, new ExpandableFieldDeserializer()) + .registerTypeAdapter(ExpandableField.class, new ExpandableFieldSerializer()) .registerTypeAdapter(Instant.class, new InstantDeserializer()) .registerTypeAdapterFactory(new EventTypeAdapterFactory()) .registerTypeAdapter(StripeRawJsonObject.class, new StripeRawJsonObjectDeserializer()) + .registerTypeAdapter(StripeRawJsonObject.class, new StripeRawJsonObjectSerializer()) .registerTypeAdapterFactory(new StripeCollectionItemTypeSettingFactory()) .addReflectionAccessFilter( new ReflectionAccessFilter() { diff --git a/src/test/java/com/stripe/model/GsonRoundTripTest.java b/src/test/java/com/stripe/model/GsonRoundTripTest.java new file mode 100644 index 00000000000..1e1763c5b6d --- /dev/null +++ b/src/test/java/com/stripe/model/GsonRoundTripTest.java @@ -0,0 +1,144 @@ +package com.stripe.model; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertNull; +import static org.junit.jupiter.api.Assertions.assertTrue; + +import com.google.gson.JsonObject; +import com.google.gson.JsonParser; +import com.stripe.BaseStripeTest; +import com.stripe.net.ApiResource; +import org.junit.jupiter.api.Test; + +public class GsonRoundTripTest extends BaseStripeTest { + + @Test + public void testUnexpandedExpandableField() { + String json = "{\"id\":\"in_123\",\"object\":\"invoice\",\"customer\":\"cus_456\"}"; + Invoice invoice = ApiResource.GSON.fromJson(json, Invoice.class); + + assertEquals("cus_456", invoice.getCustomer()); + assertNull(invoice.getCustomerObject()); + + String serialized = ApiResource.GSON.toJson(invoice); + Invoice roundTripped = ApiResource.GSON.fromJson(serialized, Invoice.class); + + assertEquals("cus_456", roundTripped.getCustomer()); + assertNull(roundTripped.getCustomerObject()); + } + + @Test + public void testExpandedExpandableField() { + String json = + "{\"id\":\"in_123\",\"object\":\"invoice\"," + + "\"customer\":{\"id\":\"cus_456\",\"object\":\"customer\"," + + "\"name\":\"John Doe\",\"metadata\":{\"key\":\"value\"}}}"; + Invoice invoice = ApiResource.GSON.fromJson(json, Invoice.class); + + assertEquals("cus_456", invoice.getCustomer()); + Customer customer = invoice.getCustomerObject(); + assertNotNull(customer); + assertEquals("cus_456", customer.getId()); + assertEquals("John Doe", customer.getName()); + + String serialized = ApiResource.GSON.toJson(invoice); + Invoice roundTripped = ApiResource.GSON.fromJson(serialized, Invoice.class); + + assertEquals("cus_456", roundTripped.getCustomer()); + Customer rtCustomer = roundTripped.getCustomerObject(); + assertNotNull(rtCustomer); + assertEquals("cus_456", rtCustomer.getId()); + assertEquals("John Doe", rtCustomer.getName()); + assertEquals("value", rtCustomer.getMetadata().get("key")); + } + + @Test + public void testNullExpandableField() { + String json = "{\"id\":\"in_123\",\"object\":\"invoice\",\"customer\":null}"; + Invoice invoice = ApiResource.GSON.fromJson(json, Invoice.class); + + assertNull(invoice.getCustomer()); + assertNull(invoice.getCustomerObject()); + + String serialized = ApiResource.GSON.toJson(invoice); + Invoice roundTripped = ApiResource.GSON.fromJson(serialized, Invoice.class); + + assertNull(roundTripped.getCustomer()); + assertNull(roundTripped.getCustomerObject()); + } + + @Test + public void testPaymentSourceDirectField() { + // Charge.source is a direct PaymentSource field (not ExpandableField) + String json = + "{\"id\":\"ch_123\",\"object\":\"charge\"," + + "\"source\":{\"id\":\"card_789\",\"object\":\"card\"," + + "\"brand\":\"Visa\",\"last4\":\"4242\"}}"; + Charge charge = ApiResource.GSON.fromJson(json, Charge.class); + + assertNotNull(charge.getSource()); + assertTrue(charge.getSource() instanceof Card); + assertEquals("card_789", charge.getSource().getId()); + + String serialized = ApiResource.GSON.toJson(charge); + Charge roundTripped = ApiResource.GSON.fromJson(serialized, Charge.class); + + assertNotNull(roundTripped.getSource()); + assertTrue(roundTripped.getSource() instanceof Card); + assertEquals("card_789", roundTripped.getSource().getId()); + assertEquals("Visa", ((Card) roundTripped.getSource()).getBrand()); + assertEquals("4242", ((Card) roundTripped.getSource()).getLast4()); + } + + @Test + public void testStripeRawJsonObjectRoundTrip() { + String innerJson = "{\"id\":\"unknown_123\",\"object\":\"unknown_type\",\"foo\":\"bar\"}"; + StripeRawJsonObject raw = new StripeRawJsonObject(); + raw.json = JsonParser.parseString(innerJson).getAsJsonObject(); + + String serialized = ApiResource.GSON.toJson(raw); + // Should serialize as the raw JSON, not wrapped in {"json":{...}} + JsonObject parsed = JsonParser.parseString(serialized).getAsJsonObject(); + assertEquals("unknown_123", parsed.get("id").getAsString()); + assertEquals("bar", parsed.get("foo").getAsString()); + + StripeRawJsonObject roundTripped = + ApiResource.GSON.fromJson(serialized, StripeRawJsonObject.class); + assertNotNull(roundTripped.json); + assertEquals("unknown_123", roundTripped.json.get("id").getAsString()); + assertEquals("bar", roundTripped.json.get("foo").getAsString()); + } + + @Test + public void testInvoiceWithExpandedCustomerRoundTrip() throws Exception { + // Realistic scenario from RUN_DEVSDK-2253 + final String[] expansions = {"customer"}; + final String data = getFixture("/v1/invoices/in_123", expansions); + final Invoice original = ApiResource.GSON.fromJson(data, Invoice.class); + + assertNotNull(original.getCustomerObject()); + assertEquals(original.getCustomer(), original.getCustomerObject().getId()); + + String serialized = ApiResource.GSON.toJson(original); + Invoice roundTripped = ApiResource.GSON.fromJson(serialized, Invoice.class); + + assertEquals(original.getId(), roundTripped.getId()); + assertEquals(original.getCustomer(), roundTripped.getCustomer()); + assertNotNull(roundTripped.getCustomerObject()); + assertEquals(original.getCustomerObject().getId(), roundTripped.getCustomerObject().getId()); + } + + @Test + public void testSubscriptionWithDefaultSourceRoundTrip() throws Exception { + // Realistic scenario from DEVSDK-2319 + final String[] expansions = {"default_source"}; + final String data = getFixture("/v1/subscriptions/sub_123", expansions); + final Subscription original = ApiResource.GSON.fromJson(data, Subscription.class); + + String serialized = ApiResource.GSON.toJson(original); + Subscription roundTripped = ApiResource.GSON.fromJson(serialized, Subscription.class); + + assertEquals(original.getId(), roundTripped.getId()); + } +} diff --git a/src/test/java/com/stripe/model/InvoiceTest.java b/src/test/java/com/stripe/model/InvoiceTest.java index f6c6a07c46b..edf74e992b1 100644 --- a/src/test/java/com/stripe/model/InvoiceTest.java +++ b/src/test/java/com/stripe/model/InvoiceTest.java @@ -48,6 +48,23 @@ public void testDeserializeWithUnexpandedArrayExpansions() throws Exception { assertEquals(2, invoice.getDiscountObjects().size()); } + @Test + public void testRoundTripWithExpandedCustomer() throws Exception { + final String[] expansions = {"charge", "customer"}; + final String data = getFixture("/v1/invoices/in_123", expansions); + final Invoice original = ApiResource.GSON.fromJson(data, Invoice.class); + + assertNotNull(original.getCustomerObject()); + + String serialized = ApiResource.GSON.toJson(original); + Invoice roundTripped = ApiResource.GSON.fromJson(serialized, Invoice.class); + + assertEquals(original.getId(), roundTripped.getId()); + assertEquals(original.getCustomer(), roundTripped.getCustomer()); + assertNotNull(roundTripped.getCustomerObject()); + assertEquals(original.getCustomerObject().getId(), roundTripped.getCustomerObject().getId()); + } + @Test public void testDeserializeWithArrayExpansions() throws Exception { final Invoice invoice = From 7cc0ea70240d29a9b76c348d30625fff7740095e Mon Sep 17 00:00:00 2001 From: Stripe OpenAPI <105521251+stripe-openapi[bot]@users.noreply.github.com> Date: Thu, 5 Mar 2026 21:43:57 +0000 Subject: [PATCH 3/5] Update generated code for v2189 and --- CODEGEN_VERSION | 2 +- src/main/java/com/stripe/model/v2/core/Event.java | 7 +++++-- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/CODEGEN_VERSION b/CODEGEN_VERSION index 35857003ccc..58968e13793 100644 --- a/CODEGEN_VERSION +++ b/CODEGEN_VERSION @@ -1 +1 @@ -e382d3775a1654ee3c0e28a2c8e33704a1312132 \ No newline at end of file +c2fdb8b70a4520e54d461041362bece6a6df54e9 \ No newline at end of file diff --git a/src/main/java/com/stripe/model/v2/core/Event.java b/src/main/java/com/stripe/model/v2/core/Event.java index c19c433c879..ecc2fc1e21d 100644 --- a/src/main/java/com/stripe/model/v2/core/Event.java +++ b/src/main/java/com/stripe/model/v2/core/Event.java @@ -98,12 +98,15 @@ protected StripeObject fetchRelatedObject(RelatedObject relatedObject) throws St objectClass = StripeRawJsonObject.class; } - RequestOptions opts = null; + RequestOptions.RequestOptionsBuilder optsBuilder = new RequestOptions.RequestOptionsBuilder(); + // optsBuilder.setStripeRequestTrigger("event=" + id); // TODO https://go/j/DEVSDK-3018 if (context != null) { - opts = new RequestOptions.RequestOptionsBuilder().setStripeAccount(context).build(); + optsBuilder.setStripeAccount(context); } + RequestOptions opts = optsBuilder.build(); + return this.responseGetter.request( new ApiRequest( BaseAddress.API, ApiResource.RequestMethod.GET, relatedObject.getUrl(), null, opts), From 90f1d9b1c4820a0d6cfb19ba4aa0d06738967734 Mon Sep 17 00:00:00 2001 From: David Brownman <109395161+xavdid-stripe@users.noreply.github.com> Date: Fri, 6 Mar 2026 10:20:47 -0800 Subject: [PATCH 4/5] add new agent keys (#2173) --- src/main/java/com/stripe/model/v2/core/Event.java | 7 +++++-- src/main/java/com/stripe/net/HttpClient.java | 5 +++++ 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/stripe/model/v2/core/Event.java b/src/main/java/com/stripe/model/v2/core/Event.java index 1c9b0fed797..17d4f3dfd5a 100644 --- a/src/main/java/com/stripe/model/v2/core/Event.java +++ b/src/main/java/com/stripe/model/v2/core/Event.java @@ -98,12 +98,15 @@ protected StripeObject fetchRelatedObject(RelatedObject relatedObject) throws St objectClass = StripeRawJsonObject.class; } - RequestOptions opts = null; + RequestOptions.RequestOptionsBuilder optsBuilder = new RequestOptions.RequestOptionsBuilder(); + // optsBuilder.setStripeRequestTrigger("event=" + id); // TODO https://go/j/DEVSDK-3018 if (context != null) { - opts = new RequestOptions.RequestOptionsBuilder().setStripeAccount(context).build(); + optsBuilder.setStripeAccount(context); } + RequestOptions opts = optsBuilder.build(); + return this.responseGetter.request( new ApiRequest( BaseAddress.API, ApiResource.RequestMethod.GET, relatedObject.getUrl(), null, opts), diff --git a/src/main/java/com/stripe/net/HttpClient.java b/src/main/java/com/stripe/net/HttpClient.java index ebbae9e9842..60c5f3e607b 100644 --- a/src/main/java/com/stripe/net/HttpClient.java +++ b/src/main/java/com/stripe/net/HttpClient.java @@ -144,13 +144,18 @@ static String detectAIAgent() { static String detectAIAgent(Function getEnv) { String[][] agents = { + // The beginning of the section generated from our OpenAPI spec {"ANTIGRAVITY_CLI_ALIAS", "antigravity"}, {"CLAUDECODE", "claude_code"}, {"CLINE_ACTIVE", "cline"}, {"CODEX_SANDBOX", "codex_cli"}, + {"CODEX_THREAD_ID", "codex_cli"}, + {"CODEX_SANDBOX_NETWORK_DISABLED", "codex_cli"}, + {"CODEX_CI", "codex_cli"}, {"CURSOR_AGENT", "cursor"}, {"GEMINI_CLI", "gemini_cli"}, {"OPENCODE", "open_code"}, + // The end of the section generated from our OpenAPI spec }; for (String[] agent : agents) { String val = getEnv.apply(agent[0]); From 7a960f1e4e1342fec98e7e87d993d102141aace8 Mon Sep 17 00:00:00 2001 From: David Brownman Date: Fri, 6 Mar 2026 14:51:19 -0800 Subject: [PATCH 5/5] Bump version to 31.4.1 --- CHANGELOG.md | 5 +++++ README.md | 10 +++++----- VERSION | 2 +- gradle.properties | 2 +- src/main/java/com/stripe/Stripe.java | 2 +- 5 files changed, 13 insertions(+), 8 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index d2023d220de..de0b98767cf 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,10 @@ # Changelog +## 31.4.1 - 2026-03-06 +* [#2168](https://github.com/stripe/stripe-java/pull/2168) Support serializing Stripe objects with ApiResource.GSON + * `ApiResource.GSON` now supports serializing Stripe objects back into compatible JSON +* [#2165](https://github.com/stripe/stripe-java/pull/2165) Add AI Agent information to UserAgent + ## 31.4.0 - 2026-02-25 This release changes the pinned API version to `2026-02-25.clover`. diff --git a/README.md b/README.md index 178aea5c8db..5fb6b3ee362 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # Stripe Java client library -[![Maven Central](https://img.shields.io/badge/maven--central-v31.4.0-blue)](https://mvnrepository.com/artifact/com.stripe/stripe-java) +[![Maven Central](https://img.shields.io/badge/maven--central-v31.4.1-blue)](https://mvnrepository.com/artifact/com.stripe/stripe-java) [![JavaDoc](http://img.shields.io/badge/javadoc-reference-blue.svg)](https://stripe.dev/stripe-java) [![Build Status](https://github.com/stripe/stripe-java/actions/workflows/ci.yml/badge.svg?branch=master)](https://github.com/stripe/stripe-java/actions?query=branch%3Amaster) @@ -23,7 +23,7 @@ We support LTS versions of the JDK. Currently, that's Java versions: Add this dependency to your project's build file: ```groovy -implementation "com.stripe:stripe-java:31.4.0" +implementation "com.stripe:stripe-java:31.4.1" ``` ### Maven users @@ -34,7 +34,7 @@ Add this dependency to your project's POM: com.stripe stripe-java - 31.4.0 + 31.4.1 ``` @@ -43,8 +43,8 @@ Add this dependency to your project's POM: If you are not using Gradle or Maven, you will need to manually install the following JARs: 1. The Stripe JAR: - - Download the latest release version from [Maven Central](https://repo1.maven.org/maven2/com/stripe/stripe-java/31.4.0/stripe-java-31.4.0.jar) - - Current release version: 31.4.0 + - Download the latest release version from [Maven Central](https://repo1.maven.org/maven2/com/stripe/stripe-java/31.4.1/stripe-java-31.4.1.jar) + - Current release version: 31.4.1 2. Google Gson: - The Stripe JAR builds and tests with Gson version 2.10.1 diff --git a/VERSION b/VERSION index 9f123c2b87f..5ea9e3e99ca 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -31.4.0 +31.4.1 diff --git a/gradle.properties b/gradle.properties index dd9744ae5bc..1343a12179c 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,5 +1,5 @@ GROUP=com.stripe -VERSION_NAME=31.4.0 +VERSION_NAME=31.4.1 POM_URL=https://github.com/stripe/stripe-java POM_SCM_URL=git@github.com:stripe/stripe-java.git diff --git a/src/main/java/com/stripe/Stripe.java b/src/main/java/com/stripe/Stripe.java index e837311dd76..52b74db33bb 100644 --- a/src/main/java/com/stripe/Stripe.java +++ b/src/main/java/com/stripe/Stripe.java @@ -14,7 +14,7 @@ public abstract class Stripe { public static final String LIVE_API_BASE = "https://api.stripe.com"; public static final String UPLOAD_API_BASE = "https://files.stripe.com"; public static final String METER_EVENTS_API_BASE = "https://meter-events.stripe.com"; - public static final String VERSION = "31.4.0"; + public static final String VERSION = "31.4.1"; public static volatile String apiKey; public static volatile String clientId;