无法弄清楚如何恢复 Android 中应用内购买的交易

2023-12-07

我对 Android 应用内计费的恢复交易感到非常困惑。

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

BillingHelper.requestPurchase(mContext, "donation");

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

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

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

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

BillingHelper.restoreTransactionInformation(BillingSecurity.generateNonce());

但现在怎么办?如果用户之前购买了“捐赠”的应用程序内购买管理,我如何查询谷歌以获取有关从应用程序内结算中购买了哪些项目的信息,以便我可以再次设置我的布尔值?请尽可能清楚地说明这一点,因为我一直在处理这个问题,在 IRC 上聊天,并搜索 API 大约 6 个小时,但我无法弄清楚这一点。

EDIT:

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

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

无法弄清楚如何恢复 Android 中应用内购买的交易 的相关文章

随机推荐

  • Go 中按空格分割字符串?

    给定一个输入字符串 例如 word1 word2 word3 word4 在 Go 中将其拆分为字符串数组的最佳方法是什么 请注意 可以有any每个单词之间的空格或 unicode 间距字符数 在Java中我只会使用someString t
  • PHP/MySQL 多级菜单

    我正在尝试使用 PHP 创建动态多级菜单 从 MySQL 数据库获取数据 我已经设法用以下格式在 php 数组中订购菜单项 Array 1 gt Array id gt 1 ubicacion gt top a nivel gt 1 par
  • VBA xmlhttprequest循环而不关闭连接

    我正在 VBA 中使用 xmlhttp 连接到 API 问题是我需要使用相同的 API 链接多次创建循环 唯一的区别是我发送了不同的 JSON 字符串 是否可以仅打开一次连接并发送标头和身份验证 然后多次发送数据并接收响应 主要目的是提高代
  • 有没有办法保存最大 1 MB 的“消息”集合并将结果写入 JSON/CSV 文件

    我有一个阻塞队列 它不断通过某些应用程序获取消息 现在在 asp net 应用程序中 我尝试使用该队列并将输出写入 CSV JSON 文件 在这里 我想保存最多 1MB 的消息 这些消息从阻塞队列接收 然后将其写出 现在再次保存 1MB 的
  • 如何在一个适配器上应用多个过滤器?

    我有一个 listView 和一个搜索字段 它调用我的适配器的 getFilter filter keyword 函数 它工作得很好 但我想添加另一个过滤器来搜索 listViews 对象的不同标签 所以我的适配器需要两个过滤器 对此最好的
  • IntelliJ 的嵌入式终端无法正确加载我的 Fish shell 配置

    IntelliJ 中的 Fish 配置未正确加载 并且我看到有关路径未正确设置的警告 set Warning PATH entry set Did you mean set PATH PATH 因此 IntelliJ 似乎能够获取位于 co
  • C# 导出到excel

    这是将数据导出到现有 xls 工作表的最佳方式 我需要支持很多版本的excel 如果我使用 Visual basic 我将使用 CreateObject Excel application 代码来完成我需要的操作 C 中的等价物是什么 我希
  • AnyLogic 中的系统动力学 - 斐波那契序列 [关闭]

    Closed 这个问题需要调试细节 目前不接受答案 我在 AnyLogic 中有一个系统动力学模型 我试图在其中对斐波那契序列进行建模 然而 由于某种原因 我的结果与预期不同 代替 1 1 2 3 5 8 13 I get 1 2 1379
  • 如何在重命名后找到存储库的新位置

    如果用户将存储库重命名为foo bar git to foo baz git通过 GitHub 的 UI 我如何通过 API 检测到这一点 目前 如果我像这样调用 API 我会收到 404 GET repos foo bar 如何找到新的存
  • 使用正则表达式根据用户名的最后一个字母更改文本

    我希望根据用例更改用户名的结尾 在将运行的语言系统中 名称结尾取决于其使用方式 因此需要定义名称的所有结尾并定义它们的替换 建议使用 gsub 正则表达式在字符串中搜索和替换 根据用户名的最后一个字母更改文本 name surname gs
  • 在 python 中加载 DLL 时出错,不是有效的 win32 应用程序 [重复]

    这个问题在这里已经有答案了 我正在尝试在 python 中加载 DLL 来调用函数 import ctypes from ctypes import dsusb ctypes WinDLL c python27 dsusb dll 我的堆栈
  • Windows 上 R 中的 UTF-8 支持

    由于Windows10添加了新功能 Beta 使用Unicode UTF 8支持全球语言 我认为R可以将语言环境转换为UTF 8 但是 当我尝试将系统区域设置更改为 UTF 8 时 Sys setlocale locale Japanese
  • 我可以使用什么 SQL 从我的付款数据中检索计数?

    计数标准 按学校服务类型按月 年对每所学校的学生人数 通过唯一的学生 ID 进行索引 进行 真实 计数 我目前正在使用 MS Access 我需要能够提取具有与下面的示例数据类似的数据的数据库的计数 每一行都是一个付款观察 样本数据 Stu
  • 用于文件上传的 javascript/flash 库,具有文件大小限制和进度条

    有没有用于此目的的 主流 库 普遍传播 维护良好 有记录等 我发现了这些 使用闪光灯 上传 版本不多 最新为 12 2010 没有文档 SWF上传 最新版本 03 2010 文档 奇特上传 看起来有问题 php文件上传器 看起来很重量级 而
  • 在 Teradata 中满足阈值后,将一列数字分为 30 个组

    考虑代表 事件之间的时间 的列 5 40 3 6 0 9 0 4 5 18 2 4 3 2 我想将它们分成 30 个桶 但桶会重置 期望的结果 0 1 1 1 1 1 1 1 1 2 2 2 2 2 这是因为 当我们累计到 30 时 我们会
  • 3D 应用程序中的 JavaFx 2D 部分

    我编写的应用程序有一个小问题 我想要有一个 3D 字段 并在右侧有一个包含 2D 组件 如按钮 的工具栏 我尝试简单地将这些组件添加到我的根组中 但是无法读取文本 并且它们与所有其他组件一起移动 那么 如何区分这两个区域呢 可能有两个场景
  • 如何更新项目中的 sbt?

    我正在 Coursera 上学习关于 scala 的课程 他们给我布置了作业 我下载了项目 有build sbt在里面 我尝试过sbt终端 Eclipse 和 Idea 中的命令没有任何作用 终端中的消息显示 info Compiling
  • 使用 Flask 使路由只能在调试模式下访问

    我有很多只希望在调试模式下访问的路由 是否有装饰器或其他东西允许我执行此操作 或者我必须完全注释 删除代码吗 例子 debug only app route send data
  • 在 Visual Studio 中向编辑器添加指南

    介绍 我一直在寻找一种方法让 Visual Studio 在一定数量的字符后画一条线 以下是启用这些所谓的指南指导方针适用于各种版本的 Visual Studio Visual Studio 2013 或更高版本 安装保罗 哈林顿的编辑指南
  • 无法弄清楚如何恢复 Android 中应用内购买的交易

    我对 Android 应用内计费的恢复交易感到非常困惑 我有这个片段用于在我的应用程序中进行捐赠 BillingHelper requestPurchase mContext donation 它工作得很好 没有任何问题 问题就在这里 当购