听起来您正在寻找的是一种检查用户的帐户是否启用了高级功能的方法,所以这就是我要开始的地方;
确保您的数据库中有某种标志,指示用户是否具有高级功能,并在请求帐户信息时将其包含在 API 响应负载中。该标志将是您对“高级功能”的主要权限。
当用户进行应用内购买时,将详细信息(令牌、订单 ID 和产品 ID)缓存在客户端(即应用程序)本地,然后将其发送到您的 API。
然后您的 API 应发送purchaseToken
to the Google Play 开发者 API用于验证。
从这里可能会发生一些事情:
- 收据有效,您的 API 使用 200 Ok 状态代码响应客户端
- 收据无效,您的 API 使用 400 Bad Request 状态代码响应客户端
- Google Play API 已关闭,您的 API 响应 502 Bad Gateway 状态代码
在 1. 或 2.(2xx 或 4xx 状态代码)的情况下,您的客户端会清除购买详细信息的缓存,因为它不再需要它,因为 API 已指示它已收到。
成功验证后(情况 1.),您应该设置premium
对于用户来说标记为 true。
在 3.(5xx 状态代码)或网络超时的情况下,客户端应继续尝试,直到从 API 收到 2xx 或 4xx 状态代码。
根据您的要求,您可以让它等待几秒钟,然后再次发送,或者在应用程序再次启动或退出后台(如果应用程序缓存中存在购买详细信息)时将详细信息发送到您的 API。
这种方法应该解决网络超时、服务器不可用等问题。
现在您需要考虑几个问题:
购买后应该立即发生什么?应用程序是否应该等到验证成功后再提供优质内容,还是应该暂时授予访问权限并在验证失败时将其取消?
授予对高级功能的临时访问权限可以使大多数用户的流程顺利进行,但是当您的 API 验证身份时,您也会向许多欺诈用户授予访问权限。purchaseToken
.
换句话说:购买在被证明是欺诈之前有效,或者;在证明有效之前是否存在欺诈行为?
为了确定用户在订阅期到期时是否仍有有效的订阅,您需要安排重新验证purchaseToken
运行在expiryTimeMillis
返回的result.
If the expiryTimeMillis
是过去的时间,您可以设置premium
标记为假。如果是将来,请重新安排新的时间expiryTimeMillis
.
最后,为了确保用户拥有(或没有)高级访问权限,您的应用程序应在应用程序启动时或从后台退出时查询您的 API 以获取用户详细信息。