The Android Developer Challenge is back! Submit your idea before December 2.

添加订阅专用功能

订阅需使用 Android Play 管理中心进行配置。配置订阅后,您可以将 Google Play 结算服务添加到您的应用,以启用订阅的购买流程。订阅具有 Google Play 结算服务概览中提到的许多特性(例如结算周期、宽限期、免费试订等)。在阅读本节之前,您应该熟悉这些概念。

如需了解详情,请观看最新的订阅视频

此外,在阅读本页的其余部分之前,您还应该启用实时开发者通知。 借助实时开发者通知,您可以主动响应状态更改,提高参与度并减少用户流失。要启用这些通知,请参阅实时开发者通知

您应该尝试在整个 Google Play 结算服务解决方案中适应多个订阅用例。

您可以结合使用 Google Play 结算库、Google Play Developer API 和实时开发者通知来处理这类用例。

使用实时开发者通知处理与订阅相关的状态

实时开发者通知是服务器推送通知,让您能够监控订阅项目的状态变化(如 SUBSCRIPTION_PURCHASEDSUBSCRIPTION_RECOVERED)。借助实时开发者通知,您可以主动响应状态更改,提高参与度并减少用户流失。要启用这些通知,请参阅实时开发者通知

如果您启用了实时开发者通知,则安全后端服务器会收到通知,仅提醒您订阅状态发生变化。您必须在收到实时开发者通知后调用 Developer API,以获取完成状态并更新您自己的后端状态。此类通知仅会告知您订阅状态发生变化;而不会提供订阅状态的完整信息。

检查 Developer API 时,您应始终执行以下操作:

  • 如果 expiryTimeMillis 是在将来,则始终授予权限。
  • 如果 autoRenewing = false,请尝试让用户重新注册,因为订阅将在过期时间结束。
  • 如果 paymentState = 0,请使用订阅中心深层链接将用户发送到订阅中心以解决其付款问题。

将来,我们可能会添加影响用户权限的其他状态变化(例如,在订阅过期后重新激活订阅)。为确保您的集成为这些功能做好准备,请务必通过调用 Developer API 并采取上述操作来处理任何未定义的通知。

用户处于宽限期 - SUBSCRIPTION_IN_GRACE_PERIOD

宽限期会持续一段时间,具体取决于您在 Google Play 管理中心内的应用内商品设置。Google Play 会在宽限期内尝试续订订阅。要提醒用户付款问题,请在应用中提供一条消息,告诉用户如何修正付款方式。否则,用户将无法使用订阅。例如,“为防止您的帐号发生中断,请转到 Google Play 订阅设置以修正您在 Google Play 上的付款。”此消息将链接到 Google Play 订阅设置,以便用户可以修正其付款方式。

要确定用户处于宽限期的时间,请调用 Google Play Developer API。Google Play 会动态扩展 expiryTimeMillis 值,直到宽限期已过。在此时间段内,您应查看用户的订阅是否已被取消、续订或暂停。您应该在 expiryTimeMillis 过后查看用户的当前订阅状态,以获取订阅的最新状态。

JSON 响应的内容取决于订阅的状态,如以下代码段所示。例如,如果您在宽限期内查询订阅(付款方式有误),则 expiryTimeMillis 会动态更新为未来时间戳,并且 paymentState 会设置为 0:

{
  "kind": "androidpublisher#subscriptionPurchase",
  ...
  "expiryTimeMillis": timestamp_in_future,
  "autoRenewing": true,
  ...
  "paymentState": 0  # Payment pending
}

如果您在成功续订后查询订阅(付款方式已更新),则 expiryTimeMillis 会设置为将来的时间戳,并且 paymentState 会设置为 1:

{
  "kind": "androidpublisher#subscriptionPurchase",
  ...
  "expiryTimeMillis": timestamp_in_future,
  "autoRenewing": true,
  ...
  "paymentState": 1  # Payment received
}

如果您在宽限期过后查询订阅,您将发现订阅处于暂停状态(如果您在 Google Play 管理中心启用了帐号保留功能)或被取消(如果您未在 Google Play 管理中心启用帐号保留功能)。有关 SUBSCRIPTION_ON_HOLDSUBSCRIPTION_CANCELLED 的示例 JSON 响应,请参阅帐号保留 - SUBSCRIPTION_ON_HOLD 部分。

