功能
本页列出的都是当前版本已经提供的能力。还没做完的在路线图里。
商店渠道
每个支付渠道是一个插件,并声明自己支持的能力。所有渠道产出同样的交易、订阅和事件。
| 渠道 | 用在哪里 | Kasskeep 负责什么 |
|---|---|---|
| Apple App Store | iOS App | StoreKit 2 JWS 验签、App Store 服务器通知 V2、订阅状态、交易历史、退款消费信息回报 |
| Google Play | Android App | Play Developer API 验单、代为确认与消耗、经 Pub/Sub 推送的 RTDN(OIDC 校验)、退款记录 |
| Stripe | 网页版、桌面版 | 托管 Checkout、回查 API 的 webhook、退款、拒付、每小时事件对账 |
| 测试商店 | 开发与测试 | 购买、续订、宽限期、退款、撤销、升降级和时间推进,全部标记为 environment: test |
一套事件模型
各商店的原生信号归一成固定的事件类型。不管来自苹果、Google、Stripe 还是测试商店,续订事件都长一个样。
purchasesubscription.startedsubscription.renewedsubscription.product_changedsubscription.canceledsubscription.uncanceledsubscription.billing_issuesubscription.grace_period_expiredsubscription.expiredsubscription.pausedrefundrefund.reversedrefund.consumption_requestedrevokedchargebackchargeback.closedad.rewardtest
签名回调
- 每个事件 POST 到你的回调地址,带 Kasskeep-Signature 请求头:对时间戳和原始请求体做 HMAC-SHA256。
- 投递失败后依次在 1 分钟、5 分钟、30 分钟、2 小时、12 小时、24 小时、24 小时后重试。
- 事件 id 由商店事件本身算出:同一次续订不管是通知、客户端提交还是对账带来的,都是同一个 id。
- GET /v1/events 按顺序返回全部事件并带游标,用来补拉和恢复。
- 测试接口会向你的回调地址发一条签名的测试事件,并把响应展示给你。
对账
- 苹果:每小时拉一次通知历史,与上次重叠一小时。
- Google:每小时调用 Voided Purchases API,另外回查临近到期或处在宽限期、账户保留、暂停中的订阅。
- Stripe:从事件 API 补拉,走与 webhook 相同的处理。
- Google 的确认与消耗失败后自动退避重试,赶在 Google 3 天自动退款的期限之前完成。
账号、角色与审计
- 你的账号就是一个租户。每条业务记录都带租户 id,并由 Postgres 行级安全兜底,任何查询都碰不到别的账号的数据。
- 商店凭据和回调签名密钥用 AES-256-GCM 加密,密钥为你的账号单独派生,写入后无法再读出。
- 团队成员分所有者、管理员、开发者、只读四种角色。登录必须密码加 TOTP。
- 每个管理操作写审计日志,记录前后差异,密钥类字段打码。
- 按账号限流、按账号公平调度定时任务,别的账号再忙也不会拖慢你的回调。
激励广告
- 接收 AdMob(SSV,ECDSA 验签)、AppLovin MAX(S2S event token)、Unity LevelPlay(签名 S2S、时间窗口、可选来源 IP 白名单)的服务端奖励回调。
- 每次验证通过的观看生成一条 ad.reward 事件,签名和投递方式与购买事件相同。
- 用你自己的广告位名映射各网络的 ad unit id,iOS 和安卓共用一个名字。
- 没映射过的广告位回调默认拒收,并列出来方便你补配置。
- 测试模式不加载真实广告也能产生 ad.reward 事件。
客户端 SDK
- React Native 与 Expo:configure、getProducts、purchase、restore、getCustomer、监听、补交未完成交易、网页结账和激励广告。
- WebView 桥:让原生壳里的网页游戏调用内购,带来源白名单和方法白名单。
- kasskeep-web.js:零依赖的浏览器模块,支持 WebView 桥、测试商店和 Stripe 结账。
运维
- 服务、数据库、商店轮询和回调投递都由 Kasskeep 负责运行。
- 数据库连续归档、支持时间点恢复,每天加密备份到异地,每周自动做一次恢复演练。
- 服务用受行级安全约束的数据库角色连库,行级安全不生效就拒绝启动。
- 接口路径按 /v1 分版本,只做增量修改。