我们正在使用服务器端验证来验证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])
使用相同的收据数据来验证每笔交易似乎很奇怪。单个收据是否包含有关每笔交易的数据?
答案 0 :(得分:15)
单个收据是否包含有关每笔交易的数据?
是。从 while ((aaa = fscanf(fin, "%d.%d.%d.%d/%d",
&temp[0], &temp[1], &temp[2], &temp[3], &t)) == 5) {
printf("%d\n", aaa);
printf("%d:%d:%d:%d\n", temp[0], temp[1], temp[2], temp[3]);
}
访问的收据是针对用户和应用的所有可持久交易的单一收据。
Docs on In-app purchase receipt
购买时,可将消耗品的应用内购买收据添加到收据中。它会保留在收据中,直到您的应用完成该交易。在此之后,下次更新收据时会将其从收据中删除 - 例如,当用户再次购买时,或者您的应用明确刷新收据时。
非消费品,免费续订,非续订或免费订阅的应用内购买收据将无限期保留在收据中。
即。所有应用内购买,包括订阅续订和恢复购买,以及不包括消费购买,都会创建新的交易并存储在收据中。
Docs on Working with Subscriptions:
成功续订订阅后,Store Kit会将续订事务添加到事务队列中。您的应用程序在启动时检查事务队列,并以与任何其他事务相同的方式处理续订。
Docs on Restoring Purchased Products:
恢复已完成的事务会为用户完成的每个已完成的事务创建一个新事务。
请注意,恢复的购买和续订续订original transaction id将相同。
收据本质上是存储在设备上的文件,应用程序会在添加新事务时更新。