在日常业务中,您可能需要对订阅或一次性购买交易执行管理操作。例如,您的客户服务团队可能需要为用户办理全额或部分退款,或者您可能需要在某些情况下撤消使用权。您可以通过 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
实时开发者通知。如需了解如何处理这些事件,请参阅订阅简介中的为订阅者推迟结算。
示例:
FitnessGoals 在线媒体服务希望在 2 月开展促销活动,鼓励用户定期锻炼。
他们决定,如果订阅者在 2 月份使用 FitnessGoals 锻炼了至少 10 次,则可额外获享一个月的服务。
他们会跟踪挑战的结果,并在 3 月 1 日针对 2 月份完成挑战的用户的每笔有效订阅购买交易调用
subscriptions.defer
API。这些用户可以额外免费获享一个月的常规锻炼视频,并告诉所有朋友 FitnessGoals 如何帮助他们保持健康!
发放退款和撤消
在很多情况下,您可能需要针对订阅或一次性购买交易发放退款或撤消访问权限。
根据订单 ID 全额退款
借助 orders.refund
API,您可以针对购买后的三年内任何订单发放全额退款。orders.refund
方法会接收一个 revoke 参数,用于指明是否应在提供退款的同时撤消访问权限。
如果您通过针对订阅购买交易的退款调用发出撤消请求,系统会立即终止订阅,并触发 SUBSCRIPTION_REVOKED
实时开发者通知。请参阅订阅生命周期管理指南的“撤消”部分,了解如何处理这些事件。
示例:
为了庆祝新世界杯的开始,电子竞技应用 Football-Not-Soccer 决定为在前 24 小时内购买新球队套装的所有用户抽奖,送出免费的虚拟球衣。
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": {}
设置为退款类型。
示例:
Maria 订阅了 SuperMovies 在线影音月度方案,并选择了 30 天自动续订。Maria 遇到了一些技术问题,导致她无法访问内容。她在账单周期的第 3 天联系了客户服务团队,表示自己从未获得对该订阅的访问权限。
客户服务团队在其系统中找到了 Maria 的订阅购买交易详情,并触发了对
purchases.subscriptionsv2.revoke
的调用,请求全额退款。客户服务人员告诉 Maria,她应该会收到全额订阅费用退款,并且她不再订阅该方案。
按比例退款
如果您需要终止订阅并针对剩余的使用权时长退款,请按比例退款。使用 purchases.subscriptionsv2.revoke
函数,并将 "proratedRefund": {}
设置为退款类型。
示例:
Maria 订阅了 SuperMovies 在线影音月度方案,并选择了 30 天自动续订。她已经愉快地使用该服务一段时间了。 Maria 在结算周期的第 15 天联系了客户服务团队,表示她要移居海外,从次日起将无法再使用该服务。
客户服务团队在其系统中找到了 Maria 的订阅购买交易详情,并触发了对
purchases.subscriptionsv2.revoke
的调用,请求按比例退款。客户服务人员告诉 Maria,她应该会收到约 50% 的订阅费用退款,并且服务访问权限将立即终止。