Apple 收据验证会在应用解锁付费内容之前,确认应用内购买或订阅是否真实有效。它回答的是一个核心问题:这位用户真的向 Apple 付款了吗?
App Store 收据最初是 Apple 提供的购买凭证,是存储在设备上的一个已签名 PKCS#7 文件,其中列出了该应用的所有交易。Apple 已弃用这一模式。Apple 已弃用收据,并于 2023 年 6 月 5 日弃用了服务器过去用于验证收据的 verifyReceipt 端点。
如今,你可以通过 StoreKit 2 和 App Store Server API 验证购买。StoreKit 2 会向应用提供已签名的 JWS(JSON Web Signature)交易数据,以取代旧的 base64 收据数据块。你可以通过以下两种方式之一验证该交易:
- 本地验证。使用 Apple 的 App Store Server Library 解码并验证已签名的 JWS。该库提供 Swift、Java、Node.js 和 Python 版本,无需调用 Apple 服务器。
- 服务器端验证。将 transaction ID 发送到你的服务器,使用已签名的 JWT 进行身份验证,然后查询 App Store Server API,以获取由 Apple 签名的交易和订阅数据。
App Store Server Notifications V2 端点会将相同的已签名数据推送到你的服务器,用于处理续订、退款和取消等生命周期事件。
如需逐步完成服务器端配置,请参阅 Adapty 的实施指南:使用 App Store Server API 验证 IAP。
旧版模式
最初的流程是在设备上解析 PKCS#7 收据,或使用 shared secret 将其发送到 verifyReceipt 端点。Apple 已弃用这两种方式。verifyReceipt 目前仍然可用,且尚未公布停止服务日期,但不会再获得新功能。Apple 建议现在迁移到 App Store Server API 和 Notifications V2。
Adapty 如何处理收据验证
Adapty 是一个订阅基础设施平台,可在服务器端为你执行 Apple 收据验证,因此你无需自行解析 JWS,也无需自己接入 App Store Server API。Adapty SDK 会将每笔 StoreKit 2 交易发送给 Adapty,Adapty 随后通过 Apple 对其进行验证并存储结果,而你的应用只需读取一个可信的订阅状态。
- 服务器端验证。Adapty 使用 Apple 的 App Store Server API 验证每笔交易,而不是在设备上进行验证,因此被篡改或重放的收据无法解锁付费功能。
- 实时订阅状态。App Store Server Notifications V2 会在续订、退款、宽限期和取消等情况下持续更新每位用户的访问状态,你无需自行轮询。
- 跨平台同步。同一个订阅状态可随用户同步到 iOS、Android 和 Web,因此用户在一个平台完成购买后,也能在其他平台获得访问权限。
首先接入 Adapty SDK 并查看文档,然后使用 Subscription Sync 在不同设备间保持权益一致。如需手动抽查单个收据,请使用 Apple 收据检查工具。