关于 rc-payment-recovery
面向 Android 开发者的 RevenueCat Google Play 订阅续费失败处理指南,说明宽限期、账户保留、应用内消息、自定义界面及 Webhook 验证。
主要功能
- 01区分宽限期与账户保留
- 02从 CustomerInfo 读取账单状态
- 03配置自动或手动消息
- 04引导用户前往付款管理
- 05测试续费恢复状态变化
适用场景
- 01在宽限期显示提醒
- 02账户保留期间限制访问
- 03通过 Webhook 发送恢复邮件
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ revenuecat/ ai-toolkit --skill rc-payment-recovery安装后在 Claude Code 中输入/rc-payment-recovery确认已加载。
详细介绍
付款恢复
续订失败后,Google Play 会让订阅依次进入两种状态:宽限期(Google 重试扣款期间,用户仍可访问)和账户保留期(撤销访问权限,直到用户修复付款方式)。使用 RevenueCat 时,这两种状态都会自动显示在 CustomerInfo 中,Google 的应用内消息也会默认显示。
阶段 1:了解
续订失败时会发生三件事:
| 状态 | 访问权限 | RevenueCat 如何呈现 | 用户看到的内容 |
|---|---|---|---|
| 宽限期 | 保留 | entitlement.isActive == true 且 billingIssueDetectedAt != null | 默认显示 Google 应用内提示条 |
| 账户保留期 | 撤销 | entitlement.isActive == false 且 billingIssueDetectedAt != null | 默认显示 Google 应用内提示条 |
| 已恢复 | 保留 | billingIssueDetectedAt == null | 无 |
SDK 中有两个重要信号:
- 从 Google 报告付款问题开始,直到用户解决问题,
EntitlementInfo.billingIssueDetectedAt都为非空。 EntitlementInfo.isActive用于判断用户是否仍有访问权限。
在后端,每次状态转换都会触发一次 BILLING_ISSUE webhook。你无需解析 RTDN。
阶段 2:规划
编写应用代码之前,先确定你的实际需求。大多数应用什么都不需要做。
请思考:
- 你想使用默认的 Google 应用内消息吗?如果是,无需操作。SDK 在连接 BillingClient 时会调用
showInAppMessagesIfNeeded。 - 你想显示自己的横幅或对话框吗?如果是,请从
CustomerInfo读取billingIssueDetectedAt,并根据isActive分支处理。 - 你想让消息仅在特定屏幕上显示吗?如果是,请停用自动调用,并自行调用
showInAppMessagesIfNeeded(activity)。 - 你需要服务端标记(例如,用于发送付款恢复邮件)吗?如果是,请处理
BILLING_ISSUEwebhook。无需编写应用代码。
如果你只想使用默认行为,请到此为止。
阶段 3:执行
默认设置(推荐)
保持应用内消息自动显示。此设置为默认值:
PurchasesConfiguration.Builder(context, apiKey)
.showInAppMessagesAutomatically(true)
.build()
手动触发
停用自动调用,并从你选择的 activity 显示消息:
PurchasesConfiguration.Builder(context, apiKey)
.showInAppMessagesAutomatically(false)
.build()
Purchases.sharedInstance.showInAppMessagesIfNeeded(activity)
宽限期内显示自定义 UI
读取权益信息,并根据两个标志进行分支处理:
val entitlement = customerInfo.entitlements["pro_access"]
when {
entitlement == null || !entitlement.isActive ->
showSubscribeScreen()
entitlement.billingIssueDetectedAt != null && entitlement.isActive ->
showGracePeriodWarning()
entitlement.billingIssueDetectedAt != null && !entitlement.isActive ->
showAccountHoldScreen()
else ->
showPremiumContent()
}
引导用户修复付款方式
CustomerInfo.managementURL 指向 Google Play 订阅页面:
customerInfo.managementURL?.let { url ->
startActivity(Intent(Intent.ACTION_VIEW, url))
}
阶段 4:验证
测试每次状态转换:
- 使用一张会拒绝续订付款的 Google Play 测试卡,让订阅进入宽限期。
- 确认
entitlement.billingIssueDetectedAt变为非空,且isActive仍为true。 - 等待进入账户保留期,并确认
isActive变为false,而billingIssueDetectedAt仍为非空。 - 更新付款方式,并确认
billingIssueDetectedAt恢复为null。 - 在后端确认首次状态转换时会触发
BILLING_ISSUEwebhook。
参考资料
评论
支持 Markdown