Android In-App Billing:字符串有效负载

时间:2016-09-12 13:27:56

标签: java android in-app-billing

我正在尝试在我的应用中实施应用内结算,google payload sample's MainActivity就像这样说:

  

/ * TODO:为了安全起见,请在此处生成有效负载以进行验证。请参阅评论            * verifyDeveloperPayload()获取更多信息。由于这是一个SAMPLE,我们只是使用            *一个空字符串,但在生产应用程序上,您应该仔细生成它。 * /

我在Android Developers - Security and Design上找了它,并说明:

  

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

我还不清楚如何生成字符串,最重要的是如何“使用唯一标识用户的字符串”

也许你可以提供一个例子,并简要说明它是如何运作的。

修改 Android Developers - Security and Design中的Google甚至建议不要使用用户电子邮件。

  

注意:请勿在有效内容字符串中使用用户的电子邮件地址,因为该地址可能会更改。

我可以使用什么呢?

1 个答案:

答案 0 :(得分:0)

根据Android文档,这里说明了

第五个参数包含一个'developer payload'字符串,您可以使用该字符串发送有关订单的补充信息(它可以是空字符串)。通常,这用于传递唯一标识此购买请求的字符串标记。如果您指定字符串值,Google Play会将此字符串与购买回复一起返回。随后,当您对此次购买进行查询时,Google Play会将此字符串与购买详情一起返回。

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

因此,对于产品ID SKU_2006,如果您使用String payload = email + item1启动了购买流程;那么Google Play将在响应中返回相同的有效负载,因此您可以在此处获取

boolean verifyDeveloperPayload(Purchase p) {
        String payload = p.getDeveloperPayload();
..
}

现在,让我根据代码定义整个场景:

首先,您将发起购买请求,如下所示

String payload = getUserEmailFromAndroidAccounts() + itemUniqueId;

mHelper.launchPurchaseFlow(new PurchaseFinishListener(itemUniqueId), SKU_GAS, 10001,   
   mPurchaseFinishedListener, payload);

如果采购订单成功,Google Play的响应数据将存储在传递回收件人的Purchase对象中。

 private class PurchaseFinishListener implements IabHelper.OnIabPurchaseFinishedListener {
   private final String mItemUniqeId;
    public PurchaseFinishListener(String itemUniqeId) {

            mItemUniqeId = itemUniqeId;
        }

       public void onIabPurchaseFinished(IabResult result, Purchase purchase) 
       {
          if (result.isFailure()) {
             Log.d(TAG, "Error purchasing: " + result);
             return;
          }      
    if (!verifyDeveloperPayLoad(mItemUniqeId , purchase)) {
     Log.d(TAG, "Authenticity verification failed");
             return;
    }

    // set your product as purchased in your DB or server

    }
    }

现在,您的verifyDeveloperPayLoad(购买)方法应如下所示: