商品与权益

如何定义商店商品、配置权益映射,以及理解 Product → Purchase → Entitlement 购买链路。

购买链路

SubHub 不关心你的业务身份,只记录「谁买了什么、获得了什么权益」。一次成功购买会依次产生 Purchase 记录并发放 Entitlement。

访问控制应始终查询 Entitlement(如 hasEntitlement('premium')),而非具体商店 SKU。

Product → Purchase → Entitlement

购买任意 Product 经平台验证后写入 Purchase,再发放对应 Entitlement。 访问控制应查询 Entitlement,而非 Product。

Product

商店 SKU / 产品标识

premium_monthly

Purchase

验证后的交易记录

pur_001

Entitlement

成员持有的权益

premium

SDK 鉴权示例

await SubHub.hasEntitlement('premium')

不要调用 hasProduct('premium_monthly'),应始终检查 Entitlement。

创建商品

商品(Product)是商店无关的目录项,对应 App Store / Google Play 的内购 SKU。每个商品必须归属一个应用(App),标识符在应用内唯一。

  • 选择所属应用 — 商品在应用内唯一,不同应用可配置相同 SKU 字符串
  • 填写商品名称与标识符 — 标识符创建后不可修改,建议与商店 SKU 一致(如 premium_monthly)
  • 选择类型 — 订阅、消耗型或非消耗型
  • 映射权益 — 选择该商品购买后发放的 Entitlement 标识

创建权益定义

权益定义(Entitlement Definition)描述一种访问权限,如 premium、remove_ads。多个商品可映射到同一权益,便于统一鉴权。

权益定义同样按应用隔离 — 同一工作区下不同应用需分别创建。

  • 创建标识符与名称(如 premium)
  • 将应用下的一个或多个商品关联到该权益
  • 成员购买任一关联商品后,平台自动写入成员权益(Entitlement 实例)

什么是「有效权益」?

有效权益指 isActive = true 的成员权益实例,既包括订阅(在有效期内),也包括非消耗型内购(如终身解锁、去广告)。

订阅过期、退款或手动撤销后,对应权益变为失效(isActive = false),但历史发放记录仍保留。

消耗型商品(如金币包)若映射到 Entitlement,购买后同样计入有效权益,直至被业务逻辑消耗或撤销。

多商品 → 单权益

常见场景:月度订阅与年度订阅映射到 premium,客户端只需检查 hasEntitlement('premium'),无需区分具体 SKU。

iOS 与 Android 可配置不同商品标识符,但授予同一权益标识。

概念配置位置SDK / API
商品 SKU商品标识符purchase(productId) 传入商店 ID
购买记录PurchaseREST API / Webhook purchase.completed
成员权益Entitlement 实例hasEntitlement() / list entitlements