这些链接: this和 this没有帮助我不幸.
在我的应用程序中,我有用户订阅自动可再生应用内购买.
他们可以订阅1,6或12个月.
当他们订阅时,交易收据将发送到我的服务器以备以后验证.
我不会立即验证收据,因为它会减慢用户体验(对苹果服务器的收据验证查询大约需要1 – 2秒).相反,我使用天真的方法,并提供用户订阅的内容,无需任何直接的接收验证.我安排一个cron工作,每天验证每个用户的收据,并在过期的收据上撤销特权.
现在,由于苹果指南清楚地表明,对于具有自动可再生订阅的应用程序,还需要恢复功能,所以我选择实施.
当我尝试在沙箱模式下恢复购买时,使用:
[[SKPaymentQueue defaultQueue] restoreCompletedTransactions];
我不仅获得当前的订阅,而且所有以前的订阅(包括过时的订阅)在回调到:
- (void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray *)transactions
目前我已经尝试了我的IAP约30次,这意味着上述方法发送了30个不同的事务(过时和活跃).对于这些交易中的每一个,我将交易收据上传到我的网络服务,以备后续验证.
现在.如果最后一笔交易有过期的收据(但第二个到最后一个事务实际上是有效的),它将覆盖当前用户的当前(有效)收据,从而虚假地撤销该用户的权限.
基本上我的问题是当调用restoreCompletedTransactions时,我获取了过时和活动事务的列表.而在服务器端,他们可能会使对方无效.最好,我只想检索一个事务(最相关),并将该收据发送到我的服务器进行后续验证.
总而言之,我猜我的主要问题是:
如何确保仅恢复活动(即最新)事务?
解决方法
>花费太长时间,因为它导致收据验证被称为太多次(一次是过去的每个交易)
>可能导致有效的事务验证被后续的失败事务覆盖
例如,如果您有三个持续时间用于自动续订订阅,则只需对与三个订阅持续时间相关联的三个productIdentifier验证收据.