订阅生命周期

订阅购买在其生命周期中会经历多个不同的状态,这取决于许多因素,包括自动续订行为、付款失败情况和开发者管理操作。

处理自动续订订阅的生命周期

当用户的订阅状态发生变化时,您的后端服务器会收到一条 SubscriptionNotification 消息

图 1. 自动续订订阅购买的生命周期状态和转换事件。

要在后端更新状态,请使用包含在通知中的购买令牌调用 purchases.subscriptionsv2.get API。此端点在给定购买令牌的情况下提供最新的订阅状态,并被视为订阅管理的事实来源。

购买令牌从订阅注册到过期后 60 天内有效。在此日期之后,购买令牌将不再有效,无法用于调用 Google Play 开发者 API。

新的自动续订订阅购买

当用户购买订阅时,类型为 SUBSCRIPTION_PURCHASEDSubscriptionNotification 消息将发送到您的 RTDN 客户端。无论您是接收此通知,还是通过 PurchasesUpdatedListener 在应用内注册新购买,或者在应用的 onResume() 方法中 手动获取购买,都应在您的安全后端处理新购买。为此,请按照以下步骤操作

  1. 查询 purchases.subscriptionsv2.get 端点以获取包含最新订阅状态的 订阅资源
  2. 确保 subscriptionState 字段的值为 SUBSCRIPTION_STATE_ACTIVE
  3. 验证购买.
  4. 授予用户访问内容的权限。如果在购买时使用ExternalAccountIdentifiers对象设置了标识符(使用setObfuscatedAccountIdsetObfuscatedProfileId),则可以通过订阅资源中的ExternalAccountIdentifiers对象识别与购买关联的用户帐户。

Play 结算库还包含用于确认订阅的方法acknowledgePurchase(),以及用于检查确认状态的方法isAcknowledged()。但是,我们建议您在后端处理购买流程,以提高安全性。

新购买的订阅资源类似于以下示例

{
  "kind": "androidpublisher#subscriptionPurchaseV2",
  "startTime": "2022-04-22T18:39:58.270Z",
  "regionCode": "US",
  "subscriptionState": "SUBSCRIPTION_STATE_ACTIVE",
  "latestOrderId": "GPA.3333-4137-0319-36762",
  "acknowledgementState": "ACKNOWLEDGEMENT_STATE_PENDING", // need to acknowledge new purchases
  "lineItems": [
    {
      "productId": "sub_variant_plan01",
      "expiryTime": next_renewal_date,
      "autoRenewingPlan": {
        "autoRenewEnabled": true
      }
    }
  ],
}

订阅续订

对于非分期付款的自动续订订阅,订阅续订时会发送SUBSCRIPTION_RENEWED通知。对于分期付款订阅,每次在账单日期收费时都会发送SUBSCRIPTION_RENEWED通知。确保用户仍然有权使用订阅,然后使用 Google Play 开发者 API 返回的订阅资源中提供的新的expiryTime更新订阅状态。订阅资源类似于以下示例

{
  "kind": "androidpublisher#subscriptionPurchaseV2",
  "startTime": "2022-04-22T18:39:58.270Z",
  "regionCode": "US",
  "subscriptionState": "SUBSCRIPTION_STATE_ACTIVE",
  "latestOrderId": "GPA.3333-4137-0319-36762",
  "acknowledgementState": "ACKNOWLEDGEMENT_STATE_ACKNOWLEDGED",
  "lineItems": [
    {
      "productId": "sub_variant_plan01",
      "expiryTime": next_renewal_date,
      "autoRenewingPlan": {
        "autoRenewEnabled": true
      }
    }
  ]
}

您无需确认订阅续订。

宽限期

如果订阅续订存在付款问题,Google 会通知用户,并在订阅过期前定期尝试续订订阅一段时间。此恢复期可能包括宽限期和账户保留期。在宽限期内,用户仍应可以访问其订阅权限。

queryPurchasesAsync()方法继续返回处于宽限期的购买。如果您的应用仅依赖queryPurchasesAsync来检查用户是否有权使用订阅,则您的应用应自动处理宽限期,因为这些订阅在 Play 结算库中显示为活动状态。

