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

在日常业务中,您可能需要对订阅或一次性购买交易采取管理措施。例如,您的客户服务可能需要为用户办理全额或部分退款,或者您可能需要在某些情况下撤消授权。您可以通过 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 实时开发者通知。按照取消中的说明处理这些取消事件。

延迟结算

您可以使用 subscriptionsv2.defer 方法延长订阅的使用权期限。延期包含加购项的订阅时,订阅中的所有项目都会延期相同的时长。在推迟期内,用户仍会订阅您的内容,但不会因额外的时间而被扣款。当您推迟订阅的结算时,状态信息会相应更新,并且您会在购买状态信息的 expiryTime 字段中看到相应变化:

  • 对于有效的定期订阅,延期结算会延长下一个续订日期。
  • 对于预付费方案,推迟结算会延长到期时间。

以下是一些有关如何使用延期结算的示例:

  • 将免费访问权限作为一种特别优惠提供给用户,如向填写反馈调查问卷的现有订阅者提供一周免费访问权限。
  • 作为客户服务措施,向客户免费提供访问权限,例如在长时间中断后,客户可能无法使用您的服务。

每次调用该 API,结算最短可推迟一天,最长为一年。如需进一步推迟使用权结束日期,请在新的到期日期到来之前再次调用该 API。

执行此操作会触发 SUBSCRIPTION_DEFERRED 实时开发者通知。如需了解如何处理这些事件,请参阅关于订阅中的为订阅者延迟结算

示例:

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

  2. 他们决定,对于在 2 月份使用 FitnessGoals 锻炼至少 10 次的任何订阅者,额外提供 1 个月的服务。

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

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

发放退款和撤消

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

按订单 ID 全额退款

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

如果您通过退款调用针对订阅购买交易发出撤消请求,系统会立即终止订阅,并触发 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,她应获得 100% 的订阅价格退款,并且她不再订阅该方案。

按比例折算退款

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

示例:

  1. Maria 订阅了 SuperMovies 流媒体按月付费的 30 天自动续订型方案。她愉快地使用了这项服务一段时间。 Maria 在结算周期的第 15 天联系了客户服务部门,表示她将移居国外,从第二天起将无法再使用该服务。

  2. 客户服务人员在其系统中找到 Maria 的订阅购买详细信息,并触发对 purchases.subscriptionsv2.revoke 的调用,请求按比例退款。

  3. 客户服务人员告知 Maria,她应该获得订阅价格约 50% 的退款,并且对该服务的访问权限会立即终止。