订阅购买在其生命周期中可能会经历几个不同的状态,这取决于许多因素,包括自动续订行为、付款失败情况和开发者管理操作。
处理自动续订订阅的生命周期
当用户的订阅状态发生变化时,您的后端服务器会收到一条 SubscriptionNotification
消息
要更新后端中的状态,请使用包含在通知中的购买令牌调用 purchases.subscriptionsv2.get
API。此端点在给定购买令牌的情况下提供最新的订阅状态,被视为订阅管理的事实来源。
购买令牌从订阅注册到过期后 60 天内有效。在此日期之后,购买令牌将不再有效,无法用于调用 Google Play 开发者 API。
新的自动续订订阅购买
当用户购买订阅时,会向您的 RTDN 客户端发送一条类型为 SUBSCRIPTION_PURCHASED
的 SubscriptionNotification
消息。无论您是接收此通知,还是通过 PurchasesUpdatedListener
在应用内注册新购买,或者在应用的 onResume()
方法中 手动获取购买,您都应该在安全的后端处理新购买。为此,请按照以下步骤操作
- 查询
purchases.subscriptionsv2.get
端点以获取包含最新订阅状态的 订阅资源。 - 确保
subscriptionState
字段的值为SUBSCRIPTION_STATE_ACTIVE
。 - 验证购买.
- 授予用户访问内容的权限。如果在购买时使用
setObfuscatedAccountId
和setObfuscatedProfileId
设置了标识符,则可以通过订阅资源中的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_PERIOD
的 SubscriptionNotification
消息以在用户进入宽限期时收到通知。在用户处于宽限期时,订阅资源 包含 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 显示了订阅进入宽限期并在用户修复付款方式后恢复的时间线。宽限期结束后,用户应失去订阅权益并进入账户保留状态。
务必记住以下几点
- 在宽限期内,用户应保留对订阅权益的访问权限。
- 当订阅在宽限期内恢复时,续订日期 *不会* 重置。
- 如果您延长宽限期(例如,从 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_HOLD
的 SubscriptionNotification
消息。从您的安全后端服务器调用 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_RECOVERED
的 SubscriptionNotification
消息以在订阅恢复且用户应重新获得访问权限时收到通知。如果您在收到此通知后查询订阅,则 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 显示了一个订阅进入账户持有状态,然后在用户修复其付款方式后恢复的时序图。
类似于前面的示例,图 4 显示了一个订阅首先进入宽限期,然后进入账户持有状态,并在持有期间恢复的时序图。
务必记住以下几点
- 在订阅进入账户持有状态之前,Google Play 会额外尝试最多 48 小时为付款方式收费。在此期间,用户保留订阅权益。此重试期结束后,订阅将进入账户持有状态,用户应失去对订阅权益的访问权限。
- 当订阅从暂停状态恢复且付款方式失败时,订阅将直接进入账户持有状态。
- 当订阅从账户持有状态恢复时,续订日期将重置。
过期
订阅过期后,用户应失去对订阅的访问权限。在这种情况下,会发送类型为 SUBSCRIPTION_EXPIRED
的 SubscriptionNotification
消息。收到此通知后,查询 Google Play 开发者 API 以获取最新的 订阅资源。确认 subscriptionState
为 SUBSCRIPTION_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_REVOKED
的 SubscriptionNotification
消息。收到此通知后,从 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_DEFERRED
的 SubscriptionNotification
消息。在延迟期间,用户已订阅您的内容并拥有完全访问权限,但不会被收费。订阅续订日期将更新以反映新日期。
对于预付费计划,您可以使用延迟计费 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 图所示
用户也可以选择在暂停期间随时手动恢复订阅,如第 6 图所示。当用户手动恢复时,计费日期将更改为手动恢复日期。
当用户的订阅被暂停时,Play 结算库不会通过 queryPurchasesAsync()
方法返回订阅。如果订阅恢复,则 queryPurchasesAsync()
方法会再次返回它。
监听 RTDN 以了解用户何时暂停其订阅。这些通知还允许您在应用中通知用户他们已暂停其订阅并且无法访问它。您还应为用户提供一种方法,以便他们可以使用 指向 Google Play 的深度链接 随时手动恢复其订阅。
当您的用户发起暂停其订阅的操作时,会发送类型为 SUBSCRIPTION_PAUSE_SCHEDULE_CHANGED
的 SubscriptionNotification
消息。此时,用户应保留对其订阅的访问权限,直到下一个续订日期,并且 订阅资源 包含 autoRenewEnabled = true
。此时,subscriptionState
字段的值为 SUBSCRIPTION_STATE_ACTIVE
。
当暂停生效时,会发送类型为 SUBSCRIPTION_PAUSED
的 SubscriptionNotification
消息。发生这种情况时,用户应失去对其订阅的访问权限,并且订阅资源包含 autoRenewEnabled = true
,并且 subscriptionState
字段设置为 SUBSCRIPTION_STATE_PAUSED
。您可以通过检查 PausedStateContext
对象来查看订阅预计何时再次续订。
如果订阅在暂停期结束时自动恢复或用户选择手动恢复订阅,则会发送类型为 SUBSCRIPTION_RENEWED
的 SubscriptionNotification
消息。这应按 续订 中所述进行处理。
如果在尝试暂停后恢复订阅时付款失败,则会发送类型为 SUBSCRIPTION_ON_HOLD
的 SubscriptionNotification
消息。这应按 账户持有 中所述进行处理。
重新订阅
对于自动续订的订阅基础套餐,Google Play 商店可能会显示一个**重新订阅**按钮。此按钮允许用户重新获取订阅访问权限。它可能由于各种原因不出现,例如订阅在很久以前过期。
尽管此按钮始终标为**重新订阅**,但其功能取决于订阅状态。
当订阅已取消但尚未过期时,用户仍然处于订阅状态并享受订阅权益。如果用户点击重新订阅,则取消操作将被有效撤销,并且订阅将继续续订。此操作在 Play 开发者文档和 API 中称为恢复。
自动续订订阅过期后,您可以允许用户购买相同的订阅基础套餐。此操作在 Play 开发者文档和 API 中称为重新订阅。您可以在Play 控制台或使用 API 为每个基础套餐配置此选项。
过期前恢复
如果您的应用仅依赖于queryPurchasesAsync()
方法来确定用户是否有权获得订阅,则您的应用应自动处理恢复,因为queryPurchasesAsync()
方法在订阅过期日期之前继续返回已取消的购买。恢复的订阅将继续续订,就像它没有被取消一样。
如果您的应用将订阅状态与后端同步,则应侦听类型为SUBSCRIPTION_RESTARTED
的SubscriptionNotification
消息。收到此 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_CONFIRMED
的SubscriptionNotification
消息。对于选择退出价格下降,或者当订阅价格上涨续订时,您会收到类型为SUBSCRIPTION_RENEWED
的SubscriptionNotification
消息。将此通知视为任何其他续订。
处理未接受选择加入的价格上涨的情况
如果用户在需要以较高价格续订之前未接受您的选择加入价格上涨,则他们将自动取消订阅,您会收到类型为SUBSCRIPTION_CANCELED
的SubscriptionNotification
消息。如取消中所述处理此事件。
用户还可以按照相同的机制取消选择退出价格上涨的订阅。
处理预付费套餐的生命周期
与自动续订订阅一样,您必须在每次新购买后确认预付费套餐。对于预付费套餐,您必须完全处理初始购买和任何充值,因为用户每次都需要执行购买流程。
由于预付费套餐持续时间可能较短,因此尽快确认购买非常重要。持续时间为一周或更长的预付费套餐必须在 3 天内确认。持续时间短于一周的预付费套餐必须在套餐持续时间的一半内确认。例如,开发者有 1.5 天的时间来确认 3 天预付费套餐的购买。
每当购买预付费套餐订阅(包括每次充值)时,都会向您的 RTDN 客户端发送类型为SUBSCRIPTION_PURCHASED
的SubscriptionNotification
消息。调用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
字段。
预付费套餐不会自动续订,因此无法取消。如果用户想要取消预付费套餐,他们可以等到它达到过期日期。