将订阅状态与您的后端同步,可以让您更了解付款失败,并在尝试减少非自愿流失时提供更多上下文。侦听类型为SUBSCRIPTION_IN_GRACE_PERIODSubscriptionNotification消息,以便在用户进入宽限期时收到通知。在用户处于宽限期期间,订阅资源包含autoRenewEnabled = true。Google Play 会动态延长expiryTime值,直到宽限期过期,因为权限应持续到用户取消或宽限期达到最大长度为止。subscriptionState字段在此期间的值为SUBSCRIPTION_STATE_IN_GRACE_PERIOD。订阅资源类似于以下示例

{
  "kind": "androidpublisher#subscriptionPurchaseV2",
  ...
  "subscriptionState": "SUBSCRIPTION_STATE_IN_GRACE_PERIOD",
  ...
  "lineItems": [
    {
      "productId": "sub_variant_plan01",
      "expiryTime": timestamp_in_future,
      "autoRenewingPlan": {
        "autoRenewEnabled": true
      }
    }
  ],
}

Play 会通知处于宽限期的用户其付款已被拒绝,并提示他们在 Play 商店中解决其付款方式问题。当用户进入宽限期时,您还应鼓励用户修复其付款方式,以防失败是非自愿的。一种简单的方法是使用应用内消息传递 API。如果您在用户打开应用时调用此 API,则会在临时的 Snackbar 中向用户显示 Play 消息,告知用户其付款已被拒绝。此消息还包含一个深度链接,供用户在 Google Play 上修复其付款方式。

用户修复其付款方式后,订阅将使用其原始续订日期续订,您可以按照续订中所述处理续订。

如果用户在宽限期内未修复其付款方式,则订阅将进入账户保留状态,并且他们将失去权限。

宽限期访问和恢复

图 2 显示了进入宽限期并在用户修复付款方式后恢复的订阅的时间线。宽限期结束后,用户应失去订阅权益并进入账户保留状态。

图 2. 进入宽限期并在结束前恢复的订阅的时间线。

务必记住以下几点

  • 在宽限期内,用户应保留对订阅权益的访问权限。
  • 当订阅在宽限期内恢复时,续订日期不会重置。
  • 如果您延长宽限期(例如,从 7 天延长到 14 天),则处于宽限期的用户将获得延长访问订阅权益的时间。
  • 如果您缩短宽限期,则在旧宽限期内已超过新宽限期的用户将立即被撤销订阅权益。例如,如果您将宽限期从 14 天缩短到 7 天,则在旧宽限期的第 8 天到第 14 天的用户将立即被撤销订阅权益。
  • 订阅保持活动状态,并且在静默宽限期结束之前您不会收到宽限期 RTDN。

静默宽限期

您可以将宽限期设置为 0 天,但 Play 会等待至少 1 天以确保有足够的时间进行付款重试。此静默宽限期为付款处理提供安全保障。在此 24 小时内,订阅将保持ACTIVE状态

保持与订阅状态更改同步的最佳方法是侦听和响应实时开发者通知 (RTDN)。在 RTDN 时间(而不是到期时间)调用purchases.subscriptionsv2.get()方法,以获得更准确的订阅状态。

根据 24 小时静默宽限期后的订阅状态,您应该会收到以下通知之一

  • SUBSCRIPTION_ON_HOLD(如果已启用)
  • SUBSCRIPTION_CANCELED(如果已取消)
  • SUBSCRIPTION_EXPIRED(如果已过期)
  • SUBSCRIPTION_RENEWED(如果已成功续订)

您也可以在 24 小时静默宽限期后的任何时间调用subscriptionV2.get()方法来获取订阅的最新状态。

账户保留

如果订阅续订存在付款问题,则在任何宽限期结束后,将开始账户保留期。当订阅进入账户保留状态时,您应阻止访问订阅权限。

在账户保留期间,您应继续根据需要处理任何取消、恢复或订阅的重新购买,因为用户可能在订阅处于保留状态时进行这些更改。

