From ccf72a45db1eec8fa4ab9e4d08768c78e7ad8e11 Mon Sep 17 00:00:00 2001 From: Chris Eager Date: Wed, 29 Oct 2025 10:45:51 -0500 Subject: [PATCH] Migrate Stripe usage to V1Services --- .../subscriptions/StripeManager.java | 40 +++++++++---------- .../subscriptions/StripeManagerTest.java | 17 +++++--- 2 files changed, 31 insertions(+), 26 deletions(-) diff --git a/service/src/main/java/org/whispersystems/textsecuregcm/subscriptions/StripeManager.java b/service/src/main/java/org/whispersystems/textsecuregcm/subscriptions/StripeManager.java index 6d1e19391..44ca89b81 100644 --- a/service/src/main/java/org/whispersystems/textsecuregcm/subscriptions/StripeManager.java +++ b/service/src/main/java/org/whispersystems/textsecuregcm/subscriptions/StripeManager.java @@ -156,7 +156,7 @@ public class StripeManager implements CustomerAwareSubscriptionPaymentProcessor } try { - final Customer customer = stripeClient.customers() + final Customer customer = stripeClient.v1().customers() .create(builder.build(), commonOptions(generateIdempotencyKeyForSubscriberUser(subscriberUser))); return new ProcessorCustomer(customer.getId(), getProvider()); } catch (StripeException e) { @@ -167,7 +167,7 @@ public class StripeManager implements CustomerAwareSubscriptionPaymentProcessor public Customer getCustomer(String customerId) { CustomerRetrieveParams params = CustomerRetrieveParams.builder().build(); try { - return stripeClient.customers().retrieve(customerId, params, commonOptions()); + return stripeClient.v1().customers().retrieve(customerId, params, commonOptions()); } catch (StripeException e) { throw new UncheckedIOException(new IOException(e)); } @@ -182,7 +182,7 @@ public class StripeManager implements CustomerAwareSubscriptionPaymentProcessor .build()) .build(); try { - stripeClient.customers().update(customerId, params, commonOptions()); + stripeClient.v1().customers().update(customerId, params, commonOptions()); } catch (InvalidRequestException e) { // Could happen if the paymentMethodId was bunk or the client didn't actually finish setting it up throw new SubscriptionInvalidArgumentsException(e.getMessage()); @@ -197,7 +197,7 @@ public class StripeManager implements CustomerAwareSubscriptionPaymentProcessor .setCustomer(customerId) .build(); try { - return stripeClient.setupIntents().create(params, commonOptions()).getClientSecret(); + return stripeClient.v1().setupIntents().create(params, commonOptions()).getClientSecret(); } catch (StripeException e) { throw new UncheckedIOException(new IOException(e)); } @@ -230,7 +230,7 @@ public class StripeManager implements CustomerAwareSubscriptionPaymentProcessor } try { - return stripeClient.paymentIntents().create(builder.build(), commonOptions()); + return stripeClient.v1().paymentIntents().create(builder.build(), commonOptions()); } catch (StripeException e) { final String errorCode = StringUtils.lowerCase(e.getCode(), Locale.ROOT); switch (errorCode) { @@ -247,7 +247,7 @@ public class StripeManager implements CustomerAwareSubscriptionPaymentProcessor try { final PaymentIntentRetrieveParams params = PaymentIntentRetrieveParams.builder() .addExpand("latest_charge").build(); - final PaymentIntent paymentIntent = stripeClient.paymentIntents().retrieve(paymentIntentId, params, commonOptions()); + final PaymentIntent paymentIntent = stripeClient.v1().paymentIntents().retrieve(paymentIntentId, params, commonOptions()); ChargeFailure chargeFailure = null; if (paymentIntent.getLatestChargeObject() != null) { @@ -304,7 +304,7 @@ public class StripeManager implements CustomerAwareSubscriptionPaymentProcessor // // If the client tells the server several times in a row before the initial creation of a subscription to // create a subscription, we want to ensure only one gets created. - final Subscription subscription = stripeClient.subscriptions().create( + final Subscription subscription = stripeClient.v1().subscriptions().create( params, commonOptions(generateIdempotencyKeyForCreateSubscription(customerId, lastSubscriptionCreatedAt))); return new SubscriptionId(subscription.getId()); @@ -334,7 +334,7 @@ public class StripeManager implements CustomerAwareSubscriptionPaymentProcessor List items = new ArrayList<>(); try { - final StripeCollection subscriptionItems = stripeClient.subscriptionItems() + final StripeCollection subscriptionItems = stripeClient.v1().subscriptionItems() .list(SubscriptionItemListParams.builder().setSubscription(subscription.getId()).build(), commonOptions()); for (final SubscriptionItem item : subscriptionItems.autoPagingIterable()) { @@ -357,7 +357,7 @@ public class StripeManager implements CustomerAwareSubscriptionPaymentProcessor .setPaymentBehavior(SubscriptionUpdateParams.PaymentBehavior.ERROR_IF_INCOMPLETE) .addAllItem(items) .build(); - final Subscription subscription1 = stripeClient.subscriptions().update(subscription.getId(), params, + final Subscription subscription1 = stripeClient.v1().subscriptions().update(subscription.getId(), params, commonOptions(generateIdempotencyKeyForSubscriptionUpdate(subscription.getCustomer(), idempotencyKey))); return new SubscriptionId(subscription1.getId()); } catch (IdempotencyException e) { @@ -375,7 +375,7 @@ public class StripeManager implements CustomerAwareSubscriptionPaymentProcessor .addExpand("latest_invoice.payments.data.payment") .build(); try { - return stripeClient.subscriptions().retrieve(subscriptionId, params, commonOptions()); + return stripeClient.v1().subscriptions().retrieve(subscriptionId, params, commonOptions()); } catch (StripeException e) { throw new UncheckedIOException(new IOException(e)); } @@ -386,7 +386,7 @@ public class StripeManager implements CustomerAwareSubscriptionPaymentProcessor .addExpand("latest_charge") .build(); try { - return stripeClient.paymentIntents().retrieve(paymentIntentId, params, commonOptions()); + return stripeClient.v1().paymentIntents().retrieve(paymentIntentId, params, commonOptions()); } catch (StripeException e) { throw new UncheckedIOException(new IOException(e)); } @@ -396,7 +396,7 @@ public class StripeManager implements CustomerAwareSubscriptionPaymentProcessor ChargeRetrieveParams params = ChargeRetrieveParams.builder() .build(); try { - return stripeClient.charges().retrieve(chargeId, params, commonOptions()); + return stripeClient.v1().charges().retrieve(chargeId, params, commonOptions()); } catch (StripeException e) { throw new UncheckedIOException(new IOException(e)); } @@ -431,7 +431,7 @@ public class StripeManager implements CustomerAwareSubscriptionPaymentProcessor .build(); try { return Lists.newArrayList( - stripeClient.subscriptions().list(params, commonOptions()).autoPagingIterable()); + stripeClient.v1().subscriptions().list(params, commonOptions()).autoPagingIterable()); } catch (StripeException e) { throw new UncheckedIOException(new IOException(e)); } @@ -452,7 +452,7 @@ public class StripeManager implements CustomerAwareSubscriptionPaymentProcessor private Subscription cancelSubscriptionImmediately(Subscription subscription) { SubscriptionCancelParams params = SubscriptionCancelParams.builder().build(); try { - return stripeClient.subscriptions().cancel(subscription.getId(), params, commonOptions()); + return stripeClient.v1().subscriptions().cancel(subscription.getId(), params, commonOptions()); } catch (StripeException e) { throw new UncheckedIOException(new IOException(e)); } @@ -463,7 +463,7 @@ public class StripeManager implements CustomerAwareSubscriptionPaymentProcessor .setCancelAtPeriodEnd(true) .build(); try { - return stripeClient.subscriptions().update(subscription.getId(), params, commonOptions()); + return stripeClient.v1().subscriptions().update(subscription.getId(), params, commonOptions()); } catch (StripeException e) { throw new UncheckedIOException(new IOException(e)); } @@ -471,7 +471,7 @@ public class StripeManager implements CustomerAwareSubscriptionPaymentProcessor public Collection getItemsForSubscription(Subscription subscription) { try { - final StripeCollection subscriptionItems = stripeClient.subscriptionItems().list( + final StripeCollection subscriptionItems = stripeClient.v1().subscriptionItems().list( SubscriptionItemListParams.builder().setSubscription(subscription.getId()).build(), commonOptions()); return Lists.newArrayList(subscriptionItems.autoPagingIterable()); @@ -513,7 +513,7 @@ public class StripeManager implements CustomerAwareSubscriptionPaymentProcessor public Product getProductForPrice(String priceId) { PriceRetrieveParams params = PriceRetrieveParams.builder().addExpand("product").build(); try { - return stripeClient.prices().retrieve(priceId, params, commonOptions()).getProductObject(); + return stripeClient.v1().prices().retrieve(priceId, params, commonOptions()).getProductObject(); } catch (StripeException e) { throw new UncheckedIOException(new IOException(e)); } @@ -536,7 +536,7 @@ public class StripeManager implements CustomerAwareSubscriptionPaymentProcessor .build()) .build(); try { - ArrayList invoices = Lists.newArrayList(stripeClient.invoices().list(params, commonOptions()) + ArrayList invoices = Lists.newArrayList(stripeClient.v1().invoices().list(params, commonOptions()) .autoPagingIterable()); invoices.sort(Comparator.comparingLong(Invoice::getCreated).reversed()); return invoices; @@ -724,7 +724,7 @@ public class StripeManager implements CustomerAwareSubscriptionPaymentProcessor public Collection getInvoiceLineItemsForInvoice(Invoice invoice) { try { - final StripeCollection lineItems = stripeClient.invoices().lineItems() + final StripeCollection lineItems = stripeClient.v1().invoices().lineItems() .list(invoice.getId(), commonOptions()); return Lists.newArrayList(lineItems.autoPagingIterable()); } catch (final StripeException e) { @@ -738,7 +738,7 @@ public class StripeManager implements CustomerAwareSubscriptionPaymentProcessor .addExpand("latest_attempt") .build(); try { - final SetupIntent setupIntent = stripeClient.setupIntents().retrieve(setupIntentId, params, commonOptions()); + final SetupIntent setupIntent = stripeClient.v1().setupIntents().retrieve(setupIntentId, params, commonOptions()); if (setupIntent.getLatestAttemptObject() == null || setupIntent.getLatestAttemptObject().getPaymentMethodDetails() == null || setupIntent.getLatestAttemptObject().getPaymentMethodDetails().getIdeal() == null diff --git a/service/src/test/java/org/whispersystems/textsecuregcm/subscriptions/StripeManagerTest.java b/service/src/test/java/org/whispersystems/textsecuregcm/subscriptions/StripeManagerTest.java index 7599573e5..d7759689a 100644 --- a/service/src/test/java/org/whispersystems/textsecuregcm/subscriptions/StripeManagerTest.java +++ b/service/src/test/java/org/whispersystems/textsecuregcm/subscriptions/StripeManagerTest.java @@ -6,12 +6,14 @@ package org.whispersystems.textsecuregcm.subscriptions; import static org.assertj.core.api.Assertions.assertThatExceptionOfType; -import static org.junit.jupiter.api.Assertions.assertTimeoutPreemptively; import static org.mockito.ArgumentMatchers.any; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; import com.stripe.StripeClient; +import com.stripe.exception.ApiException; +import com.stripe.exception.StripeException; +import com.stripe.service.SubscriptionService; import java.nio.charset.StandardCharsets; import java.util.Map; import java.util.Set; @@ -19,9 +21,7 @@ import java.util.UUID; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.TimeUnit; -import com.stripe.exception.ApiException; -import com.stripe.exception.StripeException; -import com.stripe.service.SubscriptionService; +import com.stripe.service.V1Services; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -29,6 +29,7 @@ import org.junit.jupiter.api.Test; class StripeManagerTest { private StripeClient stripeClient; + private SubscriptionService subscriptionService; private StripeManager stripeManager; private ExecutorService executor; @@ -42,6 +43,12 @@ class StripeManagerTest { "idempotencyKey".getBytes(StandardCharsets.UTF_8), "boost", Map.of(PaymentMethod.CARD, Set.of("usd"))); + + final V1Services v1Services = mock(V1Services.class); + when(stripeClient.v1()).thenReturn(v1Services); + + subscriptionService = mock(SubscriptionService.class); + when(v1Services.subscriptions()).thenReturn(subscriptionService); } @AfterEach @@ -52,12 +59,10 @@ class StripeManagerTest { @Test void paymentRequiresAction() throws StripeException { - final SubscriptionService subscriptionService = mock(SubscriptionService.class); final ApiException stripeException = new ApiException("Payment intent requires action", UUID.randomUUID().toString(), "subscription_payment_intent_requires_action", 400, new Exception()); when(subscriptionService.create(any(), any())).thenThrow(stripeException); - when(stripeClient.subscriptions()).thenReturn(subscriptionService); assertThatExceptionOfType(SubscriptionPaymentRequiresActionException.class).isThrownBy(() -> stripeManager.createSubscription("customerId", "priceId", 1, 0)); }