帐号保留 - SUBSCRIPTION_ON_HOLD

帐号保留期限为 30 天。在帐号保留期间,您应该查看用户的订阅是否已被取消、恢复或重新购买。在帐号保留期间,通知您的用户为什么暂停对订阅内容的使用权限。要通知用户,请在应用中提供一条消息,说明如何修正付款方式并重新获得对订阅内容的使用权限。例如,“您的订阅存在问题,请转到 Google Play 订阅设置以修正您在 Google Play 上的付款。”此消息将链接到 Google Play 订阅设置,以便他们可以修正其付款方式。您还应该采取一些其他措施,例如:

  • 如果用户更新其付款方式并恢复订阅,则您的应用应恢复对订阅内容的使用权限。如需了解详情,请参阅已恢复的订阅 - SUBSCRIPTION_RECOVERED。但是,如果在此保留期内未恢复订阅,则订阅会被取消,并且用户必须购买新订阅。
  • 如果用户希望您的应用访问应用外的订阅内容,则您可能需要向用户发送推送通知或电子邮件,以告知用户他们的订阅已失效。如果您的订阅内容仅在用户打开您的应用时可供查看,则您可能只需在用户下次打开该应用时告知其订阅中断情况。

要验证帐号是否仍处于暂停状态,您应该在用户尝试访问应用中的订阅内容时查看用户的当前订阅状态。

JSON 响应的内容取决于订阅的状态,如以下代码段所示。例如,如果您在帐号保留期内查询订阅(付款方式有误),则 expiryTimeMillis 会设置为过去的时间戳,并且 paymentState 会设置为 0:

{
  "kind": "androidpublisher#subscriptionPurchase",
  ...
  "expiryTimeMillis": timestamp_in_past,
  "autoRenewing": true,
  ...
  "paymentState": 0  # Payment pending
}

如果您在订阅恢复后查询订阅(付款方式已更新),则 expiryTimeMillis 会设置为将来的时间戳,并且 paymentState 会设置为 1:

{
  "kind": "androidpublisher#subscriptionPurchase",
  ...
  "expiryTimeMillis": timestamp_in_future,
  "autoRenewing": true,
  ...
  "paymentState": 1  # Payment received
}

如果您在保留状态持续 30 天并且订阅被取消后查询订阅,则 expiryTimeMillis 会设置为过去的时间戳,并且 cancelReason 会设置为 1:

{
  "kind": "androidpublisher#subscriptionPurchase",
  ...
  "expiryTimeMillis": timestamp_in_past,
  "autoRenewing": false,
  ...
  "cancelReason": 1  # The system canceled the subscription
}

订阅已恢复 - SUBSCRIPTION_RECOVERED

恢复订阅后,购买令牌通常与用户的帐号保留状态开始之前的令牌完全相同。但是,用户可能会在保留期间重新购买订阅,以重新获得对订阅内容的访问权限。在这种情况下,系统会返回新的购买令牌值以表示新的订阅实例。

在服务器中注册新的订阅数据后,您可以在应用中显示一条消息,通知用户他们的订阅已恢复。例如,“系统已记录您更新后的付款方式,并且您的订阅已恢复。”

订阅取消 - SUBSCRIPTION_CANCELLED

用户可以主动从 Play 商店取消订阅,或自动取消他们的订阅(如果订阅在暂停后没有恢复)。当您的安全后端服务器收到 SUBSCRIPTION_CANCELLED 实时开发者通知时,请执行以下操作:

  • 在您的应用中显示一条消息,通知用户他们的订阅已被取消,例如“您的订阅将在 **some_date**过期,请转到 Google Play 订阅设置,恢复您的订阅。”此消息应链接到 Google Play 订阅设置,以便用户可以续订订阅。
  • 您应该提供永久关闭此消息的功能。

当您收到新的购买令牌后,请按照验证购买令牌中的步骤操作。

注意:取消消息可能会令用户反感,尤其是手动取消(而不是因付款方式过期而导致的取消)订阅的用户。您可以选择不通知手动取消订阅的用户。

用户暂停了他们的订阅 - SUBSCRIPTION_PAUSED

当查询当前暂停的订阅时,如果 expiryTimeMillis 是过去的日期,而 autoResumeTimeMillis 是将来的日期,那么您应暂停用户对相关内容的访问权限并将用户的权限视为“已暂停”:

