当用户使用其他帐户登录时,如何防止激活应用内订阅?

Posted

技术标签:

【中文标题】当用户使用其他帐户登录时,如何防止激活应用内订阅?【英文标题】:How do I prevent activation of in-app subscriptions when user logs in with a different account? 【发布时间】:2021-04-11 19:31:16 【问题描述】:

我正在开发一个使用 Ionic 和 In App Purchase 2 的 android/ios 应用程序,以允许用户购买月度或年度订阅。然后,此订阅使用购买令牌和到期日期绑定到他们的帐户(他们从应用程序注册)。

我面临的问题是,当 用户 A 使用 电话 A 购买订阅时,与 电话 A关联的 Google/Apple 帐户> 和 user A 都与购买相关联,所以当 user A 退出时,user B 以相同的方式登录应用程序手机,用户 B 尚未购买订阅,因此当他们尝试购买时,In App Purchase 2 将状态自动设置为已批准/拥有,因为与 手机关联的 Google/Apple 帐户A 已经购买了订阅,这会使应用误以为 用户 B 也购买了订阅,因此为 用户 B 激活订阅。

如何防止多个用户登录应用并重复使用与 Google/Apple 帐户关联的订阅?我将非常感谢任何有关此的提示或提示。

这可能是一个令人困惑的问题,如果是这样,我深表歉意。

如果能提供任何帮助,我将不胜感激。提前谢谢!

【问题讨论】:

【参考方案1】:

应用内购买的经典问题!为此,您真正需要的是一个服务器来管理您的用户 ID 的订阅状态,并且在初始购买发生后不要依赖设备收据。在您提供的示例中,当用户 B 登录并尝试购买时,他们会收到来自 Apple 的消息,指出订阅已被拥有,而您不执行任何操作,用户 B 将无法访问。

当用户 B 尝试进行恢复时,真正的乐趣就开始了 - 因为您的应用中应该有一些恢复功能。对于恢复,您应该仍然将收据发送到您的服务器,但您需要在授予用户 B 访问权限之前检查同一个收据是否已经与另一个用户相关联。如果您看到用户 A 已经拥有相同的收据,您可以将错误返回给用户 B,或者将收据从用户 A 转移给用户 B - 授予用户 B 访问权限并撤销用户 A 的访问权限。

构建它的细节将是一个更大的帖子,但希望这可以为您指明正确的方向。还有像RevenueCat 这样的第三方工具是为这类事情构建的(免责声明:我在那里工作)。

有关构建 IAP 服务器的更多信息:https://www.revenuecat.com/blog/altconf-subscriptions-are-hard

【讨论】:

您好!非常感谢您的回答!我们实际上已经使用了一个 API 服务器,并使用它来验证购买并将购买与我们应用程序的用户相关联。但我没有考虑过检查收据是否已被其他用户使用。谢谢你提醒我!我想我还需要找到一种方法来仅在用户单击“购买”按钮时识别“拥有”状态,因为如果“拥有”状态在用户甚至没有单击它的情况下被识别,那么就会出现类似“该购买”的错误令牌已被占用”会突然显示。非常感谢!我也会检查你的链接。 啊听起来你已经解决了一些困难的部分!如果您首先确保您有一些规则不会在您的服务器上保存重复收据,那么您可以添加一些逻辑以仅将单个用户 ID 关联到每个收据。 嘿@enc_life,如果用户在一个应用程序帐户上购买订阅,然后切换到另一个应用程序帐户并想将订阅升级到更高级别(不是购买相同的),该怎么办? )?在这种情况下,升级会成功,Apple 不会阻止它。我们如何处理这种情况?如果我们允许,那么用户将被收取费用,但他不会收到任何不良 UX 的内容。 @AmerHukic 由你决定。我向用户显示“此收据已被其他客户使用”消息。 @enc_life 我也有类似的问题,如何让应用内用户 B 购买相同的订阅?我实际上将 RevenueCat 用于 Flutter。为相同的订阅调用购买只会导致 Play 商店告诉我我已经购买了它。我认为调用 setAllowSharingStoreAccount(false) 可能会有所帮助,但它没有【参考方案2】:

您能否拥有它,以便他们购买代币,然后用于激活您的帐户?

【讨论】:

您好!谢谢你的评论。不幸的是,我们的系统不是这样工作的,Apple 明确禁止这样的系统(就像 Epic Games 发生的那样),所以我认为我们不能这样做。 啊,虽然我以前读过类似的东西,但我只想发表评论,但我在这个网站上 没问题!我非常感谢听到您对此的想法。这实际上是解决此问题的好方法!不幸的是,Apple(也许还有 Google)不允许这样的系统,所以我们不能这样做。但请不要让这阻止你分享你的想法!每个想法都很重要,所以当人们生气并驳回 cmets 时不要介意,即使他们是有效的想法。 也是史诗般的游戏,用自己的支付系统绕过应用商店。假设您有一个游戏,他们在应用商店中出售宝石(代币),然后您使用宝石购买会员资格 啊,是的,如果我没记错的话(我可能记错了),Epic Games 提供了一种方法,您可以从他们的网站购买应用内货币,然后在游戏中使用该货币,所以是的,它绕过了 App Store。但是我们使用订阅而不是一次性购买,所以即使我们能够做到这一点,每月/每年购买也会很不方便。 (此外,不幸的是,我们计划实际使用 Play Store / App Store 购买,无论如何 :))【参考方案3】:

使用 Native Play Billing Library 2.2+,您可以在启动购买流程时通过调用setObfuscatedAccountId(如果需要,还可以调用setObfuscatedProfileId)将混淆的应用帐户 ID 绑定到购买。因此,您的后端和应用程序都将能够识别购买是否绑定到哪个应用程序帐户。但是要利用此功能,您可能需要自己编写代码,因为我没有看到 In App Purchase 2 具有该功能。

【讨论】:

以上是关于当用户使用其他帐户登录时,如何防止激活应用内订阅?的主要内容,如果未能解决你的问题,请参考以下文章

当用户未登录 iCloud 时,我可以使用 CloudKit 在我的应用程序中使用订阅吗?

当已经有第一人登录时,我们如何防止第二人登录

PHP - 贝宝订阅

使用 google 登录可防止用户使用其他帐户再次登录 - iOS

iOS 应用内购买自动续订订阅管理

防止没有[激活具有“真”值]的用户登录