检查用户是不是真的为应用内购买付费 [iOS, Swift]

Posted

技术标签:

【中文标题】检查用户是不是真的为应用内购买付费 [iOS, Swift]【英文标题】:Check to see if user actually payed for in-app purchase [iOS, Swift]检查用户是否真的为应用内购买付费 [iOS, Swift] 【发布时间】:2021-01-20 07:13:58 【问题描述】:

这对你来说很奇怪:)

我有一个 ios 应用,其中包含非消耗性产品作为用户可以购买的应用内购买。如果您愿意,这是一种终身订阅。

问题是我的代码中有一个错误,它允许用户通过点击恢复购买按钮来“订阅”我的应用程序。

我现在修复了这个错误,但我有一个问题。现在大约有 50 名用户订阅了这项服务,但从未为此服务付费。

有没有办法查看用户是否真的为此付费?如果他们不付款,我想退订。

系统是这样工作的:

用户点击购买,Apple 会为我处理购买,在处理支付队列时,如果购买成功,我会通过将用户的 iCloud ID 添加到我的数据库来订阅用户。因此,我拥有的唯一数据是他们的 iCloud id,仅此而已。我不知道哪个 iCloud ID 是“付费”的,哪个是“作弊”:)

【问题讨论】:

【参考方案1】:

您可以从用户的设备上获取收据,并通过 Apple 的端点检查用户是否进行了有效购买。理想情况下,您应该从应用程序中获取收据并将其发送到您的服务器,以便在您的后端执行验证。

查看此文档以获取设备的收据 - https://developer.apple.com/documentation/storekit/in-app_purchase/validating_receipts_with_the_app_store

查看此文档以调用使用 Apple 端点验证收据 - https://developer.apple.com/documentation/appstorereceipts/verifyreceipt

【讨论】:

非常感谢您的回复!我实际上在沙盒环境中尝试过这个,结果很奇怪。我用我的帐户(沙盒上的付费用户)尝试了它,并且在手机上获取收据的代码没有找到收据。然后我试图从苹果的服务器上获取收据,它得到了收据。但是当尝试与一个不付费的新创建用户时,它也为他找到了一张收据。你能解释一下这是如何工作的吗?我在网上找不到任何东西。 尝试在应用程序上进行购买,然后检查收据是否存在。我从来没有遇到过这种情况,确实听起来很奇怪。关于非付费用户的收据 - 根据我的经验,所有用户都有一个 base64 编码的收据。但是,如果您将该收据传递给verifyReceipt API,它将返回所有购买。这就是为什么我提到您应该使用 base64 收据检查 Apple 的端点。您无法仅通过检查用户手机上是否有 base64 编码收据来确定用户是否进行了购买。 好了,就是这样!我没有与 Apple 核对,我假设如果有收据,那么就有购买。 Apple 文档确实效率低下。谢谢你好先生!

以上是关于检查用户是不是真的为应用内购买付费 [iOS, Swift]的主要内容,如果未能解决你的问题,请参考以下文章

如何确认应用内购买是不是真的对测试 iTunes Connect 用户有效?

如何确定购买该应用(不是应用内购买)的原始版本或日期

如何从付费应用转换为应用内购买? iOS 和 Android + Flutter

在显示按钮之前检查是不是可以进行应用内购买

免费应用内购买

Android:应用内:检查是不是已购买商品