android - 如何在服务器端验证 Android 应用的购买(应用计费 v3 中的谷歌播放)

标签 android in-app-purchase in-app-billing

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

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

我查看了谷歌官方提供的 Trivialdrive 示例,它没有提供任何用于服务器端验证的示例代码,这是我的问题。

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

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

恐怕有一种情况,如果用户从 google play 购买了这个项目,但由于某种原因,就在那个时候,当我的应用程序向我的服务器发起验证时,网络连接断开或我自己的服务器宕机了,用户刚刚在 google play 中支付了钱,但我没有在我的服务器中记录购买?我该怎么办,我该如何处理这种情况。

最佳答案

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

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

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

然后您的 API 应该将 purchaseToken 发送到 Google Play Developer 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 上安排重新验证以在 处运行result 中返回的 expiryTimeMillis .

如果 expiryTimeMillis 是过去的,您可以将 premium 标志设置为 false。如果是在未来,请为新的 expiryTimeMillis 重新安排。

最后,为确保用户拥有(或不拥有)高级访问权限,您的应用应在应用启动或退出后台时向您的 API 查询用户详细信息。

关于android - 如何在服务器端验证 Android 应用的购买(应用计费 v3 中的谷歌播放),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33850864/

相关文章:

android - Eclipse Android DDMS - 位置控制手册字段已禁用

android - Material Design 推荐的整个屏幕背景的填充是什么?

ios - 与从未付款的用户恢复应用内购买

android - 使用 Google Checkout 验证 Android 应用内购买?

android - Zebra Android Printing with v2.8.2148 图像打印为字符串而不是像素

android - 如何从android中的strings.xml获取整数值

ios - 是否可以在没有 UI/应用程序开销的情况下以编程方式创建测试收据?

ios - 应用内购买 : sorting array of product identifiers

android - 在 Android 中向某些用户提供应用内产品作为礼物

java - 您如何检查用户是否在打开应用程序时购买了应用程序内购买?