如何在服务器端验证 Android 应用程序的购买(Google Play 应用程序计费 v3)

2023-12-12

我有一个简单的应用程序(需要用户使用帐户登录)。我为付费用户提供一些高级功能,例如更多新闻内容。

我需要在我的服务器数据库中记录用户是否购买了该商品。当我向用户的设备提供数据内容时,我可以检查用户的状态,并为付费用户提供不同的内容。

我查看了Google官方提供的Trivialdrive示例,它没有提供任何服务器端验证的示例代码,以下是我的问题。

  1. 我发现示例使用我的应用程序的公钥来验证购买,看起来不太好,我想我可以将验证过程移至我的服务器并结合用户登录凭据来查看用户购买是否完成,然后更新数据库。
  2. 还有购买API我可以用来查询,我需要的是将用户的purchaseToken传递到服务器中。

我不确定应该采取什么方法来验证用户的购买,并在我的数据库中标记用户的状态,也许两者兼而有之?

恐怕有一种情况,如果用户从 google play 购买了该商品,但由于某种原因,就在那时,当我的应用程序向我的服务器启动验证时,网络连接已关闭或我自己的服务器已关闭,用户刚刚在 google play 中付款,但我没有在我的服务器中记录购买情况?我该怎么办,我该如何处理这种情况。


听起来您正在寻找的是一种检查用户的帐户是否启用了高级功能的方法,所以这就是我要开始的地方;

确保您的数据库中有某种标志,指示用户是否具有高级功能,并在请求帐户信息时将其包含在 API 响应负载中。该标志将是您对“高级功能”的主要权限。

当用户进行应用内购买时,将详细信息(令牌、订单 ID 和产品 ID)缓存在客户端(即应用程序)本地,然后将其发送到您的 API。

然后您的 API 应发送purchaseToken to the Google Play 开发者 API用于验证。

从这里可能会发生一些事情:

  1. 收据有效,您的 API 使用 200 Ok 状态代码响应客户端
  2. 收据无效,您的 API 使用 400 Bad Request 状态代码响应客户端
  3. 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 以获取用户详细信息。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在服务器端验证 Android 应用程序的购买(Google Play 应用程序计费 v3) 的相关文章

随机推荐