随着您的应用程序越来越受欢迎,它也可能吸引恶意用户的注意,这些用户可能想要滥用您的应用程序。本主题介绍了您应该用来帮助防止对您的计费集成进行攻击并减少应用程序中滥用影响的建议。
将敏感逻辑移动到后端
尽可能地将敏感数据和逻辑移动到您控制的后端服务器。您在前端设备中拥有的数据和逻辑越多,它就越容易被修改或篡改。
例如,在线象棋游戏应该在后端验证所有移动,而不是相信前端始终发送合法移动。
此外,如果您发现漏洞或安全问题,根据您的系统设计,调试、修复和推出后端更新可能比前端更新更容易。
在授予权利之前验证购买
应该在后端处理的敏感数据和逻辑的一个特例是购买验证和确认。用户购买后,您应该执行以下操作
- 将相应的
purchaseToken
发送到您的后端。这意味着您应该保留所有购买的purchaseToken
值的记录。 - 验证当前购买的
purchaseToken
值是否与任何以前的purchaseToken
值匹配。purchaseToken
是全局唯一的,因此您可以安全地将此值用作数据库中的主键。 - 使用
Purchases.products:get
或Purchases.subscriptionsv2:get
Google Play 开发者 API 中的端点,与 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 帐户和应用内帐户以隐藏其活动有关。
使用 setObfuscatedAccountId
和 setObfuscatedProfileId
方法在 BillingFlowParams
的构建器中,以帮助 Google 将 Google 帐户映射到应用内帐户。
Google 使用此数据来检测可疑行为并在欺诈性交易完成之前阻止某些类型的欺诈性交易。
采取措施打击商标和版权侵权
如果您使用远程服务器来提供或管理内容,请让您的应用在用户访问内容时验证解锁内容的购买状态。这使您能够在必要时撤销使用,并最大限度地减少盗版。如果您发现您的内容正在 Google Play 上被重新分发,请确保及时果断地采取行动。有关更多详细信息,请参阅版权帮助中心的 常见版权问题 页面。