随着您的应用越来越受欢迎,它也可能吸引恶意用户的关注,这些用户可能想要滥用您的应用。本主题介绍了您应使用哪些建议来帮助防止对您的计费集成的攻击,并减少滥用行为对您应用的影响。
将敏感逻辑迁移到您的后端
尽可能根据您的应用设计,将敏感数据和逻辑迁移到您控制的后端服务器。前端设备中的数据和逻辑越多,就越容易被修改或篡改。
例如,在线象棋游戏应该在后端验证所有移动,而不是信任前端总是发送合法的移动。
此外,如果您发现漏洞或安全问题,根据您的系统设计,在后端而不是前端调试、修复和推出更新可能会更容易。
在授予权利之前验证购买
应该在后端处理的敏感数据和逻辑的一个特例是购买验证和确认。用户购买后,您应该执行以下操作:
- 将相应的
purchaseToken
发送到您的后端。这意味着您应该维护所有购买的purchaseToken
值的记录。 - 验证当前购买的
purchaseToken
值是否与任何之前的purchaseToken
值匹配。purchaseToken
是全局唯一的,因此您可以安全地将此值用作数据库中的主键。 - 使用 Google Play 开发者 API 中的
Purchases.products:get
或Purchases.subscriptionsv2:get
端点来验证 Google 是否合法。 - 如果购买是合法的并且以前未使用过,您可以安全地授予应用内商品或订阅的权利。
- 对于订阅,当
linkedPurchaseToken
在Purchases.subscriptionsv2:get
中设置时,您还应该从数据库中删除linkedPurchaseToken
并撤销授予linkedPurchaseToken
的权利,以确保多个用户没有相同的购买权利。 - 只有在购买状态为
PURCHASED
时才应授予权限,并确保正确处理PENDING
状态的购买。如果CANCELED
状态的购买数量激增,则您可能在购买仍处于PENDING
状态时就授予了权限。您可以在处理挂起的交易中找到更多信息。 授予权限后,如果要消费和确认可消耗型产品,请在您的安全后端服务器上使用
Purchases.products:consume
Play 开发者 API。要确认非消耗型产品或订阅,请在您的安全后端服务器上调用相关的 Play 开发者 API 端点,即Purchases.products:acknowledge
或Purchases.subscriptions:acknowledge
。确认是必需的,因为它会通知 Google Play 用户已获得购买权限。您应在授予权限后立即确认购买。请注意,虽然您可以通过您的应用在客户端确认或消费购买,但服务器端 API 提供了针对诸如网络连接不良和恶意活动等问题的额外保护。例如,考虑一下用户从您的应用购买了商品,但在验证购买期间失去了网络连接的情况。如果没有服务器确认,他们可能需要通过应用重新登录以完成确认过程。否则,如果用户在三天内未重新登录,则由于缺乏购买确认,购买将自动退款。服务器确认通过在 Google Play 通知服务器购买有效后立即发送确认来防止这种情况。
有关购买确认和消费的更多信息,请参阅处理购买。
保护您解锁的内容
为防止恶意用户重新分发您解锁的内容,请不要将其捆绑在您的 APK 文件中。请改用以下方法之一:
- 使用实时服务来交付您的内容,例如内容提要。通过实时服务交付内容还可以让您保持内容的新鲜度。
- 使用远程服务器来交付您的内容。
当您从远程服务器或实时服务交付内容时,您可以将解锁的内容存储在设备内存中或存储在设备的 SD 卡上。如果将内容存储在 SD 卡上,请务必加密内容并使用特定于设备的加密密钥。
检测和处理无效购买
无效购买是指已取消、撤销或冲正的购买。如果先前已向用户授予了应用内商品或其他内容的无效购买,则可以使用无效购买 API 获取购买被无效的原因以及您可以收回的任何相关内容。
应用内商品和订阅的购买可能由于各种原因而失效,包括以下原因:
- 购买被取消,无论是用户、开发者还是 Google 取消的(包括未确认的自动取消的购买)。对于订阅,请注意,这指的是取消订阅的购买,而不是取消订阅本身。
- 购买被冲正。
- 应用开发者取消或退款用户订单并在控制台中选中“撤销”选项。
根据无效购买的原因,并考虑之前的用户行为数据,您可以决定采取行动。我们建议实施以下一项或多项:
- 执行收回:当购买无效时,您可以收回未使用的商品,就好像它们从未购买过一样。例如,如果游戏内货币购买无效,您可以收回已授予用户的货币。如果用户已经花费了货币,请考虑将货币余额设置为负数,并限制应用活动和未来的购买,直到货币余额为正数。
- 多次违规实施:考虑对初犯采取不太严厉的措施,例如显示应用内警告。对于累犯,请考虑采取更严厉的措施。
- 暂时禁用购买:与多次违规实施类似,请考虑对购买无效的用户禁用购买,直到您可以更彻底地调查为什么购买无效。
- 暂时或永久禁止访问您的应用:对于存在重复恶意活动的极端情况,请考虑暂时或永久禁止访问您的应用。
- 频繁调用无效购买 API:当您检测到一个或多个无效购买时,请考虑更频繁地调用无效购买 API 以在用户消费之前收回购买。您可以在无效购买 API 文档中找到有关无效购买 API 配额的更多信息。
帮助 Google 在欺诈发生前检测欺诈
某些类型的欺诈与恶意用户创建多个 Google 和应用内帐户以隐藏其活动有关。
在BillingFlowParams
的构建器中使用setObfuscatedAccountId
和setObfuscatedProfileId
方法来帮助 Google 将 Google 帐户映射到应用内帐户。
Google 使用此数据来检测可疑行为并在交易完成前阻止某些类型的欺诈性交易。
采取行动打击商标和版权侵权
如果您使用远程服务器来交付或管理内容,请在用户访问内容时让您的应用验证解锁内容的购买状态。这允许您在必要时撤销使用并最大限度地减少盗版。如果您发现您的内容在 Google Play 上被重新分发,请务必迅速果断地采取行动。有关更多详细信息,请参阅版权帮助中心中的常见版权问题页面。