【问题标题】:Cannot figure out how to restore transactions on in-app purchases in Android无法弄清楚如何在 Android 中恢复应用内购买交易
【发布时间】:2012-08-01 22:13:17
【问题描述】:

我对 Android 在 RESTORE_TRANSACTIONS 方面的应用内计费感到非常困惑。

我有这个 sn-p 用于在我的应用程序中捐款:

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);
    }

【问题讨论】:

  • 可以恢复用户购买信息吗??其实我也面临这个问题

标签: android in-app-purchase in-app-billing


【解决方案1】:

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

【讨论】:

  • 好的,所以在查看了我的 BillingHelper 代码后,我在一个名为 getPurchaseInformation(String notifyIds) 的方法中找到了 PURCHASE_STATE_CHANGED。所以我尝试运行这个:BillingHelper.getPurchaseInformation(new String[] {"donation"});但没有返回值或任何东西。我需要某个地方的一些回复,以便我可以验证是否进行了捐赠,但我无法弄清楚:(。到目前为止,我唯一的“解决方法”是让用户在重新安装后单击捐赠按钮然后谷歌会像“这已经购买了”,然后一切正常......
  • 再次阅读文档。这以广播的形式异步出现。它可能不会立即发生,但它会到来。如果广播接收器设置正确,它将处理它。检查 Dungeons 示例,它执行此操作并具有 cmets。
  • 好的,我找到了有关billing receiver 的信息,但是我无法确定如何判断该项目是否已购买。所有的方法都是无效的。我拥有的这个类称为 BillingReceiver,它扩展了 BroadcastReceiver。我是否必须在 onReceive 方法中设置我的布尔值来说明应用程序是否已付费? onReceive 现在在我的主帖中
  • 您不必做任何特别的事情,Google 的服务器已经知道该特定用户已经购买了该商品,因为它与他们的 Google 帐户相关联。正如我所说,这是异步工作的,您将通过接收器收到通知。不过,您只能使用实际发布的应用和实际购买来测试它。
  • 另外restoreTrasactions() 不需要随机数,不确定你从哪里得到BillingHelper.restoreTransactionInformation(BillingSecurity.generateNonce())
【解决方案2】:

我刚刚在这里回答了一个类似的问题: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 步)。

【讨论】:

    猜你喜欢
    • 2011-09-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-28
    • 1970-01-01
    • 1970-01-01
    • 2011-11-09
    • 1970-01-01
    相关资源
    最近更新 更多