在日常业务中,您可能需要对订阅或一次性购买采取管理操作。例如,您的客服可能需要为用户提供全部或部分退款,或者在某些情况下您可能需要撤消权益。您可以从 Play 管理中心管理订单;如果您想从自己的系统管理订单,可以使用 Google Play Developer API 来完成。
取消订阅
订阅取消可以由用户或开发者发起。
用户发起的取消
用户随时可以使用 Play 商店取消 Google Play 订阅。如果适用,您还必须在您的应用和网站上提供用户取消订阅的选项。
让用户自愿取消订阅最简单的方法是在您的应用中提供指向 Play 商店的深层链接,用户可以在 Play 商店查看和管理他们的订阅。
开发者发起的取消
作为开发者,您可能还需要从您的后端触发取消。通过 purchases.subscriptions.cancel
API,您可以取消订阅购买。例如,您可以使用此方法来停用旧服务。取消订阅不会发放退款,用户仍可在当前结算周期结束前继续访问。
此方法允许您在 cancellationType
请求正文参数中指定以下类型的取消:
USER_REQUESTED_STOP_RENEWALS:取消订阅,就像用户从 Play 商店取消了一样。分期付款将继续进行,直到当前承诺期结束。用户可以在订阅到期前通过 Play 商店恢复订阅,或者在订阅到期后(如果基本套餐允许)重新订阅。
DEVELOPER_REQUESTED_STOP_PAYMENTS:取消订阅并阻止任何进一步的付款。用户无法从 Play 商店恢复或重新订阅该订阅,但您可以在您的应用中启用他们再次订阅。
允许用户恢复未到期的订阅
在某些场景下,您可能会发现,在您作为开发者触发取消后,允许用户从 Play 订阅中心恢复未到期的订阅会很有用。例如,您可能希望提供定制的应用内取消流程。根据您的业务逻辑,您可以决定哪些由后端触发的取消可由用户恢复。
要表明用户可以恢复取消,请向 purchases.subscriptions.cancel
API 发出 POST 请求,并将 cancellationType
请求参数设置为 USER_REQUESTED_STOP_RENEWAL
值。
示例
- 订阅的购买令牌
1a2b3c4d5e6f7g8h9i0j
- 应用包名
com.your.app
- 订阅 ID
your-subscription-product
HTTP POST 请求
https://androidpublisher.googleapis.com/androidpublisher/v3/applications/com.your.app/purchases/subscriptions/your-subscription-product/tokens/1a2b3c4d5e6f7g8h9i0j:cancel
请求正文
{
"cancellationType": "USER_REQUESTED_STOP_RENEWAL"
}
允许用户重新订阅已到期的订阅
要允许重新订阅已到期的订阅,您必须在订阅的基本套餐中启用重新订阅选项,然后通过将 cancellationType
参数设置为 USER_REQUESTED_STOP_RENEWAL
值来取消订阅。
仅允许用户在您的应用中重新订阅
如果您已将 cancellationType
参数设置为 DEVELOPER_REQUESTED_STOP _PAYMENTS
,或者未设置 cancellationType
参数,用户将无法从 Play 订阅中心恢复其订阅。但是,如果需要,用户可以通过您的应用再次注册订阅。
执行此操作会触发 SUBSCRIPTION_CANCELED
实时开发者通知。按照取消中所述处理这些取消。
延迟结算
使用 subscriptions.defer
来延长订阅的权益期。在延迟期内,用户仍订阅您的内容,但不会为额外的时间付费。当您延迟订阅的结算时,状态信息会相应更新,您将在购买状态信息中的 expiryTime
字段中看到反映。
- 对于有效的定期订阅,延迟结算会延长下次续订日期。
- 对于预付套餐,延迟结算会延长到期时间。
以下是您可以使用延迟结算的一些示例:
- 作为特殊优惠为用户提供免费访问权限,例如为填写反馈调查的现有订阅者提供一周免费。
- 作为客户关怀措施为客户提供免费访问权限,例如在延长服务中断后,这可能会影响他们使用您的服务的能力。
每次 API 调用可以将结算延迟最少一天,最多一年。要进一步延迟权益的结束日期,请在新的到期日期到达之前再次调用 API。
执行此操作会触发 SUBSCRIPTION_DEFERRED
实时开发者通知。请参阅关于订阅中的为订阅者延迟结算,了解如何处理这些事件。
示例
FitnessGoals 流媒体服务希望在二月份开展一项促销活动,鼓励大家经常锻炼。
他们决定向在二月份与 FitnessGoals 一起锻炼至少 10 次的任何订阅者额外赠送一个月的服务。
他们跟踪挑战结果,并在 3 月 1 日为每个在二月份完成挑战的用户的有效订阅购买调用
subscriptions.defer
API。这些用户免费获得了额外一个月的常规锻炼视频,并且用户告诉他们所有的朋友 FitnessGoals 如何帮助他们保持健康!
发放退款和撤消
在很多情况下,您可能需要为订阅或一次性购买发放退款或撤消访问权限。
按订单 ID 全额退款
使用 orders.refund
API,您可以对购买后三年内的任何订单进行全额退款。 orders.refund
方法接收一个 revoke 参数,该参数指示除了提供退款外,是否还应撤消访问权限。
如果您在针对订阅购买的退款调用中发出撤消请求,则订阅会立即终止,并触发 SUBSCRIPTION_REVOKED
实时开发者通知。阅读订阅生命周期管理指南中的撤消部分,了解如何处理这些事件。
示例
为了庆祝新一届世界杯的开始,电竞应用 Football-Not-Soccer 决定在第一个 24 小时内购买新球队套装的所有用户中抽奖赠送免费虚拟球衣。
Football-Not-Soccer 使用
orders.refund
API,不传递 revoke 参数,将球衣购买费用退还给获奖者。
按购买令牌撤消并退款订阅
在某些用例中,您可能需要撤消用户订阅的访问权限并提供退款。Play 结算通过 subscriptionsv2.revoke
API 提供了撤消方法,包括全额退款和按比例退款。通过此端点,您可以指定 revocationContext
来确定如何计算退款。
执行此操作会触发 SUBSCRIPTION_REVOKED
实时开发者通知。您的应用应按照撤消中所述处理这些取消。
示例
- 购买令牌为
1a2b3c4d5e6f7g8h9i0j
的购买 - 包名为
com.your.app
的应用 - 打算发放按比例退款
HTTP POST 请求
https://androidpublisher.googleapis.com/androidpublisher/v3/applications/com.your.app/purchases/subscriptionsv2/tokens/1a2b3c4d5e6f7g8h9i0j:revoke
请求正文
{
"revocationContext": {
"proratedRefund": {}
}
}
全额退款
如果您需要终止订阅并退还当前结算周期的全部金额,请进行全额退款。使用 purchases.subscriptionsv2.revoke
函数,并将退款类型设置为 "fullRefund": {}
。
示例
Maria 订阅了 SuperMovies 流媒体的自动续订 30 天月度套餐。Maria 遇到了一些技术问题,导致她无法访问内容。她在结算周期的第 3 天联系了客服,表示她从未获得订阅访问权限。
客服在其系统中找到了 Maria 的订阅购买详情,并触发了对
purchases.subscriptionsv2.revoke
的调用,请求全额退款。客服告知 Maria,她应获得订阅价格的 100% 退款,并且她不再订阅该套餐。
按比例退款
如果您需要终止订阅并按比例退还剩余的权益时间,请进行按比例退款。使用 purchases.subscriptionsv2.revoke
函数,并将退款类型设置为 "proratedRefund": {}
。
示例
Maria 订阅了 SuperMovies 流媒体的自动续订 30 天月度套餐。她已经愉快地使用了该服务一段时间。Maria 在结算周期的第 15 天联系了客服,表示她即将移居国外,从第二天开始将无法再使用该服务。
客服在其系统中找到了 Maria 的订阅购买详情,并触发了对
purchases.subscriptionsv2.revoke
的调用,请求按比例退款。客服告知 Maria,她应获得订阅价格的大约 50% 退款,并且服务的访问权限立即终止。