文章

通过 App Store 验证收据

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

概览

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

获取收据数据

要从设备上的 app 检索收据数据,请使用 NSBundle (英文)appStoreReceiptURL (英文) 方法来找到 app 的收据,再对该数据进行 Base64 编码。接着将这个以 Base64 编码的数据发送到您的服务器。

// Get receipt if available
	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: [])

        // Read ReceiptData
    }
    catch { print("Couldn't read receipt data with error: " + error.localizedDescription) }
}

将收据数据发送到 App Store

在您的服务器上,创建含有 requestBody (英文) 中详细说明的 receipt-datapassword (如果收据包含自动续期订阅) 和 exclude-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 (英文) 订阅栏位相结合,可以获取到期的原因。

另请参阅

购买验证

相关文档