You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

无需强制注册账户,如何跟踪Google非订阅类已消耗内购订单?

解决方案

目前Google Play的官方API(包括最新的Billing Library 6和Google Play Developer API)仍然没有提供查询已消耗内购订单的接口,这一点和旧Stack Overflow回答的结论一致——Google Play不会留存已消耗订单的用户关联数据,因为消耗操作的设计目标就是标记该内购商品可被用户再次购买。

结合你有PHP后端的情况,最可靠的解决思路是自己搭建内购记录存储体系,具体方案如下:

核心方案:后端存储已验证的内购记录

  1. 客户端上传订单信息
    用户完成30天会员购买后,调用queryPurchasesAsync获取完整的订单数据(包括purchaseToken、productId、purchaseTime等),同时生成一个应用内唯一用户标识(比如随机UUID,首次启动时生成并存储在本地;或者结合Android ID/Advertising ID,注意Android 10+对Android ID的限制,以及用户可能关闭Advertising ID的情况),将这些数据一起发送到你的PHP后端。

  2. 后端验证并存储订单
    后端通过Google Play Developer API的purchases.products.get接口,传入包名、productId和purchaseToken验证订单的合法性(需要提前配置Google Cloud服务账号,获取OAuth2认证凭证)。验证通过后,计算会员到期时间(purchaseTime + 30天毫秒数),并将用户标识、订单信息、到期时间关联存储到你的数据库(如MySQL)。

  3. 客户端同步会员状态
    客户端每次启动、进入会员功能页面时,向PHP后端发起请求,携带用户标识,后端查询数据库后返回当前会员状态(是否有效、剩余时长等),客户端再根据返回结果更新本地状态。

补充优化:降低本地数据丢失影响

除了后端存储,你可以优化本地存储策略作为补充:

  • 将加密后的会员信息存储到应用私有外部存储目录(Android 11+的Scoped Storage下,应用私有目录无需额外权限),相比SharedPreferences,这里的数据在用户清除应用数据时更不容易被删除(但用户手动删除应用私有目录数据仍会丢失,仅作为兜底)。
  • 使用Room数据库替代SharedPreferences存储本地会员信息,数据库的稳定性和容错性更强。

关键注意事项

  • 不要仅依赖本地存储:无论优化哪种本地存储方式,都无法避免用户清除数据或卸载重装导致的信息丢失,后端存储是唯一可靠的持久化方案。
  • 用户标识的容错:如果用户更换设备,仅靠设备标识会导致会员状态无法同步,你可以在应用内增加“恢复会员”功能,让用户输入购买时的订单号(或提供其他验证方式),后端通过订单号查询并关联新的用户标识。

内容的提问来源于stack exchange,提问作者TheGreatCornholio

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 10:13:25