订阅生命周期

订阅购买在其整个生命周期中可能会经历多种不同的状态,具体取决于许多因素,包括自动续订行为、付款被拒情况以及开发者管理操作。

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

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

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

要在您的后端中更新状态,请使用通知中包含的购买令牌调用 purchases.subscriptionsv2.get API。该端点根据购买令牌提供最新的订阅状态,并被视为订阅管理的单一事实来源。

购买令牌从订阅注册之日起算有效期,直到到期后 60 天。在此日期之后,购买令牌将不再有效,无法用于调用 Google Play Developer API。

新的自动续订订阅购买

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

  1. 查询 purchases.subscriptionsv2.get 端点以获取包含最新订阅状态的订阅资源
  2. 确保 subscriptionState 字段的值为 SUBSCRIPTION_STATE_ACTIVE
  3. 验证购买。.
  4. 向用户授予内容访问权限。如果购买时使用 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 Developer 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,他们会看到 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 会向用户显示一个临时信息条中的消息,告知他们付款已被拒绝。此消息还包含一个深层链接,供用户在 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 Developer 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 Developer 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 Developer 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 Developer API 返回的订阅资源subscriptionState 字段设置为 SUBSCRIPTION_STATE_EXPIRED

已撤销购买的订阅资源示例如下所示:

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

延期订阅

您可能希望延长用户权益的原因有很多。例如,您可能想以特殊促销活动的形式向用户提供免费访问权限,例如购买电影赠送一周免费访问权限,或作为善意姿态向客户提供免费访问权限。您可以使用 Play Developer 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 = true。此时,subscriptionState 字段的值为 SUBSCRIPTION_STATE_ACTIVE

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

如果订阅在暂停期结束时自动恢复或用户选择手动恢复订阅,则会发送类型为 SUBSCRIPTION_RENEWEDSubscriptionNotification 消息。应按续订中的说明处理此通知。

如果在尝试在暂停后恢复订阅时发生付款失败,则会发送类型为 SUBSCRIPTION_ON_HOLDSubscriptionNotification 消息。应按帐号保留中的说明处理此问题。

重新订阅

对于自动续订订阅基本方案,Google Play 商店可能会显示“重新订阅”按钮。此按钮允许用户重新获得订阅的访问权限。由于多种原因,例如订阅很久以前就已到期,该按钮可能不会出现。

图 7. Google Play 商店应用的“帐号 > 订阅”部分显示了已取消订阅以及“重新订阅”按钮。

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

当订阅已取消但尚未到期时,用户仍订阅并享受订阅权益。如果用户点按“重新订阅”,取消将有效地撤销,订阅将继续续订。此操作在 Play 开发者文档和 API 中称为恢复

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

到期前恢复

如果您的应用完全依赖于 queryPurchasesAsync() 方法来确定用户是否有权获得订阅,则您的应用应自动处理恢复,因为 queryPurchasesAsync() 方法会继续返回到期日之前的已取消购买。恢复的订阅将继续续订,如同未取消一样。

如果您的应用将订阅状态与后端同步,您应该监听类型为 SUBSCRIPTION_RESTARTEDSubscriptionNotification 消息。收到此 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 Developer API 返回的订阅资源包含一个 linkedPurchaseToken 字段,该字段指示用户升级、降级或重新订阅的旧购买。您可以使用该字段中的购买令牌查找旧订阅并识别现有用户帐号,以便将新购买与同一帐号关联。

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

如果用户成功购买升级、降级或重新订阅,这是一笔新购买,您必须确认。推荐的方法是使用 Google Play Developer API。订阅资源示例如下所示:

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

价格变动

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

添加价格变动以及价格变动状态的任何更新时,您将收到 SUBSCRIPTION_PRICE_CHANGE_UPDATED RTDN。您可以查询 purchases.subscriptionsv2.get 端点以获取订阅资源,其中将包含订阅中每个项目的价格变动详情。

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

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

当用户接受您的订阅价格上涨时,您会收到类型为 SUBSCRIPTION_PRICE_CHANGE_UPDATEDSubscriptionNotification 消息。

处理价格变动应用后的续订

价格下降时,或订阅价格上涨续订时,您将收到类型为 SUBSCRIPTION_RENEWEDSubscriptionNotification 消息。像处理任何其他续订一样处理此通知。

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

如果用户在需要以更高价格续订之前尚未接受您的选择加入价格上涨,他们将自动取消订阅,您将收到类型为 SUBSCRIPTION_CANCELEDSubscriptionNotification 消息。按照取消中的说明处理此事件。

用户也可以通过相同机制取消选择退出价格上涨的订阅。

处理预付费方案的生命周期

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

由于预付费方案持续时间可能很短,因此务必尽快确认购买。持续时间为一周或更长的预付费方案必须在 3 天内确认。持续时间短于一周的预付费方案必须在方案持续时间的一半内确认。例如,开发者有 1.5 天的时间来确认购买三天预付费方案。

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

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

充值购买会发出新的购买令牌,您将在新的订阅购买状态的 linkedPurchaseToken 字段中收到先前的购买令牌。购买令牌的有效期从订阅注册之日起,直到到期后 60 天。在此日期之后,购买令牌将不再有效,无法用于调用 Google Play Developer 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 字段。

预付费方案不会自动续订,因此无法取消。如果用户想取消预付费方案,他们可以让它达到到期日期。

适用于预付费方案的 SubscriptionPurchaseV2 字段

已添加新字段以支持预付费方案,这些方案由用户而非自动续订延长。所有字段均适用于预付费方案,与适用于自动续订订阅的字段相同,但以下例外情况除外:

  • [新增字段] lineItems[0].prepaid_plan.allowExtendAfterTime:指示用户何时可以购买另一笔充值来延长其预付费方案,因为用户一次只能拥有一个未消耗的充值。
  • [新增字段] SubscriptionState:指定订阅对象状态。对于预付费方案,此值始终为 ACTIVEPENDINGCANCELED
  • lineItems[0].expiryTime:对于预付费方案,此字段始终存在。
  • paused_state_context:此字段从未存在,因为预付费方案无法暂停。
  • lineItems[0].auto_renewing_plan:预付费方案不存在此字段。
  • canceled_state_context:预付费方案不存在此字段,因为此字段仅适用于主动取消订阅的用户。
  • lineItems[0].productId:此字段取代了先前版本中的 subscriptionId