RTDN 会在用户进入账户保留期时通知您,以便您可以尽快告知他们其访问订阅被暂停的原因。一种简单的方法是使用应用内消息传递 API。当您的用户打开应用时调用此 API 将会在临时的 Snackbar 中向用户显示一条消息,告知他们其付款已被拒绝。此消息还包含一个深度链接,供用户在 Google Play 上修复其付款方式。

如果您的用户可以在您的应用外部访问订阅内容,他们可能会发现自己在不同的界面上失去了访问权限。您可能需要向用户发送推送通知或电子邮件,让他们知道由于付款失败,他们的订阅不再有效。

在账户保留期间,queryPurchasesAsync()方法不会返回订阅,因此,如果您的应用依赖此方法来显示现有购买,则应默认支持账户保留。

使用实时开发者通知,当订阅进入账户保留状态时,您会收到类型为SUBSCRIPTION_ON_HOLDSubscriptionNotification消息。从您的安全后端服务器调用purchases.subscriptionsv2.get方法以检索新的订阅信息。在账户保留期间,订阅资源expiryTime字段设置为过去的日期时间戳,而subscriptionState字段设置为SUBSCRIPTION_STATE_ON_HOLD

{
  "kind": "androidpublisher#subscriptionPurchaseV2",
  ...
  "subscriptionState": "SUBSCRIPTION_STATE_ON_HOLD",
  ...
  "lineItems": [
    {
      "productId": "sub_variant_plan01",
      "expiryTime": timestamp_in_past,
      ...
    }
  ],
}

要恢复访问权限,用户必须修复其付款方式。Play 会通知处于账户保留状态的用户其付款已被拒绝,您也应鼓励他们修复其付款方式。

用户修复其付款方式后,订阅将恢复为活动状态,然后您必须恢复对已订阅内容的访问权限。在这种情况下,购买令牌与账户暂停开始之前的令牌相同,因为恢复的是相同的购买,并且您会收到类型为SUBSCRIPTION_RECOVERED的RTDN。

对于分期付款订阅,任何单个付款尝试都可能发生付款失败和恢复。

恢复后,Play结算库将通过queryPurchasesAsync()方法再次返回订阅。如果您使用此方法来确定用户是否有权使用订阅,则您的应用应自动处理从账户暂停中恢复的订阅。

侦听类型为SUBSCRIPTION_RECOVEREDSubscriptionNotification消息,以便在订阅恢复并且用户应该重新获得访问权限时收到通知。如果您在收到此通知后查询订阅,则expiryTime字段将设置为将来的时间戳,而subscriptionState字段将再次设置为SUBSCRIPTION_STATE_ACTIVE

{
  "kind": "androidpublisher#subscriptionPurchaseV2",
  ...
  "subscriptionState": "SUBSCRIPTION_STATE_ACTIVE",
  ...
  "lineItems": [
    {
      "productId": "sub_variant_plan01",
      "expiryTime": next_renewal_date,
      ...
    }
  ],
}

如果用户在账户暂停期结束前未修复其付款方式,则您会收到类型为SUBSCRIPTION_CANCELED的RTDN。有关处理取消的说明,请参阅取消。当您查询以这种方式取消的订阅时,返回的expiryTime字段将设置为过去的时间戳。

{
  "kind": "androidpublisher#subscriptionPurchaseV2",
  ...
  "subscriptionState": "SUBSCRIPTION_STATE_CANCELED",
  ...
  "lineItems": [
    {
      "productId": "sub_variant_plan01",
      "expiryTime": timestamp_in_past,
      ...
    }
  ],
}

在账户暂停期间收到取消通知后,您还会立即收到类型为SUBSCRIPTION_EXPIRED的RTDN,因为用户已超出付费权限,并且订阅已随着取消而流失。您可以按照通常的方式处理此过期

用户可以在账户暂停期间,通过重新购买相同的订阅计划或您在应用中提供的任何其他计划(来自其原始购买)来重新获得访问权限。在这种情况下,会发出新的购买令牌,并且新值将作为代表此新实例的SUBSCRIPTION_PURCHASED事件的一部分返回。

