适用于 iOS 的 IAP 收据验证

hab*_*s93 3 iphone storekit in-app-purchase ios skpaymenttransaction

我正在开发一个客户端/服务器应用程序,它使用 Apples IAP 和 StoreKit 框架来购买订阅。

我们希望客户端(iPhone 或 iPad)使用 StoreKit 框架通过他们的 iTunes 帐户与苹果进行初始订阅购买,然后将收据传递给我们的服务器,服务器将对其进行验证,然后更新用户帐户状态。我们还希望服务器负责管理订阅状态(检查自动续订、取消等)。这都是使用 iOS 7 风格的 appleReceipts,而不是目前已弃用的 iOS 6 风格的交易收据。

Apple 的文档说 POST 到以下 URL 以验证沙箱中的收据以及收据和密码

https://sandbox.itunes.apple.com/verifyReceipt

到目前为止..一切正常。

让我感到困惑的地方在于响应。Apple 的文档说响应最多应该有 4 个字段。如果您正在验证 iOS 7 风格的应用程序收据,那么您应该只看到前 2 个。如果它是 iOS 6 风格的订阅交易收据,那么您应该看到所有 4 个。

1) 状态(0 表示有效,否则为一些错误代码)

2) 收据(已发送收据的 JSON 表示)

3) latest_receipt(仅针对自动续订订阅的 iOS 6 样式交易收据返回。最近续订的 base-64 编码交易收据。)

4)latest_receipt_info(JSON格式同上)

问题 1: 即使我正在验证 iOS 7 风格的应用收据,我也看到了所有 4 个。文档说这不应该发生。

https://developer.apple.com/library/ios/releasenotes/General/ValidateAppStoreReceipt/Chapters/ValidateRemotely.html#//apple_ref/doc/uid/TP40010573-CH104-SW1

问题 2: 我们希望服务器通过使用客户端在初始购买后通过的原始应用收据轮询此 API 来处理维护用户订阅状态。该latest_receipt_info字段似乎确实包含一个不断更新的交易列表,而该receipt字段是原始的副本,没有更新的交易信息。

我的问题: 似乎服务器获取有关更新事务的信息的唯一方法是查看latest_receipt_infolatest_receipt字段,但根据文档,这些字段不应该出现在响应中。

这是 Apple 文档中的错误吗?或者获取最新交易集的唯一方法是让客户端在收到通知时发送更新的 AppReceipts SKPayementTransactionObserver

编辑 - 根据下面的评论添加所采取的步骤和一些代码。

1) 使用 SKPaymentQueue 购买 autoRenewSubscription 产品:

 SKMutablePayment *payment = [SKMutablePayment paymentWithProduct:product];
    payment.applicationUsername = [self hashedValueForAccountName:[UserAccount sharedInstance].subscriberKey];
    [[SKPaymentQueue defaultQueue] addPayment:payment];
Run Code Online (Sandbox Code Playgroud)

2) 付款完成后,我会通过我的 SKPaymentTransactionObserver 收到回电,并将文件发送到以下 URL:

NSURL *receiptURL = [[NSBundle mainBundle] appStoreReceiptURL];
Run Code Online (Sandbox Code Playgroud)

到我的远程服务器。

3)我使用以下python代码来验证收据

import itunesiap
import base64

file = "/path/to/receipt/sandboxReceipt"
f = open(file)
encoded = base64.b64encode(f.read())

with itunesiap.env.current().clone(use_sandbox=True):  # additional change for current environment.
    response = itunesiap.verify(encoded,"mysecretkey")
Run Code Online (Sandbox Code Playgroud)

响应包含一个字典。字典有以下字段

"latest_receipt" = base64 encoded receipt here
"latest_receipt_info" = a JSON representation of the latest receipt
"receipt" = a JSON representation fo the receipt I sent for verification
Run Code Online (Sandbox Code Playgroud)

文档说前两个字段是

“仅针对自动续订订阅的 iOS 6 样式交易收据返回。”

  1. 为什么他们会出现在这里,因为我正在验证 iOS 7 风格的应用程序收据?
  2. 如果这些字段不应该存在,我如何获取最新的交易信息?

Mar*_*ock 5

Apple 文档中的措辞含糊不清。针对自动续订订阅的iOS 6 样式交易收据返回。这意味着该字段始终适用于 iOS 7 收据,appStoreReceiptURL但仅适用于自动续订订阅的已弃用交易样式收据。即如果购买不是订阅,它们不会显示在 iOS 6 交易收据上。