Add method to set default payment method

This commit is contained in:
Ehren Kret 2021-10-14 10:37:12 -05:00
parent f84e7aebd0
commit 75c5032cd3
2 changed files with 37 additions and 4 deletions

View File

@ -11,7 +11,6 @@ import com.fasterxml.jackson.annotation.JsonProperty;
import com.google.common.base.Strings; import com.google.common.base.Strings;
import com.stripe.model.Invoice; import com.stripe.model.Invoice;
import com.stripe.model.InvoiceLineItem; import com.stripe.model.InvoiceLineItem;
import com.stripe.model.Product;
import com.stripe.model.Subscription; import com.stripe.model.Subscription;
import io.dropwizard.auth.Auth; import io.dropwizard.auth.Auth;
import java.math.BigDecimal; import java.math.BigDecimal;
@ -33,6 +32,7 @@ import java.util.stream.Collectors;
import javax.annotation.Nonnull; import javax.annotation.Nonnull;
import javax.crypto.Mac; import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec; import javax.crypto.spec.SecretKeySpec;
import javax.validation.constraints.NotEmpty;
import javax.ws.rs.BadRequestException; import javax.ws.rs.BadRequestException;
import javax.ws.rs.Consumes; import javax.ws.rs.Consumes;
import javax.ws.rs.DELETE; import javax.ws.rs.DELETE;
@ -190,6 +190,22 @@ public class SubscriptionController {
.thenApply(setupIntent -> Response.ok(new CreatePaymentMethodResponse(setupIntent.getClientSecret())).build()); .thenApply(setupIntent -> Response.ok(new CreatePaymentMethodResponse(setupIntent.getClientSecret())).build());
} }
@Timed
@POST
@Path("/{subscriberId}/default_payment_method/{paymentMethodId}")
@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.APPLICATION_JSON)
public CompletableFuture<Response> setDefaultPaymentMethod(
@Auth Optional<AuthenticatedAccount> authenticatedAccount,
@PathParam("subscriberId") String subscriberId,
@PathParam("paymentMethodId") @NotEmpty String paymentMethodId) {
RequestData requestData = RequestData.process(authenticatedAccount, subscriberId, clock);
return subscriptionManager.get(requestData.subscriberUser, requestData.hmac)
.thenApply(this::requireRecordFromGetResult)
.thenCompose(record -> stripeManager.setDefaultPaymentMethodForCustomer(record.customerId, paymentMethodId))
.thenApply(customer -> Response.ok().build());
}
public static class SetSubscriptionLevelSuccessResponse { public static class SetSubscriptionLevelSuccessResponse {
private final long level; private final long level;
@ -587,8 +603,7 @@ public class SubscriptionController {
} }
InvoiceLineItem subscriptionLineItem = subscriptionLineItems.stream().findAny().get(); InvoiceLineItem subscriptionLineItem = subscriptionLineItems.stream().findAny().get();
Product product = subscriptionLineItem.getPrice().getProductObject(); return stripeManager.getProductForPrice(subscriptionLineItem.getPrice().getId()).thenApply(product -> new Receipt(
return CompletableFuture.completedFuture(new Receipt(
Instant.ofEpochSecond(subscriptionLineItem.getPeriod().getEnd()).plus(config.getBadgeGracePeriod()), Instant.ofEpochSecond(subscriptionLineItem.getPeriod().getEnd()).plus(config.getBadgeGracePeriod()),
stripeManager.getLevelForProduct(product), stripeManager.getLevelForProduct(product),
subscriptionLineItem.getId())); subscriptionLineItem.getId()));

View File

@ -19,6 +19,8 @@ import com.stripe.model.SubscriptionItem;
import com.stripe.net.RequestOptions; import com.stripe.net.RequestOptions;
import com.stripe.param.CustomerCreateParams; import com.stripe.param.CustomerCreateParams;
import com.stripe.param.CustomerRetrieveParams; import com.stripe.param.CustomerRetrieveParams;
import com.stripe.param.CustomerUpdateParams;
import com.stripe.param.CustomerUpdateParams.InvoiceSettings;
import com.stripe.param.InvoiceListParams; import com.stripe.param.InvoiceListParams;
import com.stripe.param.PriceRetrieveParams; import com.stripe.param.PriceRetrieveParams;
import com.stripe.param.SetupIntentCreateParams; import com.stripe.param.SetupIntentCreateParams;
@ -107,6 +109,23 @@ public class StripeManager {
}, executor); }, executor);
} }
public CompletableFuture<Customer> setDefaultPaymentMethodForCustomer(String customerId, String paymentMethodId) {
return CompletableFuture.supplyAsync(() -> {
Customer customer = new Customer();
customer.setId(customerId);
CustomerUpdateParams params = CustomerUpdateParams.builder()
.setInvoiceSettings(InvoiceSettings.builder()
.setDefaultPaymentMethod(paymentMethodId)
.build())
.build();
try {
return customer.update(params, commonOptions());
} catch (StripeException e) {
throw new CompletionException(e);
}
}, executor);
}
public CompletableFuture<SetupIntent> createSetupIntent(String customerId) { public CompletableFuture<SetupIntent> createSetupIntent(String customerId) {
return CompletableFuture.supplyAsync(() -> { return CompletableFuture.supplyAsync(() -> {
SetupIntentCreateParams params = SetupIntentCreateParams.builder() SetupIntentCreateParams params = SetupIntentCreateParams.builder()
@ -278,7 +297,6 @@ public class StripeManager {
.setCreated(InvoiceListParams.Created.builder() .setCreated(InvoiceListParams.Created.builder()
.setGte(now.minus(Duration.ofDays(90)).getEpochSecond()) .setGte(now.minus(Duration.ofDays(90)).getEpochSecond())
.build()) .build())
.addExpand("lines.data.price.product")
.build(); .build();
try { try {
ArrayList<Invoice> invoices = Lists.newArrayList(Invoice.list(params, commonOptions()) ArrayList<Invoice> invoices = Lists.newArrayList(Invoice.list(params, commonOptions())