启动序列,分步
启动订阅应用不仅仅是StoreKit或Play Billing集成。这是一个必须按顺序发生的一系列决策,因为犯一个步骤错误——跳过沙箱测试、信任客户端而不是服务器——倾向于作为支持工单或拒绝的构建在几周后出现,而不是立即。
- 首先定义定价和付费墙策略:免费试用长度、每月vs年度级别以及付费墙在用户流中出现的位置,在编写任何代码之前。
- 实现存储计费——iOS上的StoreKit、Android上的Play Billing——或包装两者的订阅管理层,如果你需要跨平台的一个代码库。
- 构建付费墙UI并将其连接到在App Store Connect和Google Play Console中配置的真实产品ID。
- 在服务器端检查权利,而不仅仅是在设备上。客户端报告用户试图购买什么;只有你的服务器(根据Apple和Google的收据数据验证)应该决定他们实际获得什么。
- 在提交前使用沙箱和测试账户测试完整的购买、续期和取消流。沙箱订阅在压缩计时器上续期,所以一周的真实世界续期行为可以在几小时内验证。
- 提交存储审查,具有完整元数据并为至少一轮拒绝预算时间——订阅应用在定价披露和恢复购买功能上受到额外审查。
- 计划启动后的生命周期事件:续期、自愿取消、来自失败支付的非自愿流失、退款和计费宽限期。
为什么权利检查属于服务器
订阅应用最大的技术风险不是计费集成本身——Apple和Google的框架有很好的文档。这是信任设备报告自己的购买状态。修改后的应用二进制、欺骗本地标志或简单的网络竞争条件可以让客户端相信用户已订阅,当存储记录则显示不同。修复是一个服务器,独立地根据Apple和Google的服务器验证每次购买,在其自己的数据库中存储权利状态,并基于该记录限制访问——从不在应用本身报告的标志上。
这是订阅启动中更容易出错的部分之一,也是Venture AI Agency的移动应用开发工作集中的地方:构建权利层、付费墙UI和订阅状态webhook,使服务器端记录与App Store和Google Play计费事件保持同步,因此访问决策从不仅依赖于信任客户端。
延迟启动的存储评论陷阱
App Store和Google Play审查团队比对免费应用更仔细地查看订阅应用,因为订阅涉及对真实支付方式的经常性收费。大多数拒绝回溯到一个小的、可重复的问题集合。
- 缺失或不清楚的定价披露——价格、计费周期和试用条款必须在用户被收费之前可见,而不是埋在设置中。
- 没有正常的恢复购买流,在iOS上需要且在Android上预期,适用于重新安装应用或切换设备的用户。
- 付费墙阻止核心功能,而不解释订阅实际解锁什么。
- 对数字订阅内容使用除平台自己的计费系统之外的支付方法,Apple和Google都禁止在特定例外之外。
- 未提交沙箱测试的续期和取消流,所以第一个真实bug从支付用户而不是审查团队出现。
启动后管理续期、取消和退款
启动是订阅生命周期的开始,而不是结束。一旦真实订阅者存在,后端必须对它没有启动的事件做出反应:续期成功或失败、用户从他们的设备设置而不是应用内取消、支付方法过期或存储发行的退款。Apple和Google都为这些事件发送服务器到服务器的通知,订阅应用应该将这些通知视为权利状态的真相来源,而不是轮询或等待应用重新打开。
失败的续期是一个特殊情况:两个平台都提供计费宽限期,在此期间当重试支付方式时可以继续访问。忽略这一点的订阅应用要么太早切断支付用户,要么让访问打开太长时间。从一开始构建此生命周期处理比在支持工单开始到达后进行改造更便宜。