iOS的IAP收据validation

我正在使用Apples IAP和StoreKit框架来购买订阅的客户端/服务器应用程序。

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

苹果公司的文件说,张贴到以下url,以validation沙箱中的收据以及收据和密码

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

到目前为止,所有事情都应该如此。

在那里,让我感到困惑的是在回应中。 苹果公司的文件说,应答应该有多达4个字段。 如果您正在validationiOS 7样式的应用收据,那么您只应该预期前两个。如果是iOS 6样式的订阅交易收据,那么您应该期望看到所有4个。

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

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

3)latest_receipt(仅针对自动更新订阅的iOS 6样式事务回执返回,最近更新的基于64编码的事务回执。

4)latest_receipt_info(与JSON格式相同)

问题1:即使我正在validationiOS 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字段,但根据文档,这些字段不应出现在响应中。

这是苹果文档中的错误吗? 或者,获取最新一组事务的唯一方法是让客户端在SKPayementTransactionObserver得到通知时发送更新的SKPayementTransactionObserver

编辑 – 根据下面的评论添加步骤和一些代码。

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代码来validation收据

 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 

Docs说前两个字段是

“仅针对自动更新订阅的iOS 6样式事务回执返回。”

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

苹果公司文档中的措词是不明确的。 针对自动更新订阅的 iOS 6样式事务回执返回 。 这意味着该字段总是针对使用appStoreReceiptURL iOS 7收据显示,但仅针对用于自动续订订阅的弃用交易样式收据。 即,如果购买不是订阅,则它们不会显示在iOS 6交易收据上。

您需要在您的JSON中包含“密码”键和“收据数据”以确认收件人的身份,并且其值将是可以从iTunes帐户生成的“共享密钥”。 请参阅此链接的第三个标题以获取更多详细信 https://developer.apple.com/library/ios/releasenotes/General/ValidateAppStoreReceipt/Chapters/ValidateRemotely.html