关于 rc-one-time-products
面向 Android 开发者的 RevenueCat 技能,介绍如何销售一次性商品并读取购买结果。说明 SDK 如何处理收据验证、确认或消耗购买令牌,以及待处理付款等情况。
主要功能
- 01获取商品并发起购买
- 02由 RevenueCat 验证购买收据
- 03自动确认或消耗购买令牌
- 04区分取消、待付款与错误
- 05通过权益或交易记录检查访问权限
适用场景
- 01为 Android 应用添加一次性商品购买
- 02依据权益开放购买内容
- 03处理待付款完成后的权益更新
- 04通过 webhook 配置服务器端购买流程
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ revenuecat/ ai-toolkit --skill rc-one-time-products安装后在 Claude Code 中输入/rc-one-time-products确认已加载。
详细介绍
使用 RevenueCat 销售一次性商品
无需编写 BillingClient 粘合代码,即可在 Android 上销售一次性商品。RevenueCat SDK 会为你获取商品、发起购买、验证收据,并确认或消耗令牌。
阶段 1:明确范围
在开始编写代码前,先回答以下问题。
| 问题 | 决策 |
|---|---|
| 商品是消耗型还是非消耗型? | 在 RevenueCat 控制面板中将消耗型商品标记为可消耗,这样 SDK 就会为你调用 consumeAsync。 |
| 你通过权益还是交易来读取访问权限? | 优先使用权益,这样访问逻辑就能与商品 ID 解耦。 |
| 你是否需要购买的服务器通知? | 使用 RevenueCat Webhook。每次新的非订阅购买都会触发 INITIAL_PURCHASE 事件。 |
集成 RevenueCat 后,不要自行调用 BillingClient.queryProductDetailsAsync、acknowledgePurchase 或 consumeAsync。SDK 管理 BillingClient 实例。
阶段 2:准备
- 在 Google Play Console 中将商品配置为一次性商品。
- 在 RevenueCat 控制面板中,将商品关联到一个权益方案和套餐;如果购买后应消耗该商品,请将其标记为可消耗。
- 确认应用启动时只运行一次
Purchases.configure,并传入 Android API 密钥和当前 App User ID。
阶段 3:执行
获取权益方案、发起购买,然后从 CustomerInfo 中读取结果。
val offerings = Purchases.sharedInstance.awaitOfferings()
val pkg = offerings.current?.availablePackages?.first() ?: return
使用 awaitPurchase 发起购买。该调用会暂停,直到 RevenueCat 后端验证令牌。
val result = Purchases.sharedInstance.awaitPurchase(
PurchaseParams.Builder(activity, pkg).build()
)
val info = result.customerInfo
通过权益读取访问权限,或退而使用非订阅交易列表。
val hasAccess = info.entitlements["lifetime_access"]?.isActive == true
val owned = info.nonSubscriptionTransactions
.any { it.productIdentifier == "lifetime_product_id" }
后端验证购买后,SDK 会自动确认非消耗型商品并消耗消耗型商品。你无需调用 acknowledgePurchase 或 consumeAsync。
阶段 4:处理边缘情况
封装 awaitPurchase,以区分取消、待处理付款和实际错误。
try { /* awaitPurchase */ } catch (e: PurchasesTransactionException) {
when {
e.error.code == PurchasesErrorCode.PaymentPendingError -> showPending()
e.userCancelled -> Unit
else -> showError(e.error.message)
}
}
| 结果 | SDK 信号 | 操作 |
|---|---|---|
| 成功 | awaitPurchase 返回更新后的 CustomerInfo | 根据 entitlements 或 nonSubscriptionTransactions 授予访问权限。 |
| 用户取消 | PurchasesTransactionException,userCancelled == true | 静默忽略。 |
| 待处理付款 | PurchasesTransactionException,PaymentPendingError | 显示待处理消息。SDK 会稍后通过 UpdatedCustomerInfoListener 更新权益。 |
| 其他错误 | PurchasesTransactionException,其他代码 | 向用户显示 e.error.message。 |
阶段 5:验证
- 信任
awaitPurchase返回的result.customerInfo。不要根据乐观的本地状态授予访问权限。 - 待处理的购买不会授予权益。注册
UpdatedCustomerInfoListener,以便在付款完成时作出响应。 - 对于服务器端配置,订阅 RevenueCat
INITIAL_PURCHASEWebhook。不要重新实现 Google Play Developer API 验证。
参考资料
评论
支持 Markdown