文章

通过 App Store 验证收据

在安全的服务器上通过 App Store 验证交易。

概览

App Store 收据是采用 Apple 证书签名的二进制加密文件。要读取这种加密文件的内容,你需要将这个文件发送到 verifyReceipt 端点。该端点的响应中包含可读的 JSON 正文。与 App Store 的通信结构为 RFC 4627 中定义的 JSON 字典格式。二进制数据采用 RFC 4648 中定义的 Base64 编码。在安全的服务器上通过 App Store 验证交易。有关与 App Store 建立安全网络连接的信息,请参阅防止不安全的网络连接

获取收据数据

在运行 macOS、iOS 和 iPadOS 的设备上,生产环境中始终显示 App 收据。在运行 macOS 的设备上,TestFlight 中也始终显示 App 收据。在沙盒环境和 Xcode 中的 StoreKit 测试中,只有在测试人员进行首次 App 内购买后才会显示 App 收据。如果 App 调用 SKReceiptRefreshRequestrestoreCompletedTransactions(),则仅当 App 至少有一个 App 内购买项目时,才会显示 App 收据。

要从设备上的 App 检索收据数据,请使用 BundleappStoreReceiptURL 方法来找到 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) }
}

将收据数据发送到 App Store

在你的服务器上,创建含有 requestBody 中详细说明的 receipt-datapasswordexclude-old-transactions 键的 JSON 对象。

将这个 JSON 对象作为 HTTP POST 请求的有效载荷提交。在沙盒中测试你的 App 时或在你的 App 处于审核状态期间,请使用测试环境 URL https://sandbox.itunes.apple.com/verifyReceipt。如果你的 App 已在 App Store 中上架,请使用生产 URL https://buy.itunes.apple.com/verifyReceipt。如需了解更多信息,请参阅 verifyReceipt

解析响应

App Store 的响应有效载荷是一个 JSON 对象,其中包含 responseBody 中详细说明的键和值。

in_app 数组包含非消耗型、非续期订阅,以及用户之前购买的自动续期订阅项目。根据需要,检查响应中这些 App 内购买项目类型对应的值来验证交易。

对于自动续期订阅项目,请解析响应来获取关于当前有效订阅期的信息。在验证订阅的收据时,latest_receipt 包含最新编码的收据,它的值与请求中 receipt-data 的值相同,latest_receipt_info 包含订阅的所有交易,其中包括初次购买和后续续期,但不包括任何恢复购买。

你可以使用这些值来检查自动续期订阅是不是已到期。将这些值与 expiration_intent 订阅栏位相结合,可以获取到期的原因。

另请参阅

当前页面为“通过 App Store 验证收据”