Skip to content

Commit 85226bd

Browse files
committed
Retrieve subscription price from purchase instead of plan
1 parent faa7446 commit 85226bd

File tree

2 files changed

+11
-49
lines changed

2 files changed

+11
-49
lines changed

service/src/main/java/org/whispersystems/textsecuregcm/subscriptions/GooglePlayBillingManager.java

Lines changed: 8 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -13,10 +13,8 @@
1313
import com.google.api.services.androidpublisher.AndroidPublisherRequest;
1414
import com.google.api.services.androidpublisher.AndroidPublisherScopes;
1515
import com.google.api.services.androidpublisher.model.AutoRenewingPlan;
16-
import com.google.api.services.androidpublisher.model.BasePlan;
16+
import com.google.api.services.androidpublisher.model.Money;
1717
import com.google.api.services.androidpublisher.model.OfferDetails;
18-
import com.google.api.services.androidpublisher.model.RegionalBasePlanConfig;
19-
import com.google.api.services.androidpublisher.model.Subscription;
2018
import com.google.api.services.androidpublisher.model.SubscriptionPurchaseLineItem;
2119
import com.google.api.services.androidpublisher.model.SubscriptionPurchaseV2;
2220
import com.google.api.services.androidpublisher.model.SubscriptionPurchasesAcknowledgeRequest;
@@ -37,7 +35,6 @@
3735
import java.util.List;
3836
import java.util.Locale;
3937
import java.util.Map;
40-
import java.util.Objects;
4138
import java.util.Optional;
4239
import java.util.stream.Collectors;
4340
import org.apache.commons.lang3.StringUtils;
@@ -130,7 +127,6 @@ public class ValidatedToken {
130127
* Acknowledge the purchase to the play billing server. If a purchase is never acknowledged, it will eventually be
131128
* refunded.
132129
*
133-
* @return A stage that completes when the purchase has been successfully acknowledged
134130
*/
135131
public void acknowledgePurchase()
136132
throws RateLimitExceededException, SubscriptionNotFoundException {
@@ -269,32 +265,16 @@ public SubscriptionInformation getSubscriptionInformation(final String purchaseT
269265
}
270266

271267
private SubscriptionPrice getSubscriptionPrice(final SubscriptionPurchaseV2 subscriptionPurchase) {
272-
273268
final SubscriptionPurchaseLineItem lineItem = getLineItem(subscriptionPurchase);
274-
final OfferDetails offerDetails = lineItem.getOfferDetails();
275-
final String basePlanId = offerDetails.getBasePlanId();
276269

277-
try {
278-
final Subscription subscription = this.androidPublisher.monetization().subscriptions()
279-
.get(packageName, lineItem.getProductId()).execute();
280-
281-
final BasePlan basePlan = subscription.getBasePlans().stream()
282-
.filter(bp -> bp.getBasePlanId().equals(basePlanId))
283-
.findFirst()
284-
.orElseThrow(() -> new UncheckedIOException(new IOException("unknown basePlanId " + basePlanId)));
285-
final String region = subscriptionPurchase.getRegionCode();
286-
final RegionalBasePlanConfig basePlanConfig = basePlan.getRegionalConfigs()
287-
.stream()
288-
.filter(rbpc -> Objects.equals(region, rbpc.getRegionCode()))
289-
.findFirst()
290-
.orElseThrow(() -> new UncheckedIOException(new IOException("unknown subscription region " + region)));
291-
292-
return new SubscriptionPrice(
293-
basePlanConfig.getPrice().getCurrencyCode().toUpperCase(Locale.ROOT),
294-
SubscriptionCurrencyUtil.convertGoogleMoneyToApiAmount(basePlanConfig.getPrice()));
295-
} catch (IOException e) {
296-
throw new UncheckedIOException(e);
270+
// We don't offer pre-paid plans, so autoRenewingPlan must be nonnull
271+
if (lineItem.getAutoRenewingPlan() == null) {
272+
throw new UncheckedIOException(new IOException("Subscription purchases must be auto-renewing plans"));
297273
}
274+
final Money price = lineItem.getAutoRenewingPlan().getRecurringPrice();
275+
return new SubscriptionPrice(
276+
price.getCurrencyCode().toUpperCase(Locale.ROOT),
277+
SubscriptionCurrencyUtil.convertGoogleMoneyToApiAmount(price));
298278
}
299279

300280
@Override

service/src/test/java/org/whispersystems/textsecuregcm/subscriptions/GooglePlayBillingManagerTest.java

Lines changed: 3 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -20,11 +20,8 @@
2020
import com.google.api.client.http.HttpResponseException;
2121
import com.google.api.services.androidpublisher.AndroidPublisher;
2222
import com.google.api.services.androidpublisher.model.AutoRenewingPlan;
23-
import com.google.api.services.androidpublisher.model.BasePlan;
2423
import com.google.api.services.androidpublisher.model.Money;
2524
import com.google.api.services.androidpublisher.model.OfferDetails;
26-
import com.google.api.services.androidpublisher.model.RegionalBasePlanConfig;
27-
import com.google.api.services.androidpublisher.model.Subscription;
2825
import com.google.api.services.androidpublisher.model.SubscriptionPurchaseLineItem;
2926
import com.google.api.services.androidpublisher.model.SubscriptionPurchaseV2;
3027
import java.io.IOException;
@@ -63,10 +60,6 @@ class GooglePlayBillingManagerTest {
6360
private final AndroidPublisher.Purchases.Subscriptions.Cancel cancel =
6461
mock(AndroidPublisher.Purchases.Subscriptions.Cancel.class);
6562

66-
// Returned in response to a monetization.subscriptions.get
67-
private final AndroidPublisher.Monetization.Subscriptions.Get subscriptionConfig =
68-
mock(AndroidPublisher.Monetization.Subscriptions.Get.class);
69-
7063
private final MutableClock clock = MockUtils.mutableClock(0L);
7164

7265
private GooglePlayBillingManager googlePlayBillingManager;
@@ -94,11 +87,6 @@ public void setup() throws IOException {
9487
when(subscriptions.cancel(PACKAGE_NAME, PRODUCT_ID, PURCHASE_TOKEN))
9588
.thenReturn(cancel);
9689

97-
AndroidPublisher.Monetization.Subscriptions msubscriptions = mock(
98-
AndroidPublisher.Monetization.Subscriptions.class);
99-
when(monetization.subscriptions()).thenReturn(msubscriptions);
100-
when(msubscriptions.get(PACKAGE_NAME, PRODUCT_ID)).thenReturn(subscriptionConfig);
101-
10290
googlePlayBillingManager = new GooglePlayBillingManager(
10391
androidPublisher, clock, PACKAGE_NAME, Map.of(PRODUCT_ID, 201L));
10492
}
@@ -247,18 +235,12 @@ public void getSubscriptionInfo() throws IOException, RateLimitExceededException
247235
.setRegionCode("US")
248236
.setLineItems(List.of(new SubscriptionPurchaseLineItem()
249237
.setExpiryTime(Instant.now().plus(Duration.ofDays(1)).toString())
250-
.setAutoRenewingPlan(new AutoRenewingPlan().setAutoRenewEnabled(null))
238+
.setAutoRenewingPlan(new AutoRenewingPlan()
239+
.setAutoRenewEnabled(null)
240+
.setRecurringPrice(new Money().setCurrencyCode("USD").setUnits(1L).setNanos(750_000_000)))
251241
.setProductId(PRODUCT_ID)
252242
.setOfferDetails(new OfferDetails().setBasePlanId(basePlanId)))));
253243

254-
final BasePlan basePlan = new BasePlan()
255-
.setBasePlanId(basePlanId)
256-
.setRegionalConfigs(List.of(
257-
new RegionalBasePlanConfig()
258-
.setRegionCode("US")
259-
.setPrice(new Money().setCurrencyCode("USD").setUnits(1L).setNanos(750_000_000))));
260-
when(subscriptionConfig.execute()).thenReturn(new Subscription().setBasePlans(List.of(basePlan)));
261-
262244
final SubscriptionInformation info = googlePlayBillingManager.getSubscriptionInformation(PURCHASE_TOKEN);
263245
assertThat(info.active()).isTrue();
264246
assertThat(info.paymentProcessing()).isFalse();

0 commit comments

Comments
 (0)