如何处理服务器端的应用内购买失败? (用于消耗品)

时间:2013-01-30 08:52:59

标签: ios in-app-purchase server-side recovery

我们有一台服务器,除了其他东西之外,还需要从第三方购买东西(通过API调用),然后再将耗材退回给用户。显然它会预先检查Apple收据。

处理服务器端应用内故障的最佳方法是什么,比如第三方服务是否失败?在这一点上,用户的体验是付费但没有收到消费品,再次尝试会使他们花更多的钱。

到目前为止,我已提出:

在设备上

  1. 当inapp完成存储时,将该productId的收据存储为 '无人认领'
  2. 照常联系服务器。
  3. 如果成功则清除 无人认领的收据/ productId
  4. 如果出现错误,则下次用户尝试使用 同样inapp 跳过实际购买部分并直接进入2。 与之前的收据。
  5. 然后在服务器上

    1. 使用Apple验证收据
    2. 检查我们是否尚未向用户提供该收据的消耗品(防止重复使用收据)
    3. 拨打第三方电话
    4. 成功返回消耗品。
    5. 失败时回复错误(此时客户端会将收据保留为无人认领,并在再次尝试时重新发送)。
    6. 提前致谢!

2 个答案:

答案 0 :(得分:0)

我的方法是将其作为一种交易:
将您的步骤2拆分为2a,2b,2c和2d并涉及客户端服务器

服务器:

=> 2a =检查我们是否没有使用收据(在我们的二手和已交付货物的内部数据库中)
- >如果不使用则送出

客户端:

- >得到购买并做2b => 2b告诉服务器我们收到了数据!

服务器:

=> 2c:等待客户确认 => 2cd =将收据标记为已烧毁(在我们的数据库中),因为我们已经交付了它

答案 1 :(得分:0)

据我了解,您的主要问题是与购买耗材相关的UI / UX。

我不知道您的耗材对用户是“可见/可用”的,但对我而言,关键是让用户明白与服务器的交易进入“暂时失败”状态。当您的应用程序下载遇到任何障碍时,这与App Store中的情况相同。它可以被标记为“加载/等待”,如果不是“购买”,你可以明确表示只需要下载耗材(“安装/重试/下载/回收”而不是“购买”,这将是一件好事。 )。

在同一个地方找到“在遇到问题时联系我们”选项也是非常好的。我不知道为什么你的第三方连接可能会失败,但如果它以不太零星的方式进行,我打赌不止一些用户需要抱怨。

关于问题的客户端 - 服务器协议方面,你所描述的对我来说似乎很好。这里的关键点是服务器跟踪已经成功声明的收据;客户原则上可以尝试多次重复使用收据,它只会在第一次尝试时成功(在服务器将收据标记为已交付之前)。如果您想要更高的弹性,我会从客户端向服务器引入明确的确认阶段,确认已成功考虑耗材。

希望它有所帮助。