iOS应用内购买验证消耗品收据

5

在iOS应用内购买中,有必要通过订阅来验证收据。那么对于消耗品是否也需要验证收据呢?

2个回答

3

必需的,不是。推荐的,是。

所有购买;耗材、非耗材和订阅都容易受到欺诈攻击。通常是通过iap破解或网络欺骗。验证收据可以缓解这个问题。

您可以在应用程序中本地验证收据(请参见 本地验证收据),尽管它仍然容易被破解。

最安全的方法是执行服务器端验证,通过将收据发送到您的服务器,然后再发送到苹果(请参见 使用App Store验证收据)。

但是,请勿在应用程序内部与应用商店验证收据。很容易欺骗网络请求并返回积极(有效)的结果。

如果你注意到苹果报告中的实际购买和应用内购买分析之间存在很大差异(假设你有这个功能),你可能需要考虑投资于服务器端验证,否则,如果没有问题,就不要担心它。

1
在使用可消耗产品进行服务器端验证时,如果在验证收据时出现网络操作失败会发生什么情况? 例如,假设购买了产品并将收据发送到iPhone。然后,将从iPhone将收据发送到受信任的服务器。 如果后面的网络操作失败,应该保存收据以便在稍后重试验证吗?(可消耗产品的收据仅在购买时进行比较)我认为这种方式不正确,因为在这种情况下,用户支付了一种不能立即使用的产品。 - Andrea Gorrieri
2
@AndreaGorrieri 处理上游故障,如网络中断,取决于您想如何处理欺诈。您可以将购买视为欺诈,直到证明有效,或者将其视为有效,直到证明欺诈。在前一种情况下,将收据发送到服务器,如果失败(例如没有网络,500等),则指数级重试。在后一种情况下,发送收据,如果失败,则仍然解锁内容并继续重试。如果收据是欺诈的,请撤销访问权限。 - Marc Greenstock
2
感谢@Mark,我关心的是:由于消费品收据仅在购买时进行比较,因此应如何管理验证重试?我应该将收据保存在本地以便将来重新传输吗?我可以简单地不标记交易为“已完成”吗?根据我在文档中的理解,如果是后一种情况,StoreKit应再次调用事务队列观察器(传递收据),直到事务被标记为“已完成”,这正确吗? - Andrea Gorrieri
2
@AndreaGorrieri 一旦您完成可消耗购买的交易,该交易将从收据中删除。即,如果您在验证之前完成购买队列,则没有要验证的交易。但是,如果您在完成之前进行验证并在服务器上遇到错误,则需要决定如何处理。您可以在完成之前本地保存收据,调用finish,然后指数级重新尝试验证。如果收据是欺诈性的,则可以对用户进行惩罚,例如,如果您正在销售游戏货币,则扣除一些货币。 - Marc Greenstock
感谢@Mark的帮助,假设我只在收据验证后完成交易,以便在收据验证错误(网络中断)的情况下不会完成交易。在这种情况下,paymentQueue(_:updatedTransactions:)方法会再次被调用吗?我能否在那时检索可消耗产品的收据并重试验证过程?如果交易未完成,用户的信用卡是否会被扣款? - Andrea Gorrieri

3

不需要验证可消耗品的收据。

订阅也不需要验证收据。这里重要的是您可以恢复运行中的订阅;但是,为此您可以使用购买ID。

在告诉iOS购买成功之前,请始终确保向用户提供了所支付的内容!

(还有各种其他考虑因素,为什么您想在服务器上保留与购买相关的信息,但这不是您所询问的内容。)


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