探索应用内购买集成与迁移
Explore in-app purchase integration and migration
2022年6月6日
一句话判断
从 verifyReceipt 到 App Store Server API、从 Notifications V1 到 V2 的迁移路线图——如果你的应用有订阅或内购,这场 Session 是你制定迁移计划的核心参考。
这场 Session 讲了什么
Session 分两个部分,分别由 Gabriel 和 Alex 主讲。Gabriel 聚焦 App Store Server API 的采用和迁移,覆盖了 JWT 签名、JWS 交易验证、verifyReceipt 迁移策略。Alex 部分(transcript 被截断)讨论 App Store Server Notifications V2 的迁移。
核心主题是:Apple 在 2021 年推出的 App Store Server API 提供了一种基于 JWS(JSON Web Signature)的安全数据交换方式,取代了旧的 verifyReceipt 接口。配合 Notifications V2,你可以在服务端实时追踪订阅的所有状态变化,而不需要主动轮询。
值得深挖的点
originalTransactionId 是一切操作的锚点。无论你用的是原始 StoreKit 还是 StoreKit 2,所有 App Store Server API 调用都以 originalTransactionId 作为路径参数。在原始 StoreKit 中,它来自 verifyReceipt 返回的 in_app、latest_receipt_info 和 pending_renewal_info 字段。在 StoreKit 2 中,它来自客户端验证后的 Transaction 对象的 originalID 属性,或服务端 JWS 交易的顶层字段。
Look Up Order ID 端点的设计意图。这个端点用 orderId 而非 originalTransactionId 作为参数,因为用户在购买收据中能看到 orderId 但看不到 originalTransactionId。这为客服场景提供了直接的用户信息查询路径。
StoreKit 2 和原始 StoreKit 可以共存。App Store Server API 不绑定任何特定版本的 StoreKit。你可以在客户端继续使用原始 StoreKit,同时在服务端采用 App Store Server API。迁移可以分阶段进行,不必一步到位。
JWS 格式的安全优势。所有从 App Store Server API 返回的数据都以 JWS 格式签名,你可以验证数据是否被篡改、是否确实来自 App Store、是否指向你的应用。这比旧的 verifyReceipt 的 base64 编码收据更安全、更透明。
代码片段
// StoreKit 2 客户端获取 originalTransactionId
let result = try await Product.products(for: ["com.example.subscription"])
guard let product = result.first else { return }
let purchaseResult = try await product.purchase()
case .success(let verification):
// 在设备端验证交易
let transaction = try checkVerified(verification)
// 获取 originalTransactionId 发送到服务端
let originalTransactionId = transaction.originalID
sendToServer(originalTransactionId: originalTransactionId)
// 服务端调用 App Store Server API 获取交易历史
// GET /inApps/v1/transactions/{originalTransactionId}
// 返回 JWS 格式的签名交易列表
最佳实践
- 迁移策略:先在服务端采用 App Store Server API,客户端保持不变,验证稳定后再逐步升级客户端到 StoreKit 2
- 使用 Get Transaction History 端点的过滤和排序功能,可以精确获取指定范围的交易记录
- 结合 Notifications V2 实现实时订阅状态追踪,减少对 API 的主动轮询
- 在客户端使用 transaction listener 监听续订、退款、优惠兑换等事件,及时同步到服务端
- JWT 签名的有效期管理很重要,避免使用过期的 token 调用 API
还有什么值得关注
- verifyReceipt 接口虽然还在工作,但已经不推荐使用,长期来看一定会被废弃
- Notifications V2 相比 V1 增加了更多订阅状态的表示,能覆盖所有可能的状态变化
- Get All Subscription Statuses 端点可以一次性获取某个订阅的所有签名交易和续订信息
- Extend Subscription Renewal Date 端点允许你延长订阅的续订日期,这在客户服务场景中很有用
- App Store Server API 的所有端点都使用 RESTful 风格,相比旧接口更符合现代 API 设计