Android 应用内购买与付费墙概述

0:02:00

欢迎来到 RevenueCat 的 Android SDK 代码实验室!

在本代码实验室中,您将:

RevenueCat SDK 集成到您的项目中 在您的 Android 应用程序中实现应用内购买 学习如何区分付费用户和非付费用户 构建一个基于服务器驱动 UI 方法的付费墙界面

完成本代码实验室后,您将能够成功地在 Android 应用中实现应用内购买,并使用 RevenueCat 的 Android SDK 显示动态付费墙。

overview

导入 RevenueCat SDK

0:05:00

首先,在实现应用内购买之前,您需要将 RevenueCat SDK 导入到现有或新项目中。要开始使用,请将以下依赖项添加到您的 build.gradle.kts 文件中:

您可以在 GitHub 上查看最新发布版本

Release

gradle
implementation("com.revenuecat.purchases:purchases:9.20.2")

如果您还计划实现付费墙,可以直接包含以下依赖项:

gradle
implementation("com.revenuecat.purchases:purchases-ui:9.20.2")

Getting Your API Key

Before you can initialize the SDK, you'll need your RevenueCat API key. Here's where to find it:

  1. Go to the RevenueCat dashboard
  2. Navigate to your project
  3. Click on API keys in the left sidebar
  4. Copy your Google Play Store API key (it should start with goog_)
Finding your API key in the RevenueCat dashboard
Important: Keep your API keys secure and never commit them to public repositories. Consider using environment variables or a secure configuration management system for production apps.

Initialize the SDK

接下来,使用以下代码在您的 Application 类中初始化 Purchases SDK:

kotlin
/**
 * 初始化 RevenueCat Purchases SDK。
 *
 * `appUserID` 为 nil,因此 Purchases SDK 将自动生成匿名 ID。
 * 在此处阅读更多关于用户识别的信息:https://docs.revenuecat.com/docs/user-ids
 *
 * `purchasesAreCompletedBy` 设置为 REVENUECAT,因此 Purchases 将自动处理完成交易。
 * 在此处阅读更多关于完成交易的信息:https://www.revenuecat.com/docs/migrating-to-revenuecat/sdk-or-not/finishing-transactions
 */
val builder = PurchasesConfiguration.Builder(this, "REVENUECAT_API_KEY")
Purchases.configure(
  builder
    .purchasesAreCompletedBy(PurchasesAreCompletedBy.REVENUECAT)
    .appUserID(null)
    .diagnosticsEnabled(true)
    .build(),
)

太棒了!您现在已经完成了 50% 的实现。

验证权限

0:03:00

现在让我们继续验证用户权限。

如前所述,权限代表用户购买后解锁的访问级别或功能。这对于确定是否显示广告横幅或授予高级访问权限等情况非常有用。

您可以使用以下代码片段轻松检查用户是否具有活动权限:

kotlin
val ENTITLEMENT_IDENTIFIER = ".." // 从您的 RevenueCat 仪表板获取特定的权限标识符
val customerInfo = Purchases.sharedInstance.awaitCustomerInfo()
val isEntitled = customerInfo?.entitlements[ENTITLEMENT_IDENTIFIER]?.isActive == true

一旦您检查了用户是否具有特定权限,您就可以根据应用的商业模式决定如何继续。

例如,如果您的应用是广告支持的,您可以选择显示或隐藏 AdMob 横幅。或者,您可以选择显示付费墙或购买对话框,允许用户解锁高级功能或内容。

以下是如何实现该逻辑的示例:

kotlin
@Composable
fun ContentScreen(isEntitled: Boolean) {
    if (isEntitled) {
      // 如果用户被授予此权限的访问权限,则不需要显示横幅。
    } else {
      // 在此处显示横幅 UI 或显示付费墙
      ..
    }
}

实现应用内购买

0:04:00

现在,让我们实现应用内购买以提供无广告体验。首先,您需要从 RevenueCat 仪表板获取相关的产品信息。此产品数据将用于向用户展示购买选项。

您可以通过调用 Purchases.sharedInstance.awaitGetProducts() 来获取可用产品,如下例所示:

kotlin
// 从 RevenueCat 服务器获取产品信息
val products = Purchases.sharedInstance.awaitGetProducts(
  productIds = listOf("paywall_tester.subs"),
)

