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.compackage 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: LifetimePaywall 读取 offerings.current。如果没有 current offering,应用会显示
"Couldn't load subscription options" 状态。
连接 Supabase webhook
先根据 Supabase 设置 部署 revenuecat-webhook
并设置 REVENUECAT_WEBHOOK_AUTH。然后在 RevenueCat Project settings →
Integrations → Webhooks 中添加:
| 字段 | 值 |
|---|---|
| URL | https://your-project-ref.supabase.co/functions/v1/revenuecat-webhook |
| Authorization | 与 REVENUECAT_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 已设置