2

关于 RESTORE_TRANSACTIONS,我对 Android 的应用内计费感到非常困惑。

我有这个片段用于在我的应用程序中进行捐赠:

BillingHelper.requestPurchase(mContext, "donation");

它工作得很好,那里没有问题。问题就在这里,购买完成后我设置了一个布尔值:

if (BillingHelper.latestPurchase.isPurchased()) {
          DONATE_VERSION = true;
}

此后,除非用户卸载该应用程序,否则该应用程序将按预期运行。我将 DONATE_VERSION 存储在共享首选项中。将购买信息存储在互联网上的个人数据库中不是一种选择。

当用户重新安装应用程序时,他们可以从捐赠中删除广告的唯一方法是再次捐赠!我不希望出现这种情况。我希望能够向 Google 查询已购买哪些物品(在本例中为“捐赠”物品)的结果。我在 onCreate() 中调用它:

BillingHelper.restoreTransactionInformation(BillingSecurity.generateNonce());

但现在呢?如果用户之前购买了“捐赠”的托管应用内购买,我如何查询谷歌以从应用内结算中获取有关已购买哪些物品的信息,以便我可以再次设置我的布尔值?请尽可能清楚,因为我一直在搞砸这个,在 IRC 上聊天,并搜索 API 大约 6 个小时,但我无法弄清楚这一点。

编辑:

我的 onReceive() 方法:

@Override
public void onReceive(Context context, Intent intent) {
    String action = intent.getAction();
    Log.i(TAG, "Received action: " + action);
    if (ACTION_PURCHASE_STATE_CHANGED.equals(action)) {
        String signedData = intent.getStringExtra(INAPP_SIGNED_DATA);
        String signature = intent.getStringExtra(INAPP_SIGNATURE);
        purchaseStateChanged(context, signedData, signature);
    } else if (ACTION_NOTIFY.equals(action)) {
        String notifyId = intent.getStringExtra(NOTIFICATION_ID);
        notify(context, notifyId);
    } else if (ACTION_RESPONSE_CODE.equals(action)) {
        long requestId = intent.getLongExtra(INAPP_REQUEST_ID, -1);
        int responseCodeIndex = intent.getIntExtra(INAPP_RESPONSE_CODE, C.ResponseCode.RESULT_ERROR.ordinal());
        checkResponseCode(context, requestId, responseCodeIndex);
    } else {
       Log.e(TAG, "unexpected action: " + action);
    }
4

2 回答 2

1

您将在 PURCHASE_STATE_CHANGED 消息中获得交易信息,就像您在成功购买后所做的一样。像往常一样处理并设置您需要的任何标志/首选项。还要确保您只在首次安装时调用它(当所述首选项丢失/为空时),因为经常调用它会使您的应用程序在一段时间内被阻止。

于 2012-08-02T03:21:59.900 回答
0

我刚刚在这里回答了一个类似的问题:https ://stackoverflow.com/a/12187921/455886

恢复事务的典型场景流程如下:

  1. 用户安装您的应用程序。

  2. 首次加载应用时,您会检查是否需要恢复购买。

  3. 如果这样做,请向 Google 发送 RESTORE_TRANSACTION 同步请求。

  4. Google 将对您的 RESTORE_TRANSACTION 请求作出确认响应。(这只是确认他们收到了您的请求。)

  5. 此时,您应该标记您已经向 Google 发送了恢复请求,并且不需要从应用程序发送进一步的恢复。

  6. 现在,对于用户之前购买的每个应用内购买,Google 将开始异步向您的应用发送“PURCHASE_STATE_CHANGED”事件。如果用户第一次购买,该调用与 Google 发送的调用相同。

  7. 由于它是同一个调用,您的应用程序将接收事件并正常处理它,就好像用户刚刚购买了应用程序内产品一样(从而“恢复”购买的功能)。

关于第 2 步和第 5 步,我为我的应用程序所做的是保留一个名为“APP_INITIALISED”的 SharedPreference 值,该值默认为 false。每次我的应用启动时,如果“APP_INITIALISED”为假,我会告诉 Google RESTORE_TRANSACTION(第 2 步),然后我将 APP_INITIALISED 设置为真(第 5 步)。

于 2012-08-30T03:55:17.020 回答