用途
rc-backend 面向的是「自有后端需要读取或更新 RevenueCat 在 Android 上的状态」这一场景。它要解决的核心问题是:接入 RevenueCat 后,后端到底还要不要做收据验证、应该承担哪些职责。
主要能力(后端职责划分)
该技能首先澄清架构定位:RevenueCat 的后端本身就是收据验证服务器,Android 应用和自有服务器都不需要直接调用 Google Play Developer API。当 Android SDK 提交购买令牌时,RevenueCat 后端会针对 Google Play Developer API 调用 purchases.subscriptionsv2.get 或 purchases.products.get,验证收据真实且与预期商品匹配,把交易记入自身数据库,再把 CustomerInfo 返回给 SDK。
自有后端仍然拥有并负责的内容包括:用户认证;用户及其访问级别的自建数据库;提供高级内容的 API 端点;处理 RevenueCat 事件的 webhook 接收器。
自有后端不拥有的内容包括:Google Play Developer API 凭据;收据验证代码;linkedPurchaseToken 链遍历;跨越七种订阅状态的状态计算。
使用方式
技能把后端职责映射到具体的 RevenueCat 机制,例如:
- 响应购买、续订、取消:使用 webhook 接收器,由 RevenueCat 推送标准化事件,服务器更新自己的数据库。
- 检查用户当前权益:GET /v1/subscribers/{app_user_id},在 Authorization 头中携带密钥。
- 授予促销访问权限(客服、退款、赠送):POST /v1/subscribers/{app_user_id}/entitlements/{entitlement_id}/promotional,仅限服务端调用。
- 撤销促销访问权限:POST /v1/subscribers/{app_user_id}/entitlements/{entitlement_id}/revoke_promotionals,仅限服务端调用。
- 从服务端数据设置订阅者属性:POST /v1/subscribers/{app_user_id}/attributes,适用于 SDK 不知道的 CRM 字段。
- 批量数据导出:RevenueCat 数据导出,按计划导出到数据仓库。
具体调用示例(Kotlin Ktor 从服务器调用读取订阅者):
val response = client.get("https://api.revenuecat.com/v1/subscribers/$appUserId") {
header("Authorization", "Bearer ${System.getenv("RC_SECRET_KEY")}")
header("X-Platform", "android")
}
授予促销权益的请求形式:
POST https://api.revenuecat.com/v1/subscribers/{app_user_id}/entitlements/{entitlement_id}/promotional
Authorization: Bearer sk_...
Content-Type: application/json
{"duration": "monthly"}
其中 duration 的合法取值包括 daily、three_day、weekly、monthly、two_month、three_month、six_month、yearly、lifetime。该调用用于客服工作流,绝不应从客户端发起。
读取订阅者的响应体与 Android SDK 返回的 CustomerInfo 结构相同,可用于服务端拦截高级 API 响应的端点。
API 密钥规则
- Android 公开 SDK 密钥:内嵌在 Android 应用中,用于提交购买、获取当前用户的 CustomerInfo。
- 密钥(Secret API key):只应存在于服务器环境变量中,可读取任意订阅者、授予或撤销促销、设置属性、执行批量操作。
技能明确要求:绝不要把 Secret key 放进 Android APK、BuildConfig 字段或任何客户端包中;一旦泄露应立即轮换;把它当作数据库密码来对待。
Webhook 接收器要点
技能给出 webhook 接收器的大致写法:校验请求头中的 Authorization 是否等于配置的密钥(Bearer ${System.getenv("RC_WEBHOOK_SECRET")}),按事件类型分发,例如 INITIAL_PURCHASE、RENEWAL 调用 grantAccess,CANCELLATION、EXPIRATION 调用 scheduleRevocation,最后快速返回 2xx。非 2xx 响应会触发 RevenueCat 重试。
适用场景与前置条件
写任何后端代码之前,技能要求先确认:已有配置了 Android 应用的 RevenueCat 项目;已从 Project Settings 到 API Keys 获取 Secret API key(不是内嵌在应用中的公开 Android SDK 密钥);已知 SDK 使用的 app_user_id(与认证系统使用同一标识符);已决定后端需要实时状态(REST API)还是事件驱动状态(webhooks)。
技能也指出,如果应用只在客户端内做功能门控,可能根本不需要后端组件:RevenueCat 在 CustomerInfo 到达 SDK 之前会做服务端验证,EntitlementVerificationMode.INFORMATIONAL 或 .ENFORCED 会在客户端增加签名校验。只有当能够在服务端验证权益时,才应从服务器提供高级内容。
限制与不应构建的内容
- 不要构建 Google Play 收据验证端点,RevenueCat 已经做了。
- 不要把购买令牌从 Android 客户端传给服务器做手工验证,SDK 已处理这一往返。
- 不要从后端查询 Google Play Developer API,除非是在构建绕过 SDK 的自定义集成。
- 不要在数据库中复刻七种订阅状态机,改为消费 CustomerInfo.entitlements.active 或 webhook 事件。
暂未提供的信息
关于收费、价格、平台支持范围、具体使用效果等信息,资料中暂未提供。