首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >是否可以查询Google,以确定某个项目是否是用户购买的?

是否可以查询Google,以确定某个项目是否是用户购买的?
EN

Stack Overflow用户
提问于 2017-08-04 16:16:58
回答 2查看 847关注 0票数 1

我正在学习如何处理从Android应用程序中购买的应用程序。我在读本文件

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

我的安卓应用程序(客户端)与Google应用程序进行通信,该应用程序收集用户的支付信息,然后与Google服务器进行通信。Google Play Server依次将项目分配给用户,并响应Google应用程序,该应用程序随后告诉我的客户购买成功。在此之后,客户端交付商品,然后向Google应用程序报告该项目已被消费,从而导致Google将该项目标记为已消费。

这引发了一个安全问题:我的客户端通过告诉我的服务器该项目已经购买,从而交付该项目。我的服务器是交付项目的服务器。我的客户应用程序是一个多人游戏。正因为如此,我的服务器才是有来交付这个项目的服务器。单靠客户端应用程序无法做到这一点。

但是,上述流程要求我的服务器信任客户端。如果客户端被黑客攻击或被恶意程序替换,它可以告诉我的服务器交付任何数量的项目。现在有办法让我的服务器验证这些购买是否有效。这是一个安全风险。

相反,我想让我的服务器问Google :这个用户实际上拥有这个项目吗?谷歌游戏服务器( Google )报告的答案是可信的。但这样做有API吗?如果是,文件在哪里?如果没有这样的API,那么多人游戏如何确保其购买的安全性?

EN

回答 2

Stack Overflow用户

发布于 2017-08-05 09:25:23

这个查询购买的物品主题可能会有所帮助:

查询采购物品

要检索用户从应用程序中购买的信息,请调用应用程序内计费服务上的getPurchases方法。将应用程序内计费API版本、调用应用程序的包名和购买类型(“inapp”或"subs")传递到方法中。以下是一个例子:

代码语言:javascript
运行
复制
Bundle ownedItems = mService.getPurchases(3, getPackageName(), "inapp", null);

Google服务只返回当前登录到设备的用户帐户所进行的购买。如果请求成功,则返回的包的响应代码为0。response还包含产品ID的列表、每个采购的订单详细信息列表以及每个采购的签名。 为了提高性能,应用内计费服务只返回用户首次调用getPurchase时拥有的多达700个产品。如果用户拥有大量产品,Google将包含一个字符串令牌,该标记映射到response中的键INAPP_CONTINUATION_TOKEN,以指示可以检索更多产品。然后,应用程序可以进行后续的getPurchases调用,并将此令牌作为参数传递。Google继续在response中返回一个延续令牌,直到用户拥有的所有产品都发送到您的应用程序。 有关getPurchases返回的数据的更多信息,请参见应用程序内计费参考。下面的示例演示如何从响应中检索此数据:

代码语言:javascript
运行
复制
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
}
票数 1
EN

Stack Overflow用户

发布于 2017-08-10 17:48:27

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

您应该执行以下操作

  1. 列表项目
  2. 使用服务器上生成的购买令牌在应用程序上遍历购买流。
  3. 接收客户端的购买信息
  4. 将采购信息发送到服务器--确保购买令牌、产品、订单信息有效。
  5. 让服务器与Google联系以验证购买--请参阅https://developer.android.com/google/play/billing/api.html
  6. 验证后,将响应返回给客户端。
  7. 让客户将响应返回给Google,然后Google将购买标记为已消费。
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45511430

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档