我们正在使用服务器端验证来验证我们的应用内购买iTunes.当交易发送到SKPaymentTransactionObserver时,我们从appStoreReceiptURL获取收据以验证它.
if let receiptPath = NSBundle.mainBundle().appStoreReceiptURL?.path where NSFileManager.defaultManager().fileExistsAtPath(receiptPath), let receiptData = NSData(contentsOfURL:NSBundle.mainBundle().appStoreReceiptURL!) { return receiptData }
但在某些情况下,例如当我们恢复购买时,会收到多个交易方法:
public func paymentQueue(queue: SKPaymentQueue, updatedTransactions transactions: [SKPaymentTransaction])
使用相同的收据数据来验证每笔交易似乎很奇怪.单个收据是否包含有关每笔交易的数据?
单个收据是否包含有关每笔交易的数据?
是.从中访问的收据appStoreReceiptURL
是针对用户和应用程序的所有可持久事务的单个收据.
应用内购买收据的文档
在进行购买时,将消费品的应用内购买收据添加到收据中.它会保留在收据中,直到您的应用完成该交易.在此之后,下次更新收据时会将其从收据中删除 - 例如,当用户再次购买时,或者您的应用明确刷新收据时.
非消费品,自动续订,非续订或免费订阅的应用内购买收据将无限期保留在收据中.
即所有应用内购买,包括订阅续订和恢复购买以及不包括消费购买,都会创建新的交易并存储在收据中.
使用订阅的文档:
成功续订订阅后,Store Kit会将续订事务添加到事务队列中.您的应用程序在启动时检查事务队列,并以与任何其他事务相同的方式处理续订.
恢复购买产品的文件:
恢复已完成的事务会为用户创建的每个已完成事务创建新事务.
请注意,恢复的购买和订阅续订的原始交易ID将相同.
收据本质上是存储在设备上的文件,当添加新事务时应用程序会更新该文件.