我们希望客户端(iPhone或iPad)使用StoreKit框架通过他们的iTunes账户向苹果进行初始订阅购买,然后将收据传递给我们的服务器,该服务器将验证它,然后更新用户的账户状态。我们还希望服务器负责管理订阅的状态(检查自动续订、取消等)。所有这些都使用iOS 7风格的appleReceipts,而不是当前已弃用的iOS 6风格的交易收据。
苹果的文档说要将收据和秘密代码一起POST到以下URL以在沙盒中验证收据。
https://sandbox.itunes.apple.com/verifyReceipt
到目前为止,一切都按照预期运作。
让我感到困惑的是响应。苹果文档中说,响应应该有最多4个字段。如果您正在验证iOS 7风格的应用程序收据,则只应该期望前两个字段。如果它是iOS 6样式的订阅交易收据,则应该看到所有4个字段。
1)状态(有效为0,否则为某个错误代码)
2)收据(发送的收据的JSON表示形式)
3)latest_receipt(仅返回自动续订订阅的iOS 6样式交易收据。最近续订的Base64编码交易收据。)
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接收回调,并将文件发送到以下URL:
NSURL *receiptURL = [[NSBundle mainBundle] appStoreReceiptURL];
我将使用以下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 样式交易收据。
“仅适用于自动续订的 iOS 6 样式交易收据。”
- 既然我正在验证 iOS 7 样式的应用程序收据,为什么它们会出现在这里?
- 如果这些字段不应该存在,那么我如何获取最新的交易信息?
appStoreReceiptURL
的iOS 7收据中,但仅出现在已弃用的交易样式收据中,这些收据是针对自动续订订阅的。即,如果购买不是订阅,则它们不会出现在iOS 6交易收据上。 - Marc Greenstock