应用端实验室移动应用
00 / 00

移动端付费

用 RevenueCat 和 01MVP billing API 准备 iOS 与 Android 内购

移动端订阅和内购建议走 RevenueCat。01MVP mobile 模板已经放好了 SDK bootstrap,但默认不绑定任何真实项目。

你将学到

  • 移动端付费需要哪些材料,以及它们各自放在哪里
  • RevenueCat 的 public SDK key 和服务端 key 的边界在哪里
  • App 端和业务服务端各自管什么
  • 上架前需要在哪些后台完成配置

接入前先准备什么

移动端付费会同时碰到商店、RevenueCat、后端会员状态和审核资料。先把这些材料准备好,才能把配置和验证一次跑顺。

材料准备位置用途
iOS / Android 商品 IDApp Store Connect、Google Play Console定义订阅、一次性购买或试用
RevenueCat Project / AppRevenueCat 后台连接商店商品和客户端 SDK
Offering 和 EntitlementRevenueCat 后台决定 App 里展示什么套餐、用户买完拿到什么权益
public SDK keyRevenueCat 后台,放进 EAS EnvironmentApp 读取 entitlement,属于客户端公开值
服务端同步方案01MVP API 或 webhook把商店购买结果同步到业务会员状态
sandbox 测试账号Apple / Google 商店后台真机测试购买、续费、取消和退款

第一版可以先让 App 读取 RevenueCat entitlement,再把会员展示做出来。真正限制高价值功能时,建议服务端也确认会员状态,避免只信客户端本地状态。

配置公开 SDK key

本地开发时在 .env 里添加:

EXPO_PUBLIC_REVENUECAT_IOS_API_KEY="appl_xxx"
EXPO_PUBLIC_REVENUECAT_ANDROID_API_KEY="goog_xxx"
EXPO_PUBLIC_REVENUECAT_ENTITLEMENT_ID="pro"

生产构建时,把同样的公开值放进 EAS Environment,或写进 products/01mvp/apps/mobile/eas.json 的 production profile。

这些 key 是 RevenueCat 的客户端公钥,可以放进 App bundle。别把服务端 API key 或 webhook secret 放进 Expo 变量。

App 内状态

移动端 helper 在 products/01mvp/apps/mobile/src/lib/revenuecat.ts,它会按平台选 iOS 或 Android SDK key。没配置 key 时 App 显示未配置状态;配好后就能读取 entitlement。

移动端首页会调用 orpc.billing.plans.queryOptions() 来展示后端当前公开的付费计划。RevenueCat 管商店侧购买和 entitlement,Web/API 管业务计划、订单、会员状态或后续 webhook 同步。

App 端和服务端的职责

MVP 阶段建议把逻辑分成两层:

层级负责什么注意点
App展示套餐、发起购买、读取 RevenueCat entitlement只放 public SDK key,不放 webhook secret
服务端决定用户是否能访问 Pro 功能RevenueCat webhook secret、商店 server API key 都只放服务端

如果产品里有跨 Web、Mobile、Desktop 的统一会员权益,服务端应该成为最终判断来源。App 端读到 entitlement 后,可以请求 API 刷新用户会员状态。

测试购买流程

sandbox 环境下测试时,iOS 和 Android 的行为不太一样:

平台sandbox 方式注意点
iOSApp Store Connect 创建 sandbox 测试账号需要在设备的 App Store 设置里登录 sandbox 账号
Google PlayPlay Console 内部测试轨道测试账号需要加入测试人员列表

测试时要覆盖:购买成功、取消购买、恢复购买、订阅续费、退款。这些场景在 sandbox 里都能模拟,但要真机跑。

上架前检查

  • App Store Connect 中创建内购产品
  • Google Play Console 中创建订阅或一次性商品
  • RevenueCat 中创建 Project、App、Products、Offerings、Entitlements
  • EXPO_PUBLIC_REVENUECAT_ENTITLEMENT_ID 与 RevenueCat entitlement 一致
  • 如果服务端要接收 RevenueCat webhook,把 webhook secret 放在服务端 secrets,不要放进 Expo

下一步

付费配好之后,继续了解移动端有哪些原生能力可以接入,以及每种能力的接入边界。

想和其他创造者交流?

这篇文档有问题?