// 继续应用内购买
val purchaseResult = Purchases.sharedInstance.awaitPurchase(
  purchaseParams = PurchaseParams.Builder(
    activity = context as Activity,
    storeProduct = products.first(),
  ).build()
)

如果您提供多个产品变体,例如 paywall_tester.subs:weeklypaywall_tester.subs:monthlypaywall_tester.subs:yearly,您可以使用基础产品标识符 paywall_tester.subs 作为 productIds 字段的值来简化产品检索。这告诉 RevenueCat 将所有相关产品变体作为列表获取,以便您可以在付费墙 UI 中动态展示它们。

一旦您获取了产品数据,您可以通过调用 Purchases.sharedInstance.awaitPurchase(product) 来启动应用内购买流程。这将自动触发 Google Play 购买对话框,使用户能够在您的应用内完成交易。

就这样,您只用几行代码就集成了一个功能完整的应用内购买流程——无需处理收据、商店 API 或手动购买验证的复杂性。

实现付费墙

0:07:00

现在,是时候在您的 Android 项目中使用 Jetpack Compose 实现付费墙了。

业务逻辑

首先,您需要从 RevenueCat 仪表板获取当前产品组合。产品组合定义了向用户展示的可用购买选项,例如月度、年度或终身计划。使用 Purchases.sharedInstance.awaitOfferings() 方法可以轻松完成此操作,如下例所示。

kotlin
internal class DetailsRepositoryImpl @Inject constructor(
  @Dispatcher(CatArticlesDispatchers.IO) private val ioDispatcher: CoroutineDispatcher,
) : DetailsRepository {

  override fun fetchOffering(): Flow<ApiResponse<Offering>> = flow {
    try {
      val offerings = Purchases.sharedInstance.awaitOfferings()
      offerings.current?.let { currentOffering ->
        val response = ApiResponse.of { currentOffering }
        emit(response)
      }
    } catch (e: PurchasesException) {
      ApiResponse.exception(e)
    }
  }.flowOn(ioDispatcher)
}

RevenueCat Android SDK 原生支持 Kotlin 协程,使其与使用基于协程架构的项目无缝契合。当前产品组合也以 Flow 形式公开,允许您响应式地观察变化并相应地更新 UI。

使用 Jetpack Compose 构建付费墙 UI

此时,一切应该已经准备就绪。如果您已经添加了 com.revenuecat.purchases:purchases-ui SDK,您可以使用 Jetpack Compose 轻松构建付费墙 UI

RevenueCat 的 UI 库提供了内置组件,例如 PaywallDialog,允许您快速显示付费墙屏幕或对话框。这些组件完全可自定义,提供各种配置选项以使外观和行为与您的应用设计相匹配。

以下示例展示了使用 Jetpack Compose 实现和自定义付费墙是多么简单:

kotlin
val offering by viewModel.offering.collectAsState()

PaywallDialog(
   PaywallDialogOptions.Builder()
       .setDismissRequest {  }
       .setOffering(offering)
       .setFontProvider(..)
       .setListener(object : PaywallListener {
           override fun onPurchaseStarted(rcPackage: Package) {
               super.onPurchaseStarted(rcPackage)
           }

           override fun onPurchaseCompleted(customerInfo: CustomerInfo, storeTransaction: StoreTransaction) {
               super.onPurchaseCompleted(customerInfo, storeTransaction)

               customer = customerInfo
           }

           override fun onPurchaseError(error: PurchasesError) {
               super.onPurchaseError(error)
           }

           override fun onPurchaseCancelled() {
               super.onPurchaseCancelled()
           }
       })
       .build()
)

配置完成!🥳 现在,每当用户没有所需权限时,您都可以使用您在付费墙编辑器中配置的完全相同的设计来显示付费墙。

正如您在 代码实验室:RevenueCat Google Play 集成(创建付费墙)中所见,付费墙系统是基于服务器驱动 UI 构建的。这意味着您可以直接从仪表板动态更新付费墙的内容和设计,而无需推送应用更新或经过审核流程。

总结

在本代码实验室中,您学习了如何集成 RevenueCat 的 Android SDK、实现应用内购买以及在 Jetpack Compose 中构建付费墙。现在是时候发布您的应用并赚更多钱了!💰

您还可以通过以下资源了解更多关于在 Android 项目中使用 RevenueCat SDK 和 Jetpack Compose 的信息: