管理订阅和一次性购买交易

在日常业务中,您可能需要对订阅或一次性购买交易执行管理操作。例如,您的客户服务团队可能需要为用户办理全额或部分退款,或者您可能需要在某些情况下撤消使用权。您可以通过 Play 管理中心管理订单,也可以使用 Google Play Developer API 通过自己的系统进行管理。

取消订阅

订阅取消可由用户或开发者发起。

用户发起的取消

用户可以随时使用 Play 商店取消 Google 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 实时开发者通知。如需了解如何处理这些事件,请参阅订阅简介中的为订阅者推迟结算

示例:

  1. FitnessGoals 在线媒体服务希望在 2 月开展促销活动,鼓励用户定期锻炼。

  2. 他们决定,如果订阅者在 2 月份使用 FitnessGoals 锻炼了至少 10 次,则可额外获享一个月的服务。

  3. 他们会跟踪挑战的结果,并在 3 月 1 日针对 2 月份完成挑战的用户的每笔有效订阅购买交易调用 subscriptions.defer API。

  4. 这些用户可以额外免费获享一个月的常规锻炼视频,并告诉所有朋友 FitnessGoals 如何帮助他们保持健康!

发放退款和撤消

在很多情况下,您可能需要针对订阅或一次性购买交易发放退款或撤消访问权限。

根据订单 ID 全额退款

借助 orders.refund API,您可以针对购买后的三年内任何订单发放全额退款。orders.refund 方法会接收一个 revoke 参数,用于指明是否应在提供退款的同时撤消访问权限。

如果您通过针对订阅购买交易的退款调用发出撤消请求,系统会立即终止订阅,并触发 SUBSCRIPTION_REVOKED 实时开发者通知。请参阅订阅生命周期管理指南的“撤消”部分,了解如何处理这些事件。

示例:

  1. 为了庆祝新世界杯的开始,电子竞技应用 Football-Not-Soccer 决定为在前 24 小时内购买新球队套装的所有用户抽奖,送出免费的虚拟球衣。

  2. Football-Not-Soccer 使用 orders.refund API,但未传递撤消参数,因此无法向胜出者退还球衣购买交易款项。

通过购买令牌撤消订阅并退款

对于某些用例,您可能需要撤消对用户订阅的访问权限并提供退款。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": {} 设置为退款类型。

示例:

  1. Maria 订阅了 SuperMovies 在线影音月度方案,并选择了 30 天自动续订。Maria 遇到了一些技术问题,导致她无法访问内容。她在账单周期的第 3 天联系了客户服务团队,表示自己从未获得对该订阅的访问权限。

  2. 客户服务团队在其系统中找到了 Maria 的订阅购买交易详情,并触发了对 purchases.subscriptionsv2.revoke 的调用,请求全额退款。

  3. 客户服务人员告诉 Maria,她应该会收到全额订阅费用退款,并且她不再订阅该方案。

按比例退款

如果您需要终止订阅并针对剩余的使用权时长退款,请按比例退款。使用 purchases.subscriptionsv2.revoke 函数,并将 "proratedRefund": {} 设置为退款类型。

示例:

  1. Maria 订阅了 SuperMovies 在线影音月度方案,并选择了 30 天自动续订。她已经愉快地使用该服务一段时间了。 Maria 在结算周期的第 15 天联系了客户服务团队,表示她要移居海外,从次日起将无法再使用该服务。

  2. 客户服务团队在其系统中找到了 Maria 的订阅购买交易详情,并触发了对 purchases.subscriptionsv2.revoke 的调用,请求按比例退款。

  3. 客户服务人员告诉 Maria,她应该会收到约 50% 的订阅费用退款,并且服务访问权限将立即终止。