我应该何时验证应用内购买交易收据?

时间:2012-04-03 04:56:29

标签: ios security in-app-purchase user-experience storekit

我的意思是,我的步骤应该是什么?

  

1)获取SKPaymentTransactionStatePurchased

     

2)从SKPaymentQueue中删除它并按[[SKPaymentQueue defaultQueue] finishTransaction: transaction];提供内容

     

3)验证收据,如果无效,则阻止我刚刚提供的内容

或者我应该将第二步改为第三步?

  

1)获取SKPaymentTransactionStatePurchased

     

2)验证收据,如果收据无效,则不提供内容

     

3)无论如何SKPaymentQueue将其从[[SKPaymentQueue defaultQueue] finishTransaction: transaction];移除

在第一种情况下,用户可以在购买后立即关闭互联网,因此我将无法验证收据。但在第二步,在第1步和第2步之间可能会出现互联网的一些问题,所以我不会完成交易,也不会提供内容,这将是糟糕的用户体验。

那你选择了什么样的应用程序?为什么?

我的选择

我选择了第二种情况,因为选择第一种情况会让我的应用程序很容易被iAP Cracker破解。

3 个答案:

答案 0 :(得分:10)

情景2。 如果互联网爆炸,你将无法进入-finishTransaction。 但这很酷,因为你可以重试(NSTimer),你的应用程序将在启动时获得未完成的交易。 这就是完全 StoreKit的设计方式(即使从阅读文档中看不出来)。

StoreKit附带交易,这是有充分理由的。用户可以在购买后立即退出应用程序,您仍然需要从中恢复。 这就是Apple建议在应用程序生命周期中尽快设置事务观察器的原因。

在提供内容之前不要完成交易,你必须在StoreKit之上实现自己的交易系统,而你不想这样做,相信我(我已经看过它了,这是一场灾难。)

编辑:老实说,用户最终在购买后和验证之前关闭了互联网,这是非常低的。这家伙一秒钟就上网了,没有人在购买过程中出去剪网。 但是当时用户可能会被打断并将您的应用程序发送到后台。 然后,您的应用程序可能因iOS认为合适的原因而被杀死。 当你的应用程序再次启动时,你的应用程序将不会记得开始购买,并且商店套件将不会有很大的帮助,因为你已经完成了交易。

答案 1 :(得分:4)

这就是我的所作所为:

  1. 应用程序发送附带收据的内容请求。

  2. 服务器使用iTunes验证收据,如果有效,则将购买的内容作为原始请求的响应主体返回。

  3. 这样,即使应用程序二进制文件被黑客攻击/修改,也只能根据有效收据下载内容。

答案 2 :(得分:1)

我先验证一下。这需要2-3秒。您可以将ReceiptKit https://github.com/maciekish/ReceiptKit用于此目的。