{
  "kind": "androidpublisher#subscriptionPurchase",
  ...
  "expiryTimeMillis": $subscription_entitlement_end_time (in the past)
  "autoRenewing": true,
  "paymentState": 1  # Payment received
  ...
  "autoResumeTimeMillis": $subscription_auto_resume_time (in the future)
}

更改订阅的价格

警告:您不应更改通过 Google 订阅的订阅价格。

您可以在 Google Play 管理中心更改应用中的订阅价格。如果您要更改内容量或与给定订阅相关联的应用内福利的范围,则此功能非常有用。

要更新订阅价格,请在 Google Play 管理中心内完成以下步骤:

  1. 转到您想要更改订阅价格的应用。
  2. 依次选择商店发布 > 应用内商品,然后打开订阅标签。
  3. 选择您要更改的价格旁边的修改链接,如图 1 中所示:

    订阅价格旁边的“修改”链接
    图 1. 修改订阅价格字段
  4. 输入您要设定的新订阅价格。

    当您更改价格时,系统会显示一个警告对话框,如图 2 中所示。此对话框会说明您的价格变动会立即对新订阅者生效,并在 30 天内对同意价格变动的现有订阅者生效。

    订阅价格变动警告对话框
    图 2. 关于订阅价格变动何时生效的警告

向用户通知价格变动

Google Play 至少要过 7 天才会向您的现有订阅者显示通知;也就是说,您可以在此期间提前告知订阅者价格变动的消息。当 Google Play 通知用户时,它会显示一个类似于图 3 中所示的对话框。此对话框会显示旧价格、新价格以及新价格的生效日期。

常规订阅价格变动对话框
图 3. 通知用户订阅价格变动的常规对话框

在您的应用中,您可以通过以下方式显示此对话框:

启动价格变动确认流程

要在您的应用启动时显示对话框,请向您的结算客户端类添加以下逻辑:

Kotlin

val priceChangeFlowParams = PriceChangeFlowParams.newBuilder()
        .setSkuDetails(changedPriceSubscriptionSkuDetails)
        .build()

billingClient.launchPriceChangeConfirmationFlow(activity,
        priceChangeFlowParams,
        object : PriceChangeConfirmationListener() {
            override fun onPriceChangeConfirmationResult(responseCode: Int) {
                if (responseCode == BillingResponse.OK) {
                    // User has confirmed the price change.
                } else if (responseCode == BillingResponse.USER_CANCELED) {
                    // User hasn't confirmed the price change.
                }
            }
        })

Java

PriceChangeFlowParams priceChangeFlowParams = PriceChangeFlowParams.newBuilder()
        .setSkuDetails(changedPriceSubscriptionSkuDetails)
        .build();

billingClient.launchPriceChangeConfirmationFlow(activity,
        priceChangeFlowParams,
        new PriceChangeConfirmationListener() {
            @Override
            public void onPriceChangeConfirmationResult(int responseCode) {
                if (responseCode == BillingResponse.OK) {
                    // User has confirmed the price change.
                } else if (responseCode == BillingResponse.USER_CANCELED) {
                    // User hasn't confirmed the price change.
                }
            }
        });

在显示 Google Play 的价格变动对话框之前,您可以显示自己的消息或对话框来说明价格变动背后的原因。如果您要创建并显示此类自定义消息,则您的用户更有可能选择以新价格续订。

在用户响应您的自定义对话框后,您的应用会再次变为活动状态,并从 Google Play 结算库收到一个 responseCode(类型为 BillingClient.BillingResponse)。

您可以在 PriceChangeConfirmationListener 的实现中处理用户的响应。例如,如果用户同意价格变动,您可以显示自定义致谢消息。

处理用户对价格变动的确认

如果用户接受您的新订阅价格,则该库还会向您的结算服务器发送通知。您可以通过 Google 的实时开发者通知功能接收有关用户对该对话框的响应的通知。如果用户接受您的价格变动,您会收到类型为 SUBSCRIPTION_PRICE_CHANGE_CONFIRMED 的通知。

处理价格变动被拒情况

用户可能不同意您应用的 PriceChangeConfirmationListener 中的价格变动。在这种情况下,请让他们订阅将在下一个续订日期到期的旧产品。如果用户在旧订阅到期时尚未接受您的价格变动,则订阅会变为退订,并且您会收到类型为 SUBSCRIPTION_CANCELED实时开发者通知

如果您的应用支持订阅,请在设置或偏好设置屏幕上添加一个链接,以允许用户管理其订阅。图 4 中显示了此链接的一个示例。在此链接的点击处理程序中,添加逻辑以确定用户对您的应用是否有任何未过期的订阅(其中 expiryTimeMillis 设置为将来时间 autoRenewing 设置为 true):

  • 如果用户在您的应用中没有任何此类订阅,请使用以下网址将用户转到显示其所有其他订阅的页面,如图 5 中所示:

    http://play.google.com/store/account/subscriptions
    
  • 另一方面,如果用户确实有未过期的订阅,您可以使用以下网址将他们直接转到相应订阅,如图 6 中所示:

    https://play.google.com/store/account/subscriptions?sku=your-sub-product-id&package=your-app-package
    

每个订阅的 SKU 都与您在 Play 管理中心创建它时为其分配的商品 ID 相匹配。要以编程方式确定现有订阅的 SKU,请在应用的后端查询与特定用户相关联的订阅列表。有关必要的服务器端逻辑的示例,请参阅 ClassyTaxi 示例应用中的 queryCurrentSubscriptions() 方法。

一个“设置”屏幕,其中包含一个名为“Google Play 订阅”按钮
图 4. 此图片中的 Google Play 订阅按钮提供了“管理订阅”链接的示例。
一个订阅详情屏幕,其中显示了用户在所有应用中的订阅
图 5. 本屏幕显示用户从应用外购买并由应用发送到本屏幕的所有订阅。
一个订阅详情屏幕,其中显示了用户在特定应用中购买的特定订阅
图 6. 本屏幕显示用户从应用内购买并由应用发送到本屏幕的特定订阅详情。

您可以对订阅进行升级或降级

您可以为用户提供不同的订阅层级,例如基本级和付费级。图 7 显示了一个提供两个订阅层级的屏幕:

图 7. 订阅层级。

用户应该能够访问类似的屏幕,通过购买不同层级的订阅来升级或降级订阅。您的应用应使用用于在启用购买应用内商品中购买原始订阅的同一应用内商品购买流程来处理这种情况。不过,在升级或降级订阅时,您应使用 setOldSku() 方法将当前订阅和未来(已升级或降级)订阅的商品 ID 传递给 BillingFlowParams 对象。例如:

Kotlin

val flowParams = BillingFlowParams.newBuilder()
        .setSkuDetails(newSkuDetails)
        .setOldSku(currentId)
        .build()
val responseCode = billingClient.launchBillingFlow(activity, flowParams)

Java

BillingFlowParams flowParams = BillingFlowParams.newBuilder()
        .setSkuDetails(newSkuDetails)
        .setOldSku(currentId)
        .build();
int responseCode = billingClient.launchBillingFlow(flowParams);

当您收到购买令牌后,请遵循用于新购买令牌的同一验证流程。如需了解详情,请参阅验证购买。Google Play Developer API 将在订阅资源中返回 linkedPurchaseToken。请务必使 linkedPurchaseToken 中提供的令牌无效,以确保旧令牌不会被用于获取对您服务的访问权限。

在用户升级或降级订阅时,SUBSCRIPTION_PURCHASED 状态会发送到您的安全后端服务器。要处理 SUBSCRIPTION_PURCHASED,请参阅处理 SUBSCRIPTION_PURCHASED

设置按比例计费模式

当升级或降级订阅时,您可以在 BillingFlowParams 类中设置 replaceSkusProrationMode,以提供有关订阅更改时将采用的按比例计费的详细信息。

Kotlin

val flowParams = BillingFlowParams.newBuilder()
        .setSkuDetails(skuDetails)
        .setOldSku(oldSku)
        .setReplaceSkusProrationMode(replaceSkusProrationMode)
        .build()
val responseCode = billingClient.launchBillingFlow(activity, flowParams)

Java

BillingFlowParams flowParams = BillingFlowParams.newBuilder()
        .setSkuDetails(skuDetails)
        .setOldSku(oldSku)
        .setReplaceSkusProrationMode(replaceSkusProrationMode)
        .build()
int responseCode = billingClient.launchBillingFlow(activity, flowParams);

下表列出了所有按比例计费模式。

