iOS中应用内购买的服务器端验证最佳实践

Posted

技术标签:

【中文标题】iOS中应用内购买的服务器端验证最佳实践【英文标题】:Best practices in Server side validation of In app purchase in iOS 【发布时间】:2013-01-26 07:30:07 【问题描述】:

我们正在使用服务器端的付款验证,就像这样 -

    用户付款。 Store kit API 向 App 发送交易收据。 应用程序将 base64 编码的交易收据发送到我们的服务器。 我们的服务器调用https://buy.itunes.apple.com/verifyReceipt 并验证交易收据。 用户被标记为付费。

对于特定用户,我们没有在服务器上获得交易收据,因此无法验证收据。我们猜测在第 2 步和第 3 步中出了点问题。 如果在将收据发送到服务器时出现连接问题,应用程序会在后续应用程序恢复时再次重试。

现在我们有一个丢失的交易收据和一个愤怒的用户。你建议我们如何前进?我们将来如何防止这种情况发生?有没有我们可以遵循的指导方针或最佳实践来防止这种情况发生?

谢谢。

【问题讨论】:

【参考方案1】:

根据我的经验,可能的问题是

base64 数据在此过程中进行了 url 编码,因此 + 和 / 搞砸了 - 在传输之前将它们替换为更安全的字符 整个交易都是假的。

检查第二种情况的方法是查看您的帐户,看看是否有匹配的购买记录。不幸的是,除非您的购买量较低,否则该网站可能有点难以审核。

代码中需要两件事来正确处理服务器上的错误,或者如果发生这种情况,Apple 就完蛋了。

    在与服务器成功通信之前不要调用finishTransaction:(在这种情况下没有帮助,但值得注意) 在 SKPaymentQueue defaultQueue 上有一个“重新加载购买”按钮或调用 restoreCompletedTransactions: 的操作。对于非消耗品/权利对象,这将重新发送所有带有收据的交易,这些收据可以在您的服务器上重新验证。

如果您面临的问题是非消耗品/权利,那么第二项就是出路。

【讨论】:

非续订订阅是否使用第二种方法恢复? base64 url​​-encoding 事情已经处理好了,所以我们肯定知道情况并非如此。此外,您建议的修复 - (1),我们正在以不同的方式处理它,如果我们没有成功与服务器通信,我们将它放在安全的本地存储中,并在给定的触发点调用我们的服务器。所以也排除了。你还有什么建议?谢谢

以上是关于iOS中应用内购买的服务器端验证最佳实践的主要内容,如果未能解决你的问题,请参考以下文章

Swift iOS 应用程序到 REST PHP API - 身份验证的最佳实践是啥?

Ember.js 和玩!框架身份验证最佳实践

ios身份验证的最佳做法和教程

访问令牌持久性最佳实践 (iOS)

在服务器端验证 Mac OS X 的耗材应用内购买

后端日志最佳实践