You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在数据库中存储用户付费状态的最优方案探讨

自行存储付费用户状态的方案分析与优化建议

直接方案的风险与问题

你提出的isPaidUser布尔字段方案存在以下核心问题:

  • 状态同步失效:IAP平台(苹果/谷歌)的付费状态可能发生变化,比如用户申请退款、订阅到期未续费,但你的本地字段如果没有和平台实时同步,就会出现数据不一致——要么用户退款后仍能使用付费内容,要么用户正常付费却被限制权限。
  • 篡改风险极高:如果这个字段存在客户端本地(如UserDefaults/SharedPreferences),用户可通过越狱/root设备、修改本地文件直接将其改为true,实现白嫖;即使存在服务端,若后端接口未做严格权限校验,恶意调用也能随意修改该字段。
  • 缺乏关键上下文:仅存布尔值无法记录付费类型(一次性购买/订阅)、到期时间、订单ID等信息,后续排查用户权限问题时无据可查,也无法针对不同付费套餐做差异化服务。

更优实现方案

1. 存储完整的IAP交易信息

不要只存状态标记,而是保存完整的订单/订阅详情,示例数据结构如下:

{
  "uid": "asdf678sdf",
  "username": "coder",
  "paidRecords": [
    {
      "orderId": "APPLE_123456789",
      "productId": "premium_monthly",
      "purchaseTime": 1690000000,
      "expireTime": 1692678000,
      "status": "active", // 可选值:active/expired/refunded
      "platform": "apple"
    }
  ]
}

2. 建立状态同步机制

  • 订阅类产品:每次用户打开APP或每日定时调用平台官方验证接口(苹果App Store Server API、谷歌Google Play Developer API),同步订阅的最新状态,更新服务端的status和expireTime字段。
  • 一次性购买产品:首次验证订单有效性后存储订单信息,同时监听平台的退款通知,及时将对应记录的status改为refunded。

3. 权限判断依赖服务端

客户端不存储核心付费状态,每次需要校验权限时调用服务端接口,由服务端结合存储的交易记录和最新IAP验证结果返回权限状态,彻底避免客户端篡改风险。

4. 监听平台主动通知

开启苹果Server Notifications、谷歌Real-Time Developer Notifications,当用户发生订阅到期、退款、续费等操作时,平台会主动推送通知到你的服务端,实现状态的实时更新。

内容的提问来源于stack exchange,提问作者jshji

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 02:43:24