账户暂停访问和恢复

图3显示了进入账户暂停状态然后在用户修复付款方式后恢复的订阅的时间线。

图3. 进入账户暂停状态并在结束前恢复的订阅的时间线。

与之前的示例类似,图4显示了首先进入宽限期,然后进入账户暂停状态,最后在暂停期间恢复的订阅的时间线。

图4. 进入宽限期,然后进入账户暂停状态,最后在账户暂停结束前恢复的订阅的时间线。

务必记住以下几点

  • 在订阅进入账户暂停状态之前,Google Play 会额外尝试最多 48 小时来收取付款方式。在此期间,用户保留订阅权益。此重试期结束后,订阅将进入账户暂停状态,用户应失去对订阅权益的访问权限。
  • 当订阅从暂停状态恢复,并且付款方式失败时,订阅将直接进入账户暂停状态。
  • 当订阅从账户暂停中恢复时,续订日期将重置。

过期

订阅过期后,用户应失去对订阅的访问权限。在这种情况下,将发送类型为SUBSCRIPTION_EXPIREDSubscriptionNotification消息。收到此通知后,请查询 Google Play 开发者 API 以获取最新的订阅资源。确认subscriptionStateSUBSCRIPTION_STATE_EXPIRED后,请移除权限并在您的后端将购买状态注册为无效。订阅资源类似于以下示例

{
  "kind": "androidpublisher#subscriptionPurchaseV2",
  ...
  "subscriptionState": "SUBSCRIPTION_STATE_EXPIRED",
  ...
  "lineItems": [
    {
      "productId": "sub_variant_plan01",
      "expiryTime": expiration_time_in_past,
      ...
    }
  ],
}

取消

用户可以自愿从 Play 订阅中心取消订阅,或者如果他们在账户暂停后未恢复,则他们的订阅会自动取消。开发者也可以使用purchases.subscriptions.cancel触发取消。取消订阅后,用户可以保留对内容的访问权限,直到当前计费周期结束。计费周期结束时,应撤销访问权限。

取消非分期付款自动续订订阅会触发SUBSCRIPTION_CANCELED通知。收到此通知后,从 Google Play 开发者 API 返回的订阅资源subscriptionState字段设置为SUBSCRIPTION_STATE_CANCELED,而expiryTime字段包含用户应失去对订阅访问权限的日期。如果该日期已过,则用户应立即失去权限。例如,如果用户在因付款失败而处于账户暂停状态时取消订阅,则可能会发生这种情况。

已取消购买的订阅资源类似于以下示例

{
  "kind": "androidpublisher#subscriptionPurchaseV2",
  ...
  "subscriptionState": "SUBSCRIPTION_STATE_CANCELED",
  ...
  "lineItems": [
    {
      "productId": "sub_variant_plan01",
      "expiryTime": expiration_time,
      ...
    }
  ],
}

对于分期付款订阅,在承诺期内仍有付款时,用户发起的取消将发送SUBSCRIPTION_CANCELLATION_SCHEDULED通知。取消正在等待,并在当前承诺期结束时生效。收到此通知后,从 Google Play 开发者 API 返回的订阅资源的 subscriptionState 字段设置为SUBSCRIPTION_STATE_ACTIVE,因为分期付款订阅在承诺期结束前仍处于活动状态。但是,存在一个空的 pendingCancellation 对象。SUBSCRIPTION_CANCELED通知将在承诺期结束时发送,随后是SUBSCRIPTION_EXPIRED通知。

正在等待取消的分期付款订阅购买的订阅资源类似于以下示例

{
  "kind": "androidpublisher#subscriptionPurchaseV2",
  ...
  "subscriptionState": "SUBSCRIPTION_STATE_ACTIVE",
  ...
  "lineItems": [
    {
      "productId": "sub_plan01",
      "expiryTime": expiration_time,
      "autoRenewingPlan": {
        "autoRenewEnabled": true,
        "recurringPrice": {
          "currencyCode": "USD",
          "units": "1",
          "nanos": 990000000
        },
        "installmentDetails": {
          "initialCommittedPaymentsCount": 6,
          "remainingCommittedPaymentsCount": 5,
          "pendingCancellation": {}
      ...
        }
      }
    }
  ],
}

