var appStoreReceiptURL : URL?
class SKReceiptRefreshRequest
重要信息
verifyReceipt 端点已弃用。要在你的服务器上验证收据,请在服务器上执行在设备上验证收据 中的步骤。要在你的服务器上不使用收据验证 App 内购买项目,请调用 App Store Server API 获取顾客的 Apple 签名的交易和订阅信息,或者验证你的 App 获取的 App
和 Transaction
签名的数据。你也可以从 App Store Server Notifications V2 获取同样的签名交易和订阅信息。
App Store 收据是采用 Apple 证书签名的二进制加密文件。要读取这种加密文件的内容,你需要将这个文件发送到 verifyReceipt 端点。该端点的响应中包含可读的 JSON 正文。与 App Store 的通信结构为 RFC 4627 中定义的 JSON 字典格式。二进制数据采用 RFC 4648 中定义的 Base64 编码。在安全的服务器上通过 App Store 验证交易。有关与 App Store 建立安全网络连接的信息,请参阅防止不安全的网络连接。
警告
不要在你的 App 内调用 App Store 服务器 verifyReceipt 端点。你无法直接在用户设备和 App Store 之间建立受信任的连接,因为你无法控制该连接的任何端点,从而容易遭受中间人攻击。
在运行 macOS、iOS 和 iPadOS 的设备上,生产环境中始终显示 App 收据。在运行 macOS 的设备上,TestFlight 中也始终显示 App 收据。在沙盒环境和 Xcode 中的 StoreKit 测试中,只有在测试人员进行首次 App 内购买后才会显示 App 收据。如果 App 调用 SKReceipt
或 restore
,则仅当 App 至少有一个 App 内购买项目时,才会显示 App 收据。
要从设备上的 App 检索收据数据,请使用 Bundle
的 app
方法来找到 App 的收据,再对该数据进行 Base64 编码。接着将这个以 Base64 编码的数据发送到你的服务器。
// 获取收据 (如有)。
if let appStoreReceiptURL = Bundle.main.appStoreReceiptURL,
FileManager.default.fileExists(atPath: appStoreReceiptURL.path) {
do {
let receiptData = try Data(contentsOf: appStoreReceiptURL, options: .alwaysMapped)
print(receiptData)
let receiptString = receiptData.base64EncodedString(options: [])
// 读取 receiptData。
}
catch { print("Couldn't read receipt data with error: " + error.localizedDescription) }
}
在你的服务器上,创建含有 request
中详细说明的 receipt-data
、password
和 exclude-old-transactions
键的 JSON 对象。
将这个 JSON 对象作为 HTTP POST 请求的有效载荷提交。在沙盒中测试你的 App 时或在你的 App 处于审核状态期间,请使用测试环境 URL https://sandbox
。如果你的 App 已在 App Store 中上架,请使用生产 URL https://buy
。如需了解更多信息,请参阅 verifyReceipt。
重要信息
请先使用生产 URL 验证你的收据;如果收到 21007
状态代码,再使用沙盒 URL 进行验证。这种方法可以确保你不必在 App 的测试期间、App Review 团队审核期间或已在 App Store 上架后切换 URL。
App Store 的响应有效载荷是一个 JSON 对象,其中包含 response
中详细说明的键和值。
in
数组包含非消耗型、非续期订阅,以及用户之前购买的自动续期订阅项目。根据需要,检查响应中这些 App 内购买项目类型对应的值来验证交易。
对于自动续期订阅项目,请解析响应来获取关于当前有效订阅期的信息。在验证订阅的收据时,latest
包含最新编码的收据,它的值与请求中 receipt-data
的值相同,latest
包含订阅的所有交易,其中包括初次购买和后续续期,但不包括任何恢复购买。
你可以使用这些值来检查自动续期订阅是不是已到期。将这些值与 expiration
订阅栏位相结合,可以获取到期的原因。
var appStoreReceiptURL : URL?
class SKReceiptRefreshRequest