恢复应用内购买交易

6
无论是下雨还是阳光灿烂、无论是潮湿还是晴朗,用户都必须得到他所支付的一切。
来自Apple的说明:
Store Kit提供了内置功能来恢复非消耗品、自动续订订阅和免费订阅的交易。
对于这些交易,Apple Store Kit拥有很好的内置工具。我想重点关注其他类型(尤其是消耗品)。 仅有的交易信息是标识符和收据数据,我们在成功购买后通过Store Kit接收到它们。我们的应用程序使用服务器端模型将产品交付给客户。但还存在许多丢失购买数据的情况,例如如果服务器在用户通过App Store进行购买时宕机,则无法将收据发送到服务器以完成验证过程。
目前的解决方法是:
  1. 服务器返回一组产品标识符
  2. 用户选择其中一个;应用程序将其标识符保存在设备上(通过SQLite或Core Data)。标准的Apple Store交易过程紧随其后。
  3. 在成功的情况下,应用程序将收据数据与其标识符结合保存在设备上,并将其发送到服务器。如果失败或取消,则立即从设备中删除标识符。
  4. 如果服务器的响应正常,那么应用程序将从设备中删除带有收据数据的标识符。否则,它会周期性地向服务器发送请求,直到得到成功的响应为止。
但是这种方法仍然存在漏洞。例如,用户可能会在等待交易传递到服务器之前从设备中删除应用程序,因此根本没有任何购买证明。
您有什么建议?
1个回答

3
基本规则是,在成功交付内容之前不要在支付队列上调用finishTransaction:。这意味着您向验证和内容服务器发出请求,并且它们返回有效的响应,仅在这些响应后才调用finishTransaction:。请注意,坏的购买收据是有效的,只是不好。您将会遇到一些人试图窃取物品-不要为此失眠,但请确保进行适当的收据检查。
据我理解(针对我的非消耗性项目),只要您不调用finishTransaction,商店就会继续在您的应用程序安装上重试支付。因此,我认为您不需要让应用程序在设备上保存收据。但是,对于可消耗品,如果您想以后能够恢复它,则服务器必须存储数据。一个非常重要的问题是需要使用何种密钥来存储它。
顺便说一下,您的第一行话绝对正确,值得为之努力。

请注意,“坏的购买收据有效但不好”是什么意思? - Danik
我只是想说,即使收据有问题但你不交付产品时,仍然要完成finishTransaction:。你还应该在服务器上记录一些内容并通知用户。实际上,我设置了我的东西,尽可能地交付产品,直到我确定收据验证中没有任何错误为止。我认为这在亚马逊上有效,但在苹果或谷歌上不行。至少在亚马逊上,它让我免受自己的错误之苦。 - DrC
无论如何,为了防止内容抄袭行为,它需要至少保存您上面提到的键。比如,应用程序未收到响应,用户关闭设备。当应用程序启动 Store Kit 再次发送请求时,但是应用程序没有有关该时间的交易信息。我们可以通过密钥及其标识符来识别交易并将其发送到服务器。当服务器完成验证时,应用程序调用 finishTransaction:。 如果检测到伪造,则服务器可能会通知应用程序停止对此事务的请求。此外,为了防止挂起事务给服务器带来负担,限制请求计数也是很好的。 - Lion

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接