【问题标题】:What is the purpose of the "developer payload"? What can it be used for?“开发人员有效负载”的目的是什么?它可以用来做什么?
【发布时间】:2012-02-15 08:23:04
【问题描述】:

Android 文档说它的意思是“关于订单的补充信息”,但同时它也说不要使用它来发送“实际数据或内容”。

那么这个“开发者有效载荷”的目的是什么?为什么会有这个功能?您能否描述一个真实的实际示例,说明我如何在自己的应用内结算实施中使用它?

【问题讨论】:

    标签: android in-app-billing


    【解决方案1】:

    正如 aromero 所说,开发人员有效负载字段的大小是有限的。这就是文档建议不要使用此密钥发送数据或内容的原因。

    您所做的是将内容保存到某处的数据库中(例如,在用户的设备或您自己的服务器上),然后将记录的索引放在开发人员有效负载字段中。当您通过PURCHASE_STATE_CHANGED 广播意图收到它时,您可以将它与数据库中的数据相关联。

    请注意,当使用任何测试 android 项目 ID 时,开发者负载不是由 Market 发送。您必须使用真实的应用内购买项目。

    另外,根据this(我还没有验证),你不会在调试模式下收到 developerPayload。您需要将您的应用程序签名为 RELEASE MODE 才能接收 developerPayload。

    最后,正如您在下面评论的那样,返回的JSONObject(响应 GetPurchaseInformation)已经包含 orderId、productId、purchaseTime 等。因此,“开发人员有效负载”实际上应该用于任何来识别购买......即答案与下面的建议相反。您可以使用“开发者负载”添加一些不在JSONObject 中的信息,例如购买者的其他详细信息(例如 GPS 位置(如果启用)、设备品牌和型号等)。

    【讨论】:

    • 迄今为止唯一实际添加了文档中尚未包含的内容的答案。接受。
    • 答案的最后一段是完全错误的。在此处引用来自 Google 的文档:您应该传入一个字符串令牌,以帮助您的应用程序识别进行购买的用户,以便您以后可以验证这是该用户的合法购买。当您从 Google Play 收到响应时,请确保验证开发人员有效负载字符串与您之前随购买请求发送的令牌匹配。作为进一步的安全预防措施,您应该在自己的安全服务器上执行验证。
    • 这个答案不正确恕我直言。此字段用于执行收据验证。通常用于传入唯一标识购买请求的字符串令牌,如下所述:developer.android.com/google/play/billing/…
    【解决方案2】:

    接受的答案具有误导性,最后一段完全错误。 以下是官方文档对此的说明。

    您应该传入一个字符串令牌,以帮助您的应用程序识别进行购买的用户,以便您以后可以验证这是该用户的合法购买。对于消耗品,您可以使用随机生成的字符串,但对于非消耗品,您应该使用唯一标识用户的字符串。

    当您从 Google Play 收到响应时,请确保验证开发者有效负载字符串与您之前随购买请求发送的令牌匹配。作为进一步的安全预防措施,您应该在自己的安全服务器上执行验证。

    负载可以帮助您防止识别绕过 Google Play 服务 API 或您的应用的用户,方法是将负载发送到您的服务器,您可以在服务器上检查该用户是否曾经购买过该商品。大概绕过 GPS 会让你的应用被购买证书愚弄。但是,如果您拥有保存在服务器上的真实购买该物品的人的所有用户 ID - 根据用户 ID 验证购买将很容易。这里的问题 - 除非您有所有您的用户以某种方式“登录”,否则谷歌无法依赖它。

    【讨论】:

      【解决方案3】:

      文档提供了一个真实的例子:

      开发人员指定的字符串,可以在您制作时指定 REQUEST_PURCHASE 请求。该字段以 JSON 字符串形式返回 包含订单的交易信息。你可以用这个 用于发送订单补充信息的键。 例如,您 可以使用此键发送带有顺序的索引键,如果 您正在使用数据库来存储购买信息。 我们建议 您不使用此密钥发送数据或内容。

      您可以使用此字段来识别用户正在购买的商品。当您发出REQUEST_PURCHASE 请求时,您可以使用DEVELOPER_PAYLOAD 提供更多信息。当您收到来自PURCHASE_STATE_CHANGED 的回复时,您会在developerPayload 字段中获取此信息,以便您识别订单。

      此字段限制为 256 个字符,并且未加密(但您可以验证签名),并不意味着存储实际内容。

      【讨论】:

      • 谢谢,但这个例子并没有解释太多。什么是“索引键”? “索引键”是什么? “使用数据库存储购买信息”是什么意思?通话中?在远程服务器上?这个“真实的例子”太简洁了,写它的人一定是假设任何为 Android 编程的人都是天才……但我不是天才,我只是想了解这个领域的用途,因为它似乎在地下城样本中扮演重要角色。既然请求中已经有sku/productId/item_id,为什么还要识别使用这个key购买的商品呢?
      • 您似乎对我的回答或文档感到不安。索引键是指将索引实际顺序的某个键(在这种情况下是一个字符串,可以是任何您想要的最多 256 个字符)。 “使用数据库存储购买信息”是指在手机上存储订单的数据库(Dungeons 示例使用了类似的方法,请查看 PurchaseDatabase.java)。在 Dungeons 示例中,该字段没有主要作用,它只是为了展示如何使用它。 item_id 必须与您在应用内设置中定义的有效 id 匹配,但是开发人员有效负载可以是您想要的任何内容
      • ...(续)并标识实际采购/订单,而不是项目。请注意,这是可选的,您可以在需要时使用它,否则您可以忽略它,一切都会正常工作。 Google 不使用此字段,它是为开发者提供的。
      • 对一个唯一的例子的存在并不感到不安,而是感到困惑。如果使用有效负载作为数据存储的索引是唯一用途,为什么不简单地定义(并记录它)呢?感谢 +1 的解释。
      • 我并不是说这是唯一的用途。该字段的本质是识别购买,因为流程是异步的,您可能需要一些“关键”来识别购买。数据存储示例可能是最常见的用例,但不限于此。
      【解决方案4】:

      我希望这会有所帮助:

      安全建议:发送购买请求时,请创建一个 唯一标识此购买请求的字符串令牌,并且 在 developerPayload 中包含此令牌。您可以随机使用 生成的字符串作为令牌。当您收到购买回复时 来自 Google Play,请务必检查返回的数据签名, orderId 和 developerPayload 字符串。为了增加安全性,您 应该在您自己的安全服务器上执行检查。确保 验证 orderId 是您以前没有的唯一值 已处理,并且 developerPayload 字符串与您的令牌匹配 之前与购买请求一起发送。

      More information here.

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-09-07
        • 1970-01-01
        • 2013-02-17
        • 2010-11-24
        • 1970-01-01
        • 2011-08-22
        • 1970-01-01
        • 2010-11-11
        相关资源
        最近更新 更多