订阅生命周期

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

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

当用户的订阅状态发生更改时,后端服务器会收到 SubscriptionNotification 消息。

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

如需更新后端中的状态,请使用通知中随附的购买令牌调用 purchases.subscriptionsv2.get API。此端点会根据购买令牌提供最新的订阅状态,同时被视为订阅管理的可信来源。

购买令牌的有效期是从订阅成功到订阅到期后 60 天。此日期过后,购买令牌不再有效,不能再用于调用 Google Play Developer API。

新自动续订型订阅购买交易

当用户购买订阅时,系统会向您的 RTDN 客户端发送一条类型为 SUBSCRIPTION_PURCHASEDSubscriptionNotification 消息。无论您接收此通知或注册新应用内购买交易的方法是通过 PurchasesUpdatedListener,还是在应用内以 onResume() 方法手动提取购买交易,都应在安全的后端处理新购买交易。为此,请按以下步骤操作:

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

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 商店中修正付款方式问题。当用户进入宽限期时,您还应鼓励用户修正付款方式,以防发生非自愿的付款失败问题。可采用一个简单的方法执行此操作,即使用 In-App Messaging 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 通知,以便您尽快告知他们订阅内容暂时无法访问的原因。可采用一个简单的方法执行此操作,即使用 In-App Messaging 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
      }
    }
  ],
}

价格变动

请参阅价格变动最佳做法指南,了解如何更改自动续订价格并在适当情况下通知用户。

当价格变动作为旧式订阅应用到现有订阅者时,如果用户采取措施确认或拒绝新价格,您将收到 RTDN。

处理用户对选择接受价格变动的确认

当用户接受订阅价格上调时,您会收到类型为 SUBSCRIPTION_PRICE_CHANGED_CONFIRMEDSubscriptionNotification 消息。如果取消价格下调,或者在订阅价格上调后续订,您会收到类型为 SUBSCRIPTION_RENEWEDSubscriptionNotification 消息。将此通知视为其他任何续订

处理用户选择不接受价格上调的情况

如果用户未在需要以更高价格续订之前选择接受价格上调,则会自动退订,并且您会收到 SUBSCRIPTION_CANCELED 类型的 SubscriptionNotification。可以按照取消部分的说明来处理此事件。

用户也可以按照同样的机制取消订阅,以免价格上调。

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

与自动续订型订阅一样,您必须在每次新购买后确认预付费方案。对于预付费方案,您必须同时处理初始购买交易和所有充值交易,因为用户每次都必须完成购买流程。

由于预付费方案的时长有可能比较短,因此请务必尽快确认购买交易。时长为一周或更长时间的预付费方案必须在三天内确认。对于时长不到一周的预付费方案,其确认时间不得晚于方案时长过半之时。例如,开发者必须在 1.5 天内确认购买时长为三天的预付费方案。

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

每当购买预付费方案订阅(包括每次充值)时,系统都会向您的 RTDN 客户端发送类型为 SUBSCRIPTION_PURCHASEDSubscriptionNotification 消息。调用 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 字段。

预付费方案不会自动续订,因此无法取消。如果用户想要取消预付费方案,则可以让其到期。