Google Play 致力于确保用户和开发者的安全。我们深知,打造蓬勃发展的应用业务依赖于值得信赖的平台,该平台会主动防范恶意方,确保您的投资回报率。
本文档介绍了相关建议,旨在防止针对结算服务集成的攻击,并降低应用中滥用行为的影响。
改进保护措施
以下 API 和工具可以降低应用中的风险:
- **Voided Purchases API**:撤消对作废订单的访问权限。
- 混淆的账号 ID:帮助检测多个设备是否在短时间内使用同一账号进行 购买。
- **后端消耗**:Purchases.products:consume 等工具会将业务逻辑转移到安全的后端,从而防止客户端 篡改。除了使用这些平台 API 之外,您还可以采纳以下最佳实践,进一步保护您的集成免遭未经授权的访问。
防止伪造所在地
Google Play 提供内置保护措施,以防止不良行为者使用虚假所在地来利用区域货币差异(也称为伪造所在地)、滥用订阅促销活动和奖励,以及尝试礼品卡诈骗。
将敏感逻辑移至后端
在应用设计允许的范围内,尽可能将敏感数据和逻辑移至您控制的后端服务器。前端设备中的数据和逻辑越多,就越容易遭到修改或篡改。
例如,在线国际象棋游戏应该在后端验证每一步,而不是相信前端发送的每一步始终都是合法的。
此外,如果您发现漏洞或安全问题,根据您的系统设计,在后端而非前端调试、修复和部署更新可能会更容易。
在授予权利前验证购买交易
应该在后端处理敏感数据和逻辑的一种特殊情况是购买交易验证和确认。用户完成购买交易后,您应该执行以下操作:
- 将相应的 purchaseToken 发送到后端。也就是说,您应维护一份所有购买交易的所有 purchaseToken 值记录。
- 验证当前购买交易的 purchaseToken 值是否与以前的任何 purchaseToken 值都不匹配。purchaseToken 具有全局唯一性,因此您可以放心地使用此值作为数据库中的主键。
- 使用 Google Play Developer API 中的 Purchases.products:get 或 Purchases.subscriptionsv2:get 端点 向 Google 验证购买交易是否合法。
- 如果您认为购买交易合法,过去没有使用过或处理过,并且用户通过了您的所有资格和欺诈检查,那么您就可以放心地授予对应用内商品或订阅的权利。
- 资格和滥用行为检查 :验证用户是否仍有资格购买该商品。如果您使用 obfuscatedAccountId 或 obfuscatedProfileId 配置了结算流程,请检查 购买交易映射是否与系统中的预期用户账号匹配。 执行后端所需的任何其他滥用行为、风险或安全检查。
- 针对非法购买交易的明确退款 :如果购买交易未通过验证或滥用行为检查,请勿授予权利,也不要确认或消耗购买交易。请勿因缺少确认而让购买交易自动退款(这很模糊,因为也可能是处理超时导致的),而是使用
purchases.subscriptionsv2:revoke端点(使用"fullRefund": {})明确撤消并退还订阅的购买交易,或使用Orders:refund端点(将revoke参数设置为true)明确撤消并退还一次性商品的购买交易。撤消购买交易可确保用户不再拥有购买交易的权利,并向 Google Play 发出明确信号,表明开发者拒绝了该购买交易。
- 对于订阅,在 linkedPurchaseToken 设置 在 Purchases.subscriptionsv2:get 中时,您还应从数据库中移除 linkedPurchaseToken 并撤消授予 linkedPurchaseToken 的权利,以确保不会针对同一购买交易向多个用户 授予权利。
- 只有在购买交易状态为 PURCHASED 时,您才应授予使用权,并确保正确处理待处理的购买交易。如果 CANCELED 购买交易出现激增,那么您可以在购买交易仍处于 PENDING 状态时授予权利。如需了解详情,请参阅处理待处理的 交易。
授予权利后,如果您想消耗和确认 消耗型商品,请在安全的后端服务器上使用 Purchases.products:consume Play Developer API。如需确认非消耗型商品 或订阅,请在安全的后端服务器上调用相关的 Play Developer API 端点(Purchases.products:acknowledge 或Purchases.subscriptions:acknowledge)。您必须进行确认,因为这会通知 Google Play 用户已获得购买交易的权利。您应在授予权利后立即确认购买交易。
请注意,虽然您可以通过应用在客户端确认或消耗购买交易,但服务器端 API 可以针对网络连接不佳和恶意活动等问题多提供一重保护。例如,假设用户已从您的应用购买商品,但在购买交易验证期间网络连接中断了。如果没有服务器确认,他们可能需要通过应用重新登录才能完成确认流程。否则,如果用户在三天内未重新登录,购买交易会因未经确认而自动退款。服务器确认可防止出现这种情况,因为它会在 Google Play 将购买交易有效的消息告知服务器后立即发送确认信息。
如需详细了解购买交易确认和消耗,请参阅 处理购买交易。
保护未锁定内容
为防止恶意用户重新分发您未锁定的内容,请勿将这种内容放入您的 APK 文件中, 而是执行以下操作之一:
- 使用实时服务发送内容,例如内容 Feed。 通过实时服务发送内容还可以让您保持内容的新鲜度。
- 使用远程服务器发送内容。通过远程服务器或实时服务发送内容时,您可以将未锁定内容存储在设备内存中或设备的 SD 卡上。如果您将内容存储在 SD 卡上,请务必加密内容并使用特定于设备的加密密钥。
检测并处理作废的购买交易
作废的购买交易是指已取消、撤消或退单的购买交易。如果作废的购买交易之前已向用户授予应用内商品或其他内容 ,您可以使用 Voided Purchases API 获取购买交易作废的原因以及您可以收回的任何关联内容 。
购买应用内商品和订阅的交易可能出于各种原因而作废,其中包括:
- 购买交易被取消,可能是用户、开发者或 Google 取消的(包括未经确认而自动取消的购买交易)。对于订阅,请注意 ,这是指取消订阅的购买交易,而不是 取消订阅本身。
- 购买交易被退款。
应用开发者取消或退还用户订单,并在控制台中选中“撤消”选项。您可以根据购买交易作废的原因并考虑到之前的用户行为数据,决定采取何种行动。我们建议您实施以下一项或多项措施:
执行收回商品操作 :如果购买交易作废,您可以收回未使用的商品,视同其从未出售过。例如,如果游戏代币购买交易作废,您可以收回已经授予用户的游戏代币。如果用户已经花费了游戏币,请考虑将游戏币余额设置为负数,并限制应用活动和未来的购买交易,直到游戏币余额为正数为止。
实施多次警示 :对于初犯者,请考虑采取不太严厉的措施,例如显示应用内警告。对于屡犯者,应考虑采取更严厉的措施。
暂时禁止购买 :与实施多次警示类似,您也可以考虑在您能够更彻底地调查购买交易作废的原因之前,禁止购买交易曾经作废的用户进行购买。
暂时或永久禁止访问您的应用 :对于屡次实施恶意活动的极端情况,应考虑暂时或永久禁止对方访问您的应用。
频繁调用 Voided Purchases API :当您检测到一项或多项作废的购买交易时,请考虑更频繁地调用 Voided Purchases API,以便在用户消耗购买交易之前收回购买交易。如需详细了解 Voided Purchases API 配额,请参阅 Voided Purchases API 文档。
帮助 Google 在欺诈发生前及时发现欺诈行为
实施某些类型的欺诈行为的恶意用户会创建多个 Google 账号和应用内账号来隐藏他们的活动。
使用 setObfuscatedAccountId 和
setObfuscatedProfileId 方法,帮助 Google 将 Google 账号映射到
应用内账号。BillingFlowParams
Google 会使用这些数据来检测可疑行为,并在某些类型的欺诈交易完成之前将其屏蔽。
针对商标和版权侵犯采取行动
如果您使用远程服务器发送或管理内容,请确保当用户访问内容时,应用能够验证未锁定内容的购买状态。这样,您就可以在必要时撤消使用权并最大限度地减少盗版行为。如果您发现自己的内容在 Google Play 上被重新分发,请务必迅速果断地采取行动。如需了解更多详情,请参阅版权帮助中心内的 版权常见问题解答 页面。