我正在使用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个。文档说不应该发生。
问题2:
我们希望通过使用客户端在初次购买后通过的原始应用收据轮询此API来让服务器处理维护用户订阅状态。 latest_receipt_info
字段似乎确实包含不断更新的事务列表,而receipt
字段是原始文件的副本,没有更新的交易信息。
我的问题:
似乎服务器获取有关更新事务的信息的唯一方法是查看latest_receipt_info
或latest_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样式的交易收据返回以进行自动续订 订阅"
答案 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