用途:在后端 HTTPS 端点接收 RevenueCat 发送的 Webhook 事件,处理订阅生命周期并同步用户的权益(entitlement)状态。RevenueCat 已将产品映射到权益,因此服务端只需按 event.type 分支并读取 event.entitlement_ids,无需自行维护产品到权益的映射表。
主要能力与事件处理:事件外层统一为 {"api_version":"1.0","event":{...}},包含 id、type、app_user_id、product_id、period_type、purchased_at_ms、expiration_at_ms、store、environment、entitlement_ids、transaction_id 等字段。INITIAL_PURCHASE/RENEWAL/UNCANCELLATION 应授予或恢复权益;CANCELLATION 仅表示关闭自动续订,应安排在 expiration_at_ms 时撤销,不能立即撤销;EXPIRATION 才真正撤销权益;BILLING_ISSUE 只标记账户,不撤销;PRODUCT_CHANGE 更新产品记录;SUBSCRIBER_ALIAS 与 TRANSFER 处理身份合并与交易转移。过期后重新订阅会发送 RENEWAL 而非 INITIAL_PURCHASE,因此 RENEWAL 分支必须能授予权益,不能只延长已有到期时间。
必要用法:从 RevenueCat 控制台 Integrations 下的 Webhooks 获取 secret。处理流程为:读取请求体与 X-RevenueCat-Signature 头,验证签名,失败返回 401;解析事件后以 event.id 作为幂等键,用原子 insertIfAbsent(如 event_id 唯一索引)去重,已处理事件直接返回 200;下游写入应与事件 ID 插入在同一事务中。持久化事件后尽快返回 2xx,慢处理会导致重试与重复投递,可先入队再确认。
适用场景:需要根据订阅状态开通或关闭付费功能、管理宽限期与账户扣留、处理升降级与账号合并的后端服务。
限制与注意:资料未提供签名验证的具体算法与代码实现,仅给出 verifySignature 调用形式;未说明重试窗口、事件上限或价格等信息;示例使用 Kotlin 风格伪代码,实际实现需按自有技术栈适配。CANCELLATION 时立即撤销、BILLING_ISSUE 时撤销、或 RENEWAL 只延长不授予,均属错误行为。