RevenueCat 设置

配置 RevenueCat 产品、SDK key 和 webhook。

RevenueCat 设置主要是 dashboard 工作:创建商店产品,把它们挂到一个 RevenueCat entitlement,通过 offering 暴露给应用,把公开 SDK keys 加到 Expo,并把 webhook 接到 Supabase。

应用可以在 iOS 和 Android 上配置 RevenueCat,但随附 Supabase webhook 目前只映射 App Store events。iOS 今天是端到端的;发布 Google Play 购买前,请扩展 providerForStore()billing_provider enum 以处理 PLAY_STORE

商店前置工作

在 App Store Connect 中:

创建 app record

为当前 bundle identifier 创建 iOS app record。默认变体是:

development: expo.soarstarter.com.dev
preview:     expo.soarstarter.com.preview
production:  expo.soarstarter.com

只有可上架的 bundle ID 应配置真实 App Store products。development 和 preview ID 适合内部构建,但如果要测试购买,也需要匹配的 products。

完成付费 app 要求

完成 paid-app agreements、tax 和 banking。这些未完成时,products 经常无法加载。

创建 products

创建一个 subscription group,加入 monthly 和 yearly auto-renewable subscriptions;如果需要 lifetime,则再创建一个 non-consumable product。Product ID 由你决定;应用从 RevenueCat offering 读取产品,不需要硬编码 ID。

在 Google Play Console 中:

创建 app 和 package

使用 app.config.ts 中的 Android package。默认变体是:

development: expo.soarstarter.com.dev
preview:     expo.soarstarter.com.preview
production:  expo.soarstarter.com

package name 和 signing key 必须匹配你要测试的 build。

配置 monetization

完成 merchant account 设置,创建 monthly/yearly subscriptions;如果要提供 lifetime 等价方案,创建 in-app product。

规划后端扩展

客户端可以使用 EXPO_PUBLIC_REVENUECAT_ANDROID_KEY,但当前 revenuecat-webhook 会忽略 PLAY_STORE events。在依赖 Android 购买授予 Supabase entitlement 前,请先扩展并测试该 mapper。

RevenueCat 项目

添加平台 app

在 RevenueCat 中创建 project,添加 App Store app;如果计划 Android,也添加 Google Play app。复制公开 app-specific SDK keys:

EXPO_PUBLIC_REVENUECAT_IOS_KEY=appl_xxxxxxxxxxxxxxxxx
EXPO_PUBLIC_REVENUECAT_ANDROID_KEY=goog_xxxxxxxxxxxxxxxxx

这些是公开 SDK keys,可以放在 .env.local 或 EAS environment values 中。

添加 products

创建指向商店 product IDs 的 RevenueCat products。Expo 应用不会从 env 读取 product IDs;RevenueCat product catalog 才是来源。

创建 entitlement

创建一个 entitlement,identifier 为:

pro

把 monthly、yearly、lifetime products 都挂到同一个 entitlement。identifier 必须和 lib/purchases.tsx 中的 PRO_ENTITLEMENT_ID 匹配。

创建 offering

创建或激活 current offering,并添加 packages:

Package type: Monthly
Package type: Annual
Package type: Lifetime

Paywall 读取 offerings.current。如果没有 current offering,应用会显示 "Couldn't load subscription options" 状态。

连接 Supabase webhook

先根据 Supabase 设置 部署 revenuecat-webhook 并设置 REVENUECAT_WEBHOOK_AUTH。然后在 RevenueCat Project settings → Integrations → Webhooks 中添加:

字段
URLhttps://your-project-ref.supabase.co/functions/v1/revenuecat-webhook
AuthorizationREVENUECAT_WEBHOOK_AUTH 相同的值

函数使用 verify_jwt = false,因为 RevenueCat 不是已登录 Supabase 用户。它会验证静态 Authorization header,然后使用 service role upsert subscriptions

Sandbox events 和 production events 走同一逻辑,只会修改 user_id 等于 RevenueCat app_user_id 的那一行。

预期结果

Expo env        -> 每个 native 平台都有 RevenueCat public SDK key
RevenueCat app  -> iOS app 已配置;Android app 可选,直到 webhook 支持扩展
Entitlement     -> identifier "pro"
Offering        -> current offering 包含 Monthly / Annual / Lifetime packages
Supabase        -> revenuecat-webhook 已部署,REVENUECAT_WEBHOOK_AUTH 已设置

相关页面

On this page