您可以查看订阅资源中的canceledStateContext字段,以了解订阅取消的原因(例如,订阅是由用户、系统还是由您取消的)。如果订阅是由用户取消的,您可以查看userInitiatedCancellation字段,以了解用户取消订阅的原因。这有助于改进沟通策略。

当订阅被取消但尚未过期时,它仍将从queryPurchasesAsync()返回。您可能希望在您的应用中显示一条消息,告知用户他们的订阅已被取消并告知他们过期日期。

撤销

订阅可能由于多种原因被撤销,包括您的后端使用purchases.subscriptionsv2.revoke撤销订阅或购买被拒付。在这种情况下,请立即撤销用户的权限。发生这种情况时,将发送类型为SUBSCRIPTION_REVOKEDSubscriptionNotification消息。收到此通知后,从 Google Play 开发者 API 返回的订阅资源subscriptionState字段将设置为SUBSCRIPTION_STATE_EXPIRED

已撤销购买的订阅资源类似于以下示例

{
  "kind": "androidpublisher#subscriptionPurchaseV2",
  ...
  "subscriptionState": "SUBSCRIPTION_STATE_EXPIRED",
  ...
  "lineItems": [
    {
      "productId": "sub_variant_plan01",
      "expiryTime": expiration_time,
      ...
    }
  ]
}

延迟订阅

您可能希望延长用户权限的原因有很多。例如,您可能希望向用户提供免费访问权限作为特别促销活动,例如购买电影后免费赠送一周,或向客户提供免费访问权限作为善意姿态。您可以使用 Play 开发者 API 中的purchases.subscriptions.defer方法来提前自动续订订阅的下一个计费日期。执行此操作时,将发送类型为SUBSCRIPTION_DEFERREDSubscriptionNotification消息。在延迟期间,用户已订阅您的内容并拥有完全访问权限,但不会被收费。订阅续订日期将更新以反映新日期。

对于预付费计划,您可以使用延迟计费 API 来延迟过期时间。

延迟订阅的订阅资源类似于以下示例

{
  "kind": "androidpublisher#subscriptionPurchaseV2",
  ...
  "subscriptionState": "SUBSCRIPTION_STATE_ACTIVE",
  ...
  "lineItems": [
    {
      "productId": "sub_variant_plan01",
      "expiryTime": timestamp_in_future,
      ...
    }
  ],
}

暂停订阅

您可以通过启用用户暂停其订阅的功能来减少自愿流失。启用暂停功能后,用户可以选择暂停其订阅一段时间,时间范围为一周到三个月,具体取决于重复周期。

订阅重复性 每周 每月 三个月 六个月 每年
可用的暂停时长* 1 周
2 周
3 周
4 周
1 个月
2 个月
3 个月
1 个月
2 个月
3 个月
1 个月
2 个月
3 个月
不适用
*随时可能更改。

订阅暂停仅在当前账单周期结束之后生效。在订阅暂停期间,用户无法访问订阅内容,并且无需支付续费价格。暂停期结束后,订阅将恢复,Google 将尝试续订订阅。如果续订成功,订阅将再次激活。如果由于付款问题导致续订失败,则用户将进入帐户暂停状态,如图 5 和图 6 所示。

图 5. 用户暂停然后恢复其订阅。
图 6. 用户暂停其订阅然后进入帐户暂停状态。

用户也可以选择在暂停期间随时手动恢复订阅,如图 6 所示。当用户手动恢复时,账单日期将更改为手动恢复日期。

当用户的订阅暂停时,Play 计费库不会通过queryPurchasesAsync()方法返回订阅。如果订阅已恢复,queryPurchasesAsync()方法将再次返回它。

监听 RTDN 以了解用户何时暂停其订阅。这些通知还可以让您在您的应用中通知用户他们已暂停其订阅并且无法访问它。您还应提供一种方法,让用户可以使用指向 Google Play 的深层链接随时手动恢复其订阅。