IMMEDIATE_WITH_TIME_PRORATION 替换会立即生效,并且系统会按比例计算新的有效期,同时向用户返还余额或收取相关费用。这是当前的默认行为。
IMMEDIATE_AND_CHARGE_PRORATED_PRICE 替换会立即生效,结算周期保持不变。用户需要补足剩余订阅期的差价。

注意:此选项仅适用于订阅升级。

IMMEDIATE_WITHOUT_PRORATION 替换会立即生效,并且会在下个续订时间点按新价格收费。结算周期保持不变。
DEFERRED 替换会在下个续订时间点生效。

要了解每种模式的工作原理,请考虑以下情况:

Samwise 订阅了 Country Gardener 应用的在线内容。他当前的订阅为第 1 层级版本的内容(仅限文本内容),并且为按月订阅。此订阅的费用为每月 2 美元,并在每月的第一天续订。

在 4 月 15 日,Samwise 选择升级到第 2 层级订阅(包含视频更新),费用为每月 3 美元。

升级订阅时,开发者会选择按比例计费模式。以下列表列出了每种按比例计费模式如何影响 Samwise 的订阅。

  • IMMEDIATE_WITH_TIME_PRORATION - 如果使用此模式,Samwise 的第 1 层级订阅将立即终止。由于他已支付一整月(4 月 1 日 - 30 日)的费用,但订阅期仅过一半,剩余半个月的订阅费用(1 美元)将应用到新订阅。不过,由于新订阅的费用为每月 3 美元,1 美元的余额仅够 10 天的费用,也就是从 4 月 15 日 - 25 日的费用。在 4 月 26 日,他需要为新订阅支付 3 美元的费用,此后在每个月的 26 日都需要支付 3 美元。
  • IMMEDIATE_AND_CHARGE_PRORATED_PRICE - 如果使用此模式,Samwise 的第 1 层级订阅将立即终止。由于他已支付一整月(4 月 1 日 - 30 日)的费用,但订阅期仅过一半,剩余半个月的订阅费用(1 美元)将应用到新订阅。不过,由于新订阅的费用为每月 3 美元,剩余 15 天的费用为 1.50 美元。因此,他需要为新订阅支付 0.50 美元的差价,并且此后每个月的第一天都需要支付 3 美元。
  • IMMEDIATE_WITHOUT_PRORATION - 如果使用此模式,Samwise 的第 1 层级订阅会立即升级到第 2 层级,无需支付额外费用,而在 5 月 1 日,他需要为新层级订阅支付 3 美元,并且此后每个月的第一天都需要支付 3 美元。
  • DEFERRED - 如果使用此模式,Samwise 的第 1 层级订阅将持续到 4 月 30 日到期。在 5 月 1 日,第 2 层级订阅开始生效,Samwise 需要为新层级订阅支付 3 美元。

暂停订阅

您可以通过允许用户暂停订阅来防止主动取消订阅的用户流失。启用暂停功能后,用户可以选择在一周到三个月的时间范围内暂停其订阅,具体取决于对应的周期。启用暂停选项后,该选项将在订阅中心和取消流程中显示。请注意,一周和三个月的暂停限制随时可能更改。另请注意,按年订阅内容无法暂停。

重要提示:要启用暂停功能,您还必须启用帐号保留功能

要让用户能够暂停其订阅,请执行以下操作:

  1. 登录 Google Play 管理中心
  2. 选择您的应用,然后依次转到商店发布 > 应用内商品 > 订阅
  3. 展开订阅设置部分。
  4. 选中启用暂停功能

订阅暂停操作仅在当前结算周期结束后生效。订阅暂停后,用户将无法访问订阅。在暂停期结束时,订阅将恢复,并且 Google 会尝试续订订阅。如果恢复成功,订阅将再次变为活动状态。如果由于付款问题导致恢复失败,则用户将进入帐号保留状态,如图 8 所示:

从暂停状态到帐号保留状态的转换图。
图 8. 用户暂停其订阅,然后进入帐号保留状态。

用户还可以选择在暂停期内随时手动恢复订阅,如图 9 所示。当用户手动恢复订阅时,结算日期将更改为手动恢复日期。

从暂停状态到恢复状态的转换图。
图 9. 用户先暂停其订阅,然后恢复订阅。

订阅被暂停后,当用户在应用中时,我们建议您告知用户他们因暂停订阅而无法访问订阅。您还应该通过使用 Google Play 深层链接,为用户提供一种手动恢复订阅的方法。

