Android -如何检查订阅是否续订?

xj3cbfub  于 2022-11-20  发布在  Android
关注(0)|答案(4)|浏览(183)

我有一个Android应用程序与可更新的每月订阅。在这个应用程序中,我想通知用户一些信息时,他的订阅继续在下个月。
我可以在商家中心看到续订(orderId以例如..0、..1结尾),但在查询库存时,我的采购订单Id与之前相同,因为eq.

{
    "orderId": "GPA.XXXX-YYYY-XXXX-ZZZZZ",
    "packageName": "my.packageName",
    "productId": "my.sku",
    "purchaseTime": 1456398623654,
    "purchaseState": 0,
    "developerPayload": "mypayload",
    "purchaseToken": "token",
    "autoRenewing": true
}

更让我烦恼的是purchaseTime也没有改变。
所以我的问题是:是否有任何方法可以在应用程序中检测到发生了续订?
编辑:
我使用Google Play开发者API获取订阅信息,然后自己计算续订数量。

sbdsn5lh

sbdsn5lh1#

INAPP_PURCHASE_DATA JSON字段(在V3中)的orderId字段中返回所有重复发生的订单id,每个重复发生的交易都附加一个整数。
Subscription order numbers
为了帮助您跟踪与给定订阅相关的交易,Google支付为所有重复的订阅提供了一个基本商户订单号,并通过追加一个整数来表示每个重复的交易,如下所示:

GPA.1234-5678-9012-34567 (base order number)
GPA.1234-5678-9012-34567..0 (first recurrence orderID)
GPA.1234-5678-9012-34567..1 (second recurrence orderID)
GPA.1234-5678-9012-34567..2 (third recurrence orderID) ...

但由于本地缓存的原因,您可能无法获取最新信息。因此,请尝试从应用程序管理器中清除缓存,以首先查看您是否获取了正确的购买信息。
由于购买查询这种方式是不可靠的,它更有意义的是调用Google Play开发者Purchases.subscriptions: get API从后端获得Purchases.订阅资源,这将返回当前订阅的expiryTimeMillis

{
  "kind": "androidpublisher#subscriptionPurchase",
  "startTimeMillis": long,
  "expiryTimeMillis": long,
  "autoRenewing": boolean,
  "priceCurrencyCode": string,
  "priceAmountMicros": long,
  "countryCode": string,
  "developerPayload": string,
  "paymentState": integer,
  "cancelReason": integer
}
ax6ht2ek

ax6ht2ek2#

仅当订阅处于活动状态时,才会返回订阅的购买数据。如果订阅过期,则在查询库存时将无法获得此购买数据。
摘录自link
如果定期付款失败(例如,由于客户的信用卡无效),则不会续订订阅。getPurchases()方法不会返回失败或过期的订阅。

dced5bon

dced5bon3#

您可以在数据库中提供到期日期,每次获取数据时,您可以使用数据库的值检查到期日期,如果到期日期晚于到期日期,则表示订阅已续订))

zhte4eai

zhte4eai4#

我一直在努力寻找一个解决方案来实现@random的建议。这似乎是唯一一个在Android上实现续订跟踪的方法,但是我在网上找不到一个好的方法来实现。对于那些想保存时间的人(今天花了我6个小时),请在下面找到我的答案:

**1.**第一步是添加依赖项:

implementation "com.google.apis:google-api-services-androidpublisher:v3-rev142-1.25.0" // Update based on latest release
implementation "com.google.auth:google-auth-library-oauth2-http:1.12.1" // Update based on latest release

**2.**按照these steps链接Google Play控制台与Google Play开发者API(选择“使用服务帐户”,而不是“使用OAuth客户端”,然后按照“附加信息”)。
**3.**从您的Google Cloud service account下载服务JSON文件(单击您在上一步中设置的帐户)。您可以在“管理密钥”操作或“密钥”选项卡下找到/创建此文件。将导出的JSON文件添加到Android的assets文件夹中
**4.**然后,您可以调用Google Play开发者API来查询订阅,如下所示(从线程调用很重要,但从UI线程调用不起作用,不确定原因):

new Thread(() -> {
    InputStream inputStream = context.getAssets().open("service_account_google_play.json"); // JSON file from step 3
    GoogleCredentials credentials = GoogleCredentials.fromStream(inputStream)
                    .createScoped(AndroidPublisherScopes.ANDROIDPUBLISHER);
    AndroidPublisher androidPublisher = new AndroidPublisher(
        new NetHttpTransport(),
        JacksonFactory.getDefaultInstance(),
        new HttpCredentialsAdapter(credentials)
    );
    SubscriptionPurchase purchase = androidPublisher.purchases().subscriptions().get(
        context.getPackageName(), subscriptionId, purchaseToken
    ).execute();
    // Check the orderId or check the expiryTimeMillis for renewal check, e.g. purchase.getOrderId();
}).start();

尽管可能描述过度,subscriptionId是您在Play控制台中订阅的ID(例如subscription_monthly或您称之为它的任何名称),purchaseToken是您在查询BillingClient后从购买令牌中获得的令牌(查询订阅将在here中详细解释)。

相关问题