SuperAPI AI 工具集

backend-architecture

编程与开发

查看项目

更新于 10-16 07:58

技能介绍

用途:该技能用于构建 Google Play Billing 收据校验后端。核心前提是客户端不可信——签名可伪造、APK 可被修改、本地购买数据可造假,因此后端必须把购买令牌视为不透明值,交由 Google 校验。

适用前提:需明确所售商品类型(订阅、消耗型、非消耗型,不同类型 API 端点不同);具备用户身份模型,每个购买令牌映射一个服务器账号;有以 purchaseToken 为主键的购买记录数据库;有 3 天内完成确认(acknowledgement)的方案,否则自动退款;并有 Play Console 账号且可访问 Setup > API access。

配置:在 Play Console 关联 Google Cloud 项目,在 Cloud Console 启用 Google Play Android Developer API,创建服务账号(无需 Cloud IAM 角色),生成 JSON 密钥并存为机密、不可提交至代码库,再在 Play Console 授予该账号 Financial data 与 Manage orders 权限。Google Cloud 容器化部署优先使用 Workload Identity Federation 而非 JSON 密钥文件,GoogleCredentials.getApplicationDefault() 可自动获取绑定的服务账号。

校验流程:接收客户端令牌,调用 Developer API 获取购买状态,校验响应字段(productId、packageName),确认状态为有效,检查令牌未被处理(幂等),持久化并授予权益,最后向 Google 确认。数据库主键用 purchaseToken(订阅续订间稳定);orderId 仅存储,每次续订会变;linkedPurchaseToken 作为外键,指向升降级链中的上一令牌。

订阅使用 purchases.subscriptionsv2.get 作为状态事实来源,关注 subscriptionState、lineItems[].productId、lineItems[].expiryTime、linkedPurchaseToken、acknowledgementState、externalAccountIdentifiers;仅在 subscriptionState == SUBSCRIPTION_STATE_ACTIVE 时授予权益。一次性商品使用 purchases.products.get,purchaseState 为 0 已购买、1 已取消、2 待处理,仅在 0 时授予。幂等处理:先停用 linkedPurchaseToken 对应记录,若已存在同令牌记录则直接返回,避免升降级后出现两份有效权益。

确认与配额:授予后在 3 天内确认,失败时退避重试。非消耗型调用 purchases.products.acknowledge;消耗型调用 purchases.products.consume(同时完成确认,勿两者都调);订阅调用 purchases.subscriptions.acknowledge,续订已自动确认。对 429 与 503 退避重试并遵循 Retry-After。默认配额为每日 200,000 次查询(含 subscriptionsv2.get 与 products.get),建议缓存校验结果 5 至 15 分钟、通过 Pub/Sub 实时开发者通知接收状态变化而非轮询、权益检查走数据库、在 Cloud Console 监控配额并在 80% 告警。

验证要点:同一令牌提交两次只授予一次;升级生成新令牌并通过 linkedPurchaseToken 停用旧权益;purchaseState == 2 的待处理购买只存储不授予,直至变为 0;确认发生在授予之后且 3 天内;取消后重新订阅通过 externalAccountIdentifiers 关联用户,而非令牌链(Google 不一定设置 linkedPurchaseToken);服务账号 JSON 密钥不入库、不入日志并定期轮换;负载测试不得使每日配额超 80%。

限制:以上为资料提供的架构与流程说明,具体语言、框架与部署环境需自行适配;资料未提供收费、价格或效果等未提及信息。