当您的用户启动其订阅暂停时,会发送类型为SUBSCRIPTION_PAUSE_SCHEDULE_CHANGEDSubscriptionNotification消息。此时,用户应保留对其订阅的访问权限,直到下一个续订日期,并且订阅资源包含autoRenewEnabled = truesubscriptionState字段的值此时为SUBSCRIPTION_STATE_ACTIVE

当暂停生效时,会发送类型为SUBSCRIPTION_PAUSEDSubscriptionNotification消息。发生这种情况时,用户应失去对其订阅的访问权限,并且订阅资源包含autoRenewEnabled = true,并且subscriptionState字段设置为SUBSCRIPTION_STATE_PAUSED。您可以通过检查PausedStateContext对象来查看订阅预计何时再次续订。

如果订阅在暂停期结束时自动恢复,或者用户选择手动恢复订阅,则会发送类型为SUBSCRIPTION_RENEWEDSubscriptionNotification消息。这应按续订部分所述进行处理。

如果在暂停后尝试恢复订阅时付款失败,则会发送类型为SUBSCRIPTION_ON_HOLDSubscriptionNotification消息。这应按帐户暂停部分所述进行处理。

重新订阅

对于自动续订的订阅基础套餐,Google Play 商店可能会显示一个重新订阅按钮。此按钮允许用户重新访问订阅。由于各种原因,它可能不会出现,例如当订阅很久以前过期时。

图 7. Google Play 商店应用的帐户>订阅部分显示带有重新订阅按钮的已取消订阅。

尽管按钮始终标注为重新订阅,但其功能取决于订阅状态。

当订阅已取消但尚未过期时,用户仍在订阅并获得订阅权益。如果用户点击重新订阅,则取消将有效撤销,并且订阅将继续续订。此操作在 Play 开发者文档和 API 中称为恢复

自动续订订阅过期后,您可以允许用户购买相同的订阅基础套餐。此操作在 Play 开发者文档和 API 中称为重新订阅。您可以在Play 管理中心或使用 API 为每个基础套餐配置此选项。

过期前恢复

如果您的应用仅依赖于queryPurchasesAsync()方法来确定用户是否有权获得订阅,则您的应用应自动处理恢复,因为queryPurchasesAsync()方法会在其过期日期之前继续返回已取消的购买。恢复的订阅将继续续订,就像它没有被取消一样。

如果您的应用将订阅状态与后端同步,则应监听类型为SubscriptionNotification且类型为SUBSCRIPTION_RESTARTED的消息。收到此 RTDN 后,您的应用可以响应通知,记录订阅现在已设置为续订,并停止在您的应用中显示恢复消息。订阅资源类似于以下示例

{
  "kind": "androidpublisher#subscriptionPurchaseV2",
  ...
  "subscriptionState": "SUBSCRIPTION_STATE_ACTIVE",
  ...
  "lineItems": [
    {
      "productId": "sub_variant_plan01",
      "expiryTime": next_renewal_date
      ...
    }
  ],
}

过期后重新订阅

如果使用 Google Play 管理中心或 API 将自动续订的基础套餐配置为允许重新订阅,则用户可以在 Google Play 商店中重新购买已过期的订阅。

这些是新的购买。Google Play 会发出一个全新的购买令牌,并且您的后端会收到类型为SUBSCRIPTION_PURCHASED的 RTDN。在这种情况下,此类应用外购买的购买状态不包含与原始购买关联的linkedPurchaseToken,因为原始订阅已完全过期。这些是您的后端必须像任何其他购买一样处理和确认的新购买。

升级、降级和重新订阅

当用户升级、降级或在订阅过期前从您的应用取消订阅后注册时,旧订阅将失效,并将创建一个具有新购买令牌的新订阅

此外,从 Google Play 开发者 API 返回的订阅资源包含一个linkedPurchaseToken字段,该字段指示用户从中升级、降级或重新订阅的旧购买。您可以使用该字段中的购买令牌查找旧订阅并识别现有用户帐户,以便您可以将新购买与同一帐户关联。

