应用内结算开发人员有效负载参数?

时间:2017-07-03 17:18:07

标签: android validation security in-app-purchase developer-payload

我从周日开始用六种方式搜索这个概念,我觉得我无法找到答案。 official Google docs表示它并不代表安全,但后来我发现的一堆答案似乎暗示其他等等。

来自文档:

  

第五个参数包含一个'开发人员有效负载'你可以的字符串   用于发送有关订单的补充信息(可以是   空字符串)。如果您指定字符串值,Google Play会返回此值   字符串以及购买响应。随后,当你做   有关此次购买的查询,Google Play会将此字符串一起返回   与购买细节。

     

警告:不要使用developerPayload字段进行安全验证   目的。完成任务时,此字段始终不可用   与应用内结算相关。有关安全性的最佳信息   实践,请参阅应用内结算安全和设计指南。

来自Google官方测试项目:

/** Verifies the developer payload of a purchase. */
boolean verifyDeveloperPayload(Purchase p) {
    String payload = p.getDeveloperPayload();

    /*
     * TODO: verify that the developer payload of the purchase is correct. It will be
     * the same one that you sent when initiating the purchase.
     *
     * WARNING: Locally generating a random string when starting a purchase and
     * verifying it here might seem like a good approach, but this will fail in the
     * case where the user purchases an item on one device and then uses your app on
     * a different device, because on the other device you will not have access to the
     * random string you originally generated.
     *
     * So a good developer payload has these characteristics:
     *
     * 1. If two different users purchase an item, the payload is different between them,
     *    so that one user's purchase can't be replayed to another user.
     *
     * 2. The payload must be such that you can verify it even when the app wasn't the
     *    one who initiated the purchase flow (so that items purchased by the user on
     *    one device work on other devices owned by the user).
     *
     * Using your own server to store and verify developer payloads across app
     * installations is recommended.
     */

    return true;
}

我完全不知道这意味着什么。如果我没有自己的服务器,我应该使用空白字符串吗?我该如何区分用户,购买和设备?

这一点对我来说都不清楚,而且此代码/官方文档没有提供真正的说明,大多数在线答案也同样稀疏。

任何人都可以说出来:我应该发送什么作为我的开发者有效负载参数?

2 个答案:

答案 0 :(得分:0)

至少你有安全理由生成随机字符串:两个使用不同developerPayload的相同购买总是会有不同的购买数据和签名。

String developerPayload = UUID.randomUUID().toString();

如果您不在服务器上处理答案,则没有任何理由记住并检查此字符串(请参阅Google测试中的警告)。

答案 1 :(得分:0)

Google代码备注中的最后一点似乎很有帮助

  

使用您自己的服务器在应用程序中存储和验证开发人员有效负载   建议安装。

如果你有一台服务器,你可以有一个getRandomString端点,服务器创建该端点并将其添加到与用户帐户关联的可用随机字符串列表中。

当字符串返回给客户端时,可以将其用作开发人员有效负载。

然后,在验证服务器上的购买令牌时,您可以获取有效负载并根据服务器上可用的随机字符串列表进行检查。

但是,我不确定这是否会增加任何安全性。而且我没有看到这对“跨应用程序安装”有何帮助。因为对于托管产品,无论应用程序安装如何,您都无法购买多个托管产品。它们必须先被消费才能再次购买......

你最后解决了问题吗?我很想知道你最后做了什么,因为我遇到了同样的问题,只有我有一个服务器后端。