能否谷歌播放服务器查询,以找出是否一个项目是由用户购买?

问题描述:

我正在学习如何我可以从Android应用程序处理应用内购买。我在读this document能否谷歌播放服务器查询,以找出是否一个项目是由用户购买?

基本上,这个文档描述的流程如下:

我的Android应用(又名:客户端)与谷歌Play应用它收集用户的支付信息,然后与谷歌播放服务器通信通信。反过来,谷歌播放服务器的项目分配给用户,并响应谷歌Play应用,然后告诉我的客户,购买成功。在此之后,客户交付产品,然后报告给谷歌Play应用该项目已被消耗,这又导致了谷歌播放服务器,以纪念该项目所消耗。

这就提出了一个安全性问题:我的客户告诉我,该项目已被购买服务器提供的项目。我的服务器是提供物品的服务器。我的客户端应用程序是一个多人游戏。正因为如此我的服务器是提供该项目的一个。客户端应用程序本身不能做到这一点。

然而上述流程要求我的服务器信任的客户端。如果客户端被黑客入侵或被恶意程序取代,它可能会告诉我的服务器多次传送任何项目。现在我的服务器可以验证这些购买是否有效。这是一个安全风险。

相反,我希望我的服务器询问Google Play服务器:此用户是否真的拥有此项目? Google Play服务器会报告的答案可能是值得信赖的。但是有没有API可以这样做?如果是这样,该文档在哪里?如果没有这样的API,那么多玩家游戏如何确保他们购买的安全?

Querying for purchased items话题可能会有所帮助:

查询所购买的物品

要检索有关由用户从 您的应用程序进行的购买信息,请拨打getPurchases方法上在 - 应用程序结算服务。 将应用内结算API版本,您调用的应用程序包名称 以及购买类型(“inapp”或“subs”)传递到方法中。这里 是一个例子:

Bundle ownedItems = mService.getPurchases(3, getPackageName(), "inapp", null); 

的谷歌游戏服务仅返回由当前登录到设备的用户 帐户进行的购买。如果请求是 成功,则返回的捆绑包的响应代码为0.响应 捆绑包还包含产品ID列表,每个购买的订单清单 以及每个购买的签名。

为了提高性能,当getPurchase首先调用 时,应用内结算服务仅返回用户拥有的最多 700个产品。如果用户拥有大量产品,Google Play 会在响应包中包含映射到密钥 INAPP_CONTINUATION_TOKEN的字符串令牌,以表明可以检索更多 产品。然后,您的应用程序可以进行后续的 getPurchases调用,并将此令牌作为参数传递。 Google Play 将继续在响应套餐中返回持续令牌,直到 用户拥有的所有产品都会发送到您的应用。

有关getPurchases返回的数据的更多信息,请参阅“应用内结算参考”。下面的例子演示了如何可以 从响应检索此数据:

int response = ownedItems.getInt("RESPONSE_CODE"); 
if (response == 0) { 
    ArrayList<String> ownedSkus = 
     ownedItems.getStringArrayList("INAPP_PURCHASE_ITEM_LIST"); 
    ArrayList<String> purchaseDataList = 
     ownedItems.getStringArrayList("INAPP_PURCHASE_DATA_LIST"); 
    ArrayList<String> signatureList = 
     ownedItems.getStringArrayList("INAPP_DATA_SIGNATURE_LIST"); 
    String continuationToken = 
     ownedItems.getString("INAPP_CONTINUATION_TOKEN"); 

    for (int i = 0; i < purchaseDataList.size(); ++i) { 
     String purchaseData = purchaseDataList.get(i); 
     String signature = signatureList.get(i); 
     String sku = ownedSkus.get(i); 

     // do something with this purchase information 
     // e.g. display the updated list of products owned by user 
    } 

    // if continuationToken != null, call getPurchases again 
    // and pass in the token to retrieve more items 
} 
+0

这似乎是必须从设备上的应用程序调用 - 而不是我的服务器。 ''Google Play服务仅返回当前登录到设备的用户帐户所做的购买。“'我需要知道我的服务器如何从Google Play中找到(不信任应用程序)哪些项目是购买的,但是尚未消耗。 –

+1

我在Google Play中没有尝试过很多与应用帐单类似的功能,因此我只能列举官方文档。不知道你在做什么是受支持的。 – noogui

理想的情况下,因为我们已经看到,可以在使用第三方应用程序,你不应该相信客户端上进行购买越狱越安全的手机,模仿与Google Play商店的互动。

您应通过使用服务器上生成的购买令牌的应用程序购买流程执行以下操作

  1. 列表项
  2. 围棋。
  3. 收到客户
  4. 上的购买信息发送购买信息到服务器 - 确保购买令牌,产品,订单信息有效
  5. 有服务器聊到谷歌来验证购买 - 见https://developer.android.com/google/play/billing/api.html
  6. 验证完毕后,将回复返回给客户端
  7. 让客户端将响应返回给Google - 然后将购买标记为已使用。