您可以通过以下任何方法检测订阅何时暂停和恢复:

  • 使用 Google Play Developer API,在 Purchases.subscriptions 响应中查找 expiryTimeMillisautoResumeTimeMillis 字段:

    • 如果用户有待处理的暂停,则 expiryTimeMillisautoResumeTimeMillis 都包含将来的日期。
    • 如果用户当前处于暂停状态,则 autoResumeTimeMillis 包含将来的日期,expiryTimeMillis 包含过去的日期。
    • 如果用户已恢复订阅,则响应中包含有效的订阅数据。
    • 如果用户已进入帐号保留状态,则响应中包含帐号保留数据。
  • 使用实时开发者通知 (RTDN)。为确保您获得最新的暂停订阅信息,您应该调用 Google Play Developer API 以响应所有 RTDN 通知类型(包括无法识别的类型)。与订阅暂停相关的通知类型如下:

    • SUBSCRIPTION_PAUSE_SCHEDULE_CHANGED:用户在暂停生效前已选择暂停或恢复订阅。
    • SUBSCRIPTION_PAUSED:订阅当前已暂停。
    • SUBSCRIPTION_RENEWED:订阅已成功恢复。
    • SUBSCRIPTION_ON_HOLD:尝试恢复订阅失败,订阅当前处于帐号保留状态。
  • 在 Android 设备上,每次应用启动时都使用 Google Play 结算库调用 queryPurchases()。在应用运行时使用 PurchasesUpdatedListener 接收最新动态。onPurchasesUpdated() 中的 Purchase 对象列表包含已暂停的订阅。

允许重新订阅

即使订阅尚未到期,用户也可以重新订阅已取消的订阅内容。您可以允许用户在您的应用内重新订阅,方法是使用同一商品 ID 将同一应用内商品购买流程应用于已被取消的订阅。

重新订阅将会取代任何有效订阅,并保持与要取代的订阅相同的到期日期。例如,Achilles 订阅了 Example Music 应用。他当前订阅的到期日期为 8 月 1 日。在 7 月 10 日,他以相同的价格重新订阅了 1 个月的订阅内容。系统会根据先前订阅的余额按比例计算新订阅的费用。然后,新订阅立即生效,并会在 8 月 1 日续订。

您应该重新订阅显示相应的界面:

  • 如果用户没有有效订阅,应用将显示“购买”按钮。
  • 如果用户有已取消的订阅内容 (SUBSCRIPTION_CANCELLED),则应用可能会显示“重新订阅”按钮。如需了解详情,请参阅处理 SUBSCRIPTION_CANCELLED

当您收到购买令牌后,请遵循用于新购买令牌的同一验证流程。如需了解详情,请参阅验证购买。Google Play Developer API 将在订阅资源中返回 linkedPurchaseToken。请务必使 linkedPurchaseToken 中提供的令牌无效,以确保旧令牌不会被用于获取对您服务的访问权限。

提供订阅促销代码

利用促销活动或促销代码,您可以向限定数量的用户免费提供一次性商品或订阅试用服务。要针对试阅实现促销代码,请参阅实现促销活动

退还订阅费用

Google Play 不会针对订阅内容提供退款期限,而是需要用户直接向您申请退款。用户可以使用 Play 商店中的“我的订单”页面申请退款,也可以直接与您联系。

如果您收到退款申请,可以使用 Google Play Developer API 或 Merchant Center 执行以下操作:

  1. 取消订阅 (Purchases.subscriptions:cancel)。
  2. 验证订阅是否已被取消(返回 HTTP 响应代码 200)(Purchases.subscriptions:cancel)。
  3. 在不取消订阅的情况下将款项退还给用户 (Purchases.subscriptions:refund)。

如果您想要退还的金额大于最近一次付款金额,可以通过 Merchant Center 处理更多退款。

如果取消订阅,则系统会向您的安全后端服务器发送 SUBSCRIPTION_CANCELLED 状态。要处理 SUBSCRIPTION_CANCELLED,请参阅处理 SUBSCRIPTION_CANCELLED

撤消订阅

使用 Google Play Developer API,您可以通过 Purchases.subscriptions:revoke 撤消订阅。如果撤消订阅,则系统会立即移除用户对该订阅内容的使用权限,通常在您或 Google 怀疑有欺诈行为时撤消订阅。

取消订阅

