Propagate another subscription processor error to clients

This commit is contained in:
Chris Eager 2023-12-14 14:40:08 -06:00 committed by GitHub
parent 3548c3df15
commit bb347999ce
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
1 changed files with 44 additions and 34 deletions

View File

@ -285,14 +285,8 @@ public class StripeManager implements SubscriptionProcessorManager {
} catch (StripeException e) { } catch (StripeException e) {
if (e instanceof CardException ce) { if (e instanceof CardException ce) {
throw new CompletionException(new SubscriptionProcessorException(getProcessor(), throw new CompletionException(
new ChargeFailure( new SubscriptionProcessorException(getProcessor(), createChargeFailureFromCardException(e, ce)));
StringUtils.defaultIfBlank(ce.getDeclineCode(), ce.getCode()),
e.getStripeError().getMessage(),
null,
null,
null
)));
} }
throw new CompletionException(e); throw new CompletionException(e);
@ -308,39 +302,45 @@ public class StripeManager implements SubscriptionProcessorManager {
final Subscription subscription = getSubscription(subscriptionObj); final Subscription subscription = getSubscription(subscriptionObj);
return CompletableFuture.supplyAsync(() -> { return CompletableFuture.supplyAsync(() -> {
List<SubscriptionUpdateParams.Item> items = new ArrayList<>(); List<SubscriptionUpdateParams.Item> items = new ArrayList<>();
try { try {
final StripeCollection<SubscriptionItem> subscriptionItems = stripeClient.subscriptionItems() final StripeCollection<SubscriptionItem> subscriptionItems = stripeClient.subscriptionItems()
.list(SubscriptionItemListParams.builder().setSubscription(subscription.getId()).build(), .list(SubscriptionItemListParams.builder().setSubscription(subscription.getId()).build(),
commonOptions()); commonOptions());
for (final SubscriptionItem item : subscriptionItems.autoPagingIterable()) { for (final SubscriptionItem item : subscriptionItems.autoPagingIterable()) {
items.add(SubscriptionUpdateParams.Item.builder()
.setId(item.getId())
.setDeleted(true)
.build());
}
items.add(SubscriptionUpdateParams.Item.builder() items.add(SubscriptionUpdateParams.Item.builder()
.setPrice(priceId) .setId(item.getId())
.build()); .setDeleted(true)
SubscriptionUpdateParams params = SubscriptionUpdateParams.builder() .build());
.putMetadata(METADATA_KEY_LEVEL, Long.toString(level)) }
items.add(SubscriptionUpdateParams.Item.builder()
.setPrice(priceId)
.build());
SubscriptionUpdateParams params = SubscriptionUpdateParams.builder()
.putMetadata(METADATA_KEY_LEVEL, Long.toString(level))
// since badge redemption is untrackable by design and unrevokable, subscription changes must be immediate and // since badge redemption is untrackable by design and unrevokable, subscription changes must be immediate and
// not prorated // not prorated
.setProrationBehavior(ProrationBehavior.NONE) .setProrationBehavior(ProrationBehavior.NONE)
.setBillingCycleAnchor(BillingCycleAnchor.NOW) .setBillingCycleAnchor(BillingCycleAnchor.NOW)
.setOffSession(true) .setOffSession(true)
.setPaymentBehavior(SubscriptionUpdateParams.PaymentBehavior.ERROR_IF_INCOMPLETE) .setPaymentBehavior(SubscriptionUpdateParams.PaymentBehavior.ERROR_IF_INCOMPLETE)
.addAllItem(items) .addAllItem(items)
.build(); .build();
return stripeClient.subscriptions().update(subscription.getId(), params, return stripeClient.subscriptions().update(subscription.getId(), params,
commonOptions( commonOptions(
generateIdempotencyKeyForSubscriptionUpdate(subscription.getCustomer(), idempotencyKey))); generateIdempotencyKeyForSubscriptionUpdate(subscription.getCustomer(), idempotencyKey)));
} catch (StripeException e) { } catch (StripeException e) {
throw new CompletionException(e);
} if (e instanceof CardException ce) {
}, executor) throw new CompletionException(
.thenApply(subscription1 -> new SubscriptionId(subscription1.getId())); new SubscriptionProcessorException(getProcessor(), createChargeFailureFromCardException(e, ce)));
}
throw new CompletionException(e);
}
}, executor)
.thenApply(subscription1 -> new SubscriptionId(subscription1.getId()));
} }
public CompletableFuture<Object> getSubscription(String subscriptionId) { public CompletableFuture<Object> getSubscription(String subscriptionId) {
@ -504,6 +504,16 @@ public class StripeManager implements SubscriptionProcessorManager {
outcome != null ? outcome.getType() : null); outcome != null ? outcome.getType() : null);
} }
private static ChargeFailure createChargeFailureFromCardException(StripeException e, CardException ce) {
return new ChargeFailure(
StringUtils.defaultIfBlank(ce.getDeclineCode(), ce.getCode()),
e.getStripeError().getMessage(),
null,
null,
null
);
}
@Override @Override
public CompletableFuture<SubscriptionInformation> getSubscriptionInformation(Object subscriptionObj) { public CompletableFuture<SubscriptionInformation> getSubscriptionInformation(Object subscriptionObj) {