无需强制注册账户,如何跟踪Google非订阅类已消耗内购订单?
目前Google Play的官方API(包括最新的Billing Library 6和Google Play Developer API)仍然没有提供查询已消耗内购订单的接口,这一点和旧Stack Overflow回答的结论一致——Google Play不会留存已消耗订单的用户关联数据,因为消耗操作的设计目标就是标记该内购商品可被用户再次购买。
结合你有PHP后端的情况,最可靠的解决思路是自己搭建内购记录存储体系,具体方案如下:
核心方案:后端存储已验证的内购记录
客户端上传订单信息
用户完成30天会员购买后,调用queryPurchasesAsync获取完整的订单数据(包括purchaseToken、productId、purchaseTime等),同时生成一个应用内唯一用户标识(比如随机UUID,首次启动时生成并存储在本地;或者结合Android ID/Advertising ID,注意Android 10+对Android ID的限制,以及用户可能关闭Advertising ID的情况),将这些数据一起发送到你的PHP后端。后端验证并存储订单
后端通过Google Play Developer API的purchases.products.get接口,传入包名、productId和purchaseToken验证订单的合法性(需要提前配置Google Cloud服务账号,获取OAuth2认证凭证)。验证通过后,计算会员到期时间(purchaseTime + 30天毫秒数),并将用户标识、订单信息、到期时间关联存储到你的数据库(如MySQL)。客户端同步会员状态
客户端每次启动、进入会员功能页面时,向PHP后端发起请求,携带用户标识,后端查询数据库后返回当前会员状态(是否有效、剩余时长等),客户端再根据返回结果更新本地状态。
补充优化:降低本地数据丢失影响
除了后端存储,你可以优化本地存储策略作为补充:
- 将加密后的会员信息存储到应用私有外部存储目录(Android 11+的Scoped Storage下,应用私有目录无需额外权限),相比SharedPreferences,这里的数据在用户清除应用数据时更不容易被删除(但用户手动删除应用私有目录数据仍会丢失,仅作为兜底)。
- 使用Room数据库替代SharedPreferences存储本地会员信息,数据库的稳定性和容错性更强。
关键注意事项
- 不要仅依赖本地存储:无论优化哪种本地存储方式,都无法避免用户清除数据或卸载重装导致的信息丢失,后端存储是唯一可靠的持久化方案。
- 用户标识的容错:如果用户更换设备,仅靠设备标识会导致会员状态无法同步,你可以在应用内增加“恢复会员”功能,让用户输入购买时的订单号(或提供其他验证方式),后端通过订单号查询并关联新的用户标识。
内容的提问来源于stack exchange,提问作者TheGreatCornholio