用户还可以从 Play 商店应用中取消订阅。使用 Google Play Developer API,您还可以通过 Purchases.subscriptions:cancel 取消订阅。

注意:当用户从“我的订单”页面申请退款时,通常会用到此 API。如需了解详情,请参阅退还订阅费用

用户会一直保留对相关内容的使用权限,直到当前结算周期结束为止。结算周期结束后,使用权限会被撤消。

重要提示:只要任何用户仍有权使用该内容,您就不应从 Google Play 中移除订阅。移除归用户所有的内容会受到处罚。如需了解详情,请参阅创建订阅中的“取消”部分。

恢复订阅

注意:为确保在所有应用中提供一致的用户体验,从 2019 年 4 月 15 日开始,Google 将为所有启用了订阅的开发者默认启用恢复功能。我们强烈建议您在此日期之前测试恢复功能,以确保您可以正确处理恢复。为了让用户更顺利地完成过渡,Google 已为所有许可测试帐号启用了恢复功能。如需详细了解如何测试订阅,请参阅测试订阅专用功能

如果您需要更改代码但无法在 2019 年 4 月 15 日之前完成这些更改,则可以在 Google Play 管理中心选择停用(方法是依次转到商店发布 > 应用内商品 > 订阅设置,然后取消选中允许用户恢复 Google Play 订阅内容)。另请注意,您可以在更改生效日期(2019 年 4 月 15 日)后选择停用。

已被取消的订阅会在到期日前继续显示在 Play 商店应用中。用户可以通过在 Play 商店应用的“订阅”部分中点击恢复在已被取消的订阅到期之前恢复订阅。

图 10. Play 商店应用中的“帐号”>“订阅”部分

可通过两种方式检测订阅何时恢复:

  1. 您的应用将收到 SUBSCRIPTION_RESTARTED 通知。如需了解更多详情,请参阅实时开发者通知
  2. 您可以在每次打开应用时调用 getPurchases() 方法。请注意,在恢复订阅后,purchaseToken 将与订阅被取消之前相同。

要让用户能够恢复已被取消的订阅,请执行以下操作:

  1. 登录 Google Play 管理中心。
  2. 选择您的应用,然后依次转到商店发布 > 应用内商品
  3. 选择订阅标签,然后展开订阅设置部分。
  4. 选中允许用户恢复 Google Play 订阅内容复选框,如图 11 所示,然后点击保存
    图 11. Google Play 管理中心内的“启用订阅恢复功能”复选框

延迟结算

使用 Google Play Developer API,您可以通过 Purchases.subscriptions:defer 将订阅者的下一个结算日期提前。用户将继续订阅内容并拥有对该内容的完全访问权限,但在延迟期内不会被扣款。系统会更新订阅续订日期以反映新的订阅日期。您可以通过延迟结算完成以下操作:

  • 将免费访问权限作为套装或特别优惠的一部分提供给用户(例如,让订阅印刷杂志的用户免费访问网络内容)。
  • 向客户赠送内容的访问权限。

每次调用 API 的结算最短可延迟一天,最长为一年。您可以在新的结算日期到来之前再次调用 API,以进一步延迟结算。

例如,Darcy 按月订阅了 Fishing Quarterly 应用的在线内容。正常情况下,每个月第一天她都需要支付 1.25 英镑的费用。在 3 月,他参与了应用发布者的在线调查。发布者将下一笔付款推迟到 5 月 15 日(在她之前安排的 4 月 1 日结算日期后的六周),为她提供免费使用六周的奖励。Darcy 不需要在 4 月或 5 月初付款,并且仍能访问相关内容。在 5 月 15 日,她支付了当月 1.25 英镑的正常订阅费用。她接下来的续订日期将是 6 月 15 日。

您可能需要使用电子邮件或在应用中通知用户,让他们知道自己的结算日期已被延迟(发生更改)。

赢回客户

如果某位忠诚客户在使用您的服务很长一段时间后选择离开,您可能需要提供一个代表订阅特殊定价的商品 ID,也称为“赢回 SKU”。您可以在应用中提供此选项,也可以通过电子邮件通知用户此选项。要开始赢回订阅,请使用 Google Play 结算库在 Android 应用中启动购买流程。这与新订阅流程相同,但您可以决定用户可使用哪个 SKU。

最新资讯和资源

后续步骤

在添加订阅专用功能后,请继续执行最佳做法