我正在开发一个客户端/服务器应用程序,它使用 Apple 的 IAP 和 StoreKit 框架来购买订阅。
我们希望客户(iPhone 或 iPad)能够使用 StoreKit 框架通过其 iTunes 帐户向 Apple 进行初始订阅购买,然后将收据传递到我们的服务器,服务器将对其进行验证,然后更新用户帐户状态。我们还希望服务器负责管理订阅的状态(检查自动续订、取消等。)这全部使用 iOS 7 风格的 appleReceipts,而不是当前已弃用的 iOS 6 风格的交易收据。
Apple 的文档表示,要 POST 到以下 URL,以验证沙箱中的收据以及收据和密码
https://sandbox.itunes.apple.com/verifyReceipt 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格式相同)
问题一:尽管我正在验证 iOS 7 风格的应用程序收据,但我还是看到了全部 4 个。文档说这不应该发生。
https://developer.apple.com/library/ios/releasenotes/General/ValidateAppStoreReceipt/Chapters/ValidateRemotely.html#//apple_ref/doc/uid/TP40010573-CH104-SW1 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_info
or latest_receipt
字段,但根据文档,这些字段不应出现在响应中。
这是苹果文档中的错误吗?或者获取最新交易集的唯一方法是让客户端在收到通知时发送更新的 AppReceiptsSKPayementTransactionObserver
?
编辑 - 根据下面的评论添加所采取的步骤和一些代码。
1) 使用 SKPaymentQueue 购买 autoRenewSubscription 产品:
SKMutablePayment *payment = [SKMutablePayment paymentWithProduct:product];
payment.applicationUsername = [self hashedValueForAccountName:[UserAccount sharedInstance].subscriberKey];
[[SKPaymentQueue defaultQueue] addPayment:payment];
2) 付款完成后,我会通过 SKPaymentTransactionObserver 收到回电,并通过以下 URL 发送文件:
NSURL *receiptURL = [[NSBundle mainBundle] appStoreReceiptURL];
到我的远程服务器。
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")
响应包含一本字典。
字典有以下字段
"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
文档说前 2 个字段是
“仅针对自动更新的 iOS 6 样式交易收据返回
订阅。”
- 为什么它们会出现在这里,因为我正在验证 iOS 7 样式
应用程序收据?
- 如果这些字段不应该出现,我该如何
获取最新交易信息?