SuperAPI AI 工具集

rc-purchase-flow

编程与开发

查看项目

更新于 10-15 18:11

技能介绍

用途

rc-purchase-flow 用于在 Android 上实现 RevenueCat 购买流程。按照该技能的说明,Android 上的 RevenueCat 购买只需两行代码:SDK 负责处理计费参数、Play 购买界面、购买令牌往返、服务端验证与确认,开发者只需决定传入哪个 package,以及如何处理返回的权益(entitlements)。

主要能力

awaitPurchase() 的底层行为

一次 Purchases.sharedInstance.awaitPurchase(params) 调用在底层执行六个步骤,开发者无需自行编写:

  1. 根据 Package 构建带有正确 ProductDetailsParams 的 BillingFlowParams。
  2. 针对传入的 activity 调用 BillingClient.launchBillingFlow()。
  3. 挂起,直到 PurchasesUpdatedListener 返回结果。
  4. 若结果为 OK,将 Play 购买令牌提交到 RevenueCat 后端。
  5. 后端通过 purchases.subscriptionsv2.get 或 purchases.products.get 进行验证。
  6. SDK 在 Google 规定的 3 天窗口内完成确认(订阅或非消耗型商品)或消耗(消耗型商品)。

该调用返回 PurchaseResult(storeTransaction, customerInfo)。可重试的失败会自动重试。

准备 Package

购买前需要从 offerings 中获取一个 Package。先获取 offerings,由 UI 选择一个,并持有 activity:

val offerings = Purchases.sharedInstance.awaitOfferings()
val pkg = offerings.current?.monthly ?: return

如果需要特定 offer 而非默认项,可解析一个 SubscriptionOption 并传给 PurchaseParams.Builder,而不是传 package:

val option = pkg.product.subscriptionOptions
    ?.firstOrNull { it.tags.contains("promo_50_off") }
    ?: pkg.product.defaultOption
    ?: return

对于欧盟的个性化定价,在 builder 上链式调用 .isPersonalizedPrice(true),以便 Play 显示定制价格提示。

执行购买

构建参数、等待购买、读取 customerInfo 以控制访问,并处理两个预期错误分支:

try {
    val result = Purchases.sharedInstance.awaitPurchase(
        PurchaseParams.Builder(activity, pkg).build()
    )
    val customerInfo = result.customerInfo
    if (customerInfo.entitlements["pro"]?.isActive == true) {
        navigateToApp()
    }
} catch (e: PurchasesTransactionException) {
    when {
        e.userCancelled -> { /* backed out, do nothing */ }
        e.error.code == PurchasesErrorCode.ProductAlreadyPurchasedError ->
            showMessage("You already have this subscription")
        else -> showError(e.error.message)
    }
}

该代码块的规则:

  • PurchaseResult 是 @Poko。以 result.customerInfo 和 result.storeTransaction 访问字段,不要用 val (transaction, customerInfo) = result 解构。
  • customerInfo.entitlements["<id>"]?.isActive == true 是访问控制判断依据。不要检查 storeTransaction 来决定访问权限。
  • PurchasesTransactionException 是 awaitPurchase 抛出的唯一异常类型。捕获它,先判断 userCancelled,再判断 e.error.code。
  • 用户取消不是需要展示的错误,直接吞掉。

如果偏好回调而非协程,purchaseWith(params, onError, onSuccess) 是等价的入口。

检查 StoreTransaction

result.storeTransaction 可用但通常不用。customerInfo 是权益的权威来源。如果需要事务级数据用于日志或自有后端,可参考以下字段:

  • orderId:String?,恢复购买时为 null。
  • purchaseToken:String,原始 Play 购买令牌。
  • productIds:List<String>,事务中的产品 ID。
  • purchaseTime:Long,epoch 毫秒。
  • type:ProductType,SUBS 或 INAPP。

重装或换机后恢复

恢复会运行 queryPurchasesAsync(),将找到的所有内容提交到 RevenueCat,并返回最新的 CustomerInfo。访问控制方式与购买后相同:

try {
    val customerInfo = Purchases.sharedInstance.awaitRestore()
    if (customerInfo.entitlements["pro"]?.isActive == true) {
        navigateToApp()
    } else {
        showMessage("No active purchases found")
    }
} catch (e: PurchasesException) {
    showError(e.error.message)
}

注意异常类型:awaitRestore() 抛出 PurchasesException,而不是 PurchasesTransactionException。由于不显示计费界面,没有 userCancelled 标志可检查。

异常类型一览

  • awaitPurchase(params):抛出 PurchasesTransactionException,有 userCancelled。
  • awaitRestore():抛出 PurchasesException,无 userCancelled。

使用方式

该技能以 RevenueCat 官方 AI 工具包中的技能形式提供,页面地址为 https://www.skills.sh/revenuecat/ai-toolkit/rc-purchase-flow。具体安装命令与集成步骤暂未提供。

适用场景

适用于在 Android 应用中接入 RevenueCat 购买流程的开发者,包括:处理订阅或非消耗型商品的购买、根据权益控制功能访问、处理用户取消与重复购买错误、在重装或换机后恢复购买,以及需要事务级数据用于日志或自有后端的场景。

限制

资料仅覆盖 Android 平台。价格、收费、具体平台支持范围等未在资料中说明,暂未提供。