在您的应用中向用户提供升级、降级或重新订阅选项之前,您必须确认现有订阅。如果现有订阅仍在等待确认,则任何套餐更改或重新订阅都会被阻止。

如果用户成功购买升级、降级或重新订阅,则这是一个新购买,您必须确认它。推荐的方法是使用Google Play 开发者 API。订阅资源类似于以下示例

{
  "kind": "androidpublisher#subscriptionPurchaseV2",
  ...
  "subscriptionState": "SUBSCRIPTION_STATE_ACTIVE",
  "linkedPurchaseToken": old_purchase_token,
  ...
  "lineItems": [
    {
      "productId": "sub_variant_plan01",
      "expiryTime": next_renewal_date,
      "autoRenewingPlan": {
        "autoRenewEnabled": true
      }
    }
  ],
}

价格变动

请参阅价格变动最佳实践指南,了解如何更改自动续订订阅的价格以及在适当的时候通知用户。

当价格变动作为选择加入应用于现有订阅者时,如果用户采取行动确认或拒绝新价格,您将收到 RTDN。

处理用户确认选择加入的价格变动

当用户接受您的订阅价格上涨时,您会收到类型为SUBSCRIPTION_PRICE_CHANGED_CONFIRMEDSubscriptionNotification消息。对于选择退出价格下降,或者当订阅价格上涨续订时,您会收到类型为SUBSCRIPTION_RENEWEDSubscriptionNotification消息。将此通知视为任何其他续订

处理未接受选择加入价格上涨的情况

如果用户在需要以较高价格续订之前未接受您的选择加入价格上涨,则他们会自动取消订阅,您会收到类型为SUBSCRIPTION_CANCELEDSubscriptionNotification消息。按取消部分所述处理此事件。

用户还可以按照相同的机制取消其选择退出价格上涨的订阅。

处理预付费套餐的生命周期

与自动续订订阅一样,您必须在每次新购买后确认预付费套餐。对于预付费套餐,您必须完全处理初始购买和任何充值,因为用户每次都必须经历购买流程。

由于预付费套餐期限可能很短,因此尽快确认购买非常重要。期限为一周或更长的预付费套餐必须在 3 天内确认。期限短于一周的预付费套餐必须在其期限的一半内确认。例如,开发者有 1.5 天的时间来确认三天预付费套餐的购买。

图 8. 订阅购买的生命周期状态和转换事件。

每当购买预付费套餐订阅(包括每次充值)时,都会向您的 RTDN 客户端发送类型为SUBSCRIPTION_PURCHASEDSubscriptionNotification消息。调用purchases.subscriptionsv2.get方法以检查最新的预付费套餐订阅状态。

充值购买会发出新的购买令牌,您会在新订阅购买状态中作为linkedPurchaseToken字段的一部分收到之前的购买令牌。购买令牌从订阅注册到过期后 60 天内有效。在此日期之后,购买令牌将不再有效用于调用 Google Play 开发者 API。

预付费套餐购买的订阅资源类似于以下示例

{
  "kind": "androidpublisher#subscriptionPurchaseV2",
  "startTime": "2022-04-22T18:39:58.270Z",
  "regionCode": "US",
  "subscriptionState": "SUBSCRIPTION_STATE_ACTIVE",
  "latestOrderId": "GPA.3333-4137-0319-36762",
  "acknowledgementState": "ACKNOWLEDGEMENT_STATE_ACKNOWLEDGED",
  "lineItems": [
    {
      "productId": "prepaid_plan01",
      "expiryTime": expiry_date,
      "prepaidPlan": {
        "allowExtendAfterTime": timestamp_after_which_topups_are_allowed
      }
    }
  ]
}

您可以在expiryTime字段中查看权限到期时间。充值购买会累积增加权限时间。这意味着如果用户在原始权限到期前充值,新的时间将添加到之前的过期日期之后。

您可能希望在您的应用中显示一条消息,告知用户他们的预付费订阅可以通过充值来延长。要了解用户何时可以充值,请检查订阅资源中的allowExtendAfterTime字段。

预付费计划不会自动续订,因此无法取消。如果用户想要取消预付费计划,可以使其达到过期日期。