mcpField
R
rc-one-time-products

rc-one-time-products

github.com/revenuecat开发76633 次安装1 天前更新
代码仓库

关于 rc-one-time-products

面向 Android 开发者的 RevenueCat 技能,介绍如何销售一次性商品并读取购买结果。说明 SDK 如何处理收据验证、确认或消耗购买令牌,以及待处理付款等情况。

主要功能

  1. 01获取商品并发起购买
  2. 02由 RevenueCat 验证购买收据
  3. 03自动确认或消耗购买令牌
  4. 04区分取消、待付款与错误
  5. 05通过权益或交易记录检查访问权限

适用场景

  1. 01为 Android 应用添加一次性商品购买
  2. 02依据权益开放购买内容
  3. 03处理待付款完成后的权益更新
  4. 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_PURCHASE Webhook。不要重新实现 Google Play Developer API 验证。

参考资料

评论

支持 Markdown