iOS版IAP收据验证

时间:2016-03-10 00:25:15

标签: ios iphone in-app-purchase storekit skpaymenttransaction

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

我们希望客户端(iPhone或iPad)使用StoreKit框架通过iTunes帐户向Apple购买初始订阅,然后将收据传递给我们的服务器,这将验证它然后更新用户帐户状态。我们也希望服务器负责管理订阅状态(检查自动续订,取消等等)。这都是使用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文档中的错误吗?或者获取最新事务集的唯一方法是让客户端在SKPayementTransactionObserver收到通知后发送更新的AppReceipts?

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

1)使用SKPaymentQueue购买autoRenewSubscription产品:

 SKMutablePayment *payment = [SKMutablePayment paymentWithProduct:product];
    payment.applicationUsername = [self hashedValueForAccountName:[UserAccount sharedInstance].subscriberKey];
    [[SKPaymentQueue defaultQueue] addPayment:payment];

2)付款完成后,我通过我的SKPaymentTransactionObserver接听电话,并通过以下网址发送文件:

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

文档说前两个字段是

  

"仅针对iOS 6样式的交易收据返回以进行自动续订   订阅"

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

2 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:0)

您需要包含"密码"键入您的JSON以及"收据 - 数据"当点击以验证收据时,它的值将是"共享密钥"你可以从itunes帐户生成。有关详细信息,请参阅此链接中的第三个标题https://developer.apple.com/library/ios/releasenotes/General/ValidateAppStoreReceipt/Chapters/ValidateRemotely.html