使用 Google Checkout 轮询 API 验证 Android 应用内购买时出现延迟

2023-12-01

我正在尝试使用 Google Checkout API 从我的服务器验证 Android 应用内购买。根据另一个查询(Android 市场上的应用程序 - 没有 HTTP 通知),我没有收到回调,所以我使用轮询 API。

它工作正常,只是在轮询收到有关购买的通知之前我有 5 或 6 分钟的延迟,即使所有信息已经对在浏览器中登录到商家帐户的用户可见。检查 API 文档,这意味着可能需要更长的时间,因为它指出“使用轮询 API,您可以检索不到 180 天且至少 30 分钟的所有通知”。

这种延迟是否典型(我在英国)?轮询 API 是否仍然是验证 Android 应用内购买的推荐方法?


在我看来,尝试通过服务器上的 Google Checkout 轮询 API 验证 GP LVL 和/或 IAB 信息并不是最好的方法。如果你有服务器的话,还有更好的选择。

正如文章中提到的保护 Android LVL 应用程序的安全,最好的方法是在受信任的服务器上验证许可证信息。事情是这样的:

  1. 不要使用 Google 演示代码;它不稳健(不检查所有错误条件)并且甚至可以被脚本替换,例如伪造响应(尽管,如果您按如下方式实现服务器端检查,那么无论如何这是无关紧要的)。使用com.android.vending.licensing直接地。不要在您的应用中包含您的 Google 开发者控制台应用密钥,您在那里不需要它。
  2. 您的应用程序向您的服务器请求随机数ILicensingService.checkLicense()称呼。您的服务器向您的应用程序提供安全的随机数。您的应用程序调用ILicensingService.checkLicense()与那个随机数。
  3. Android GO LVL 服务通过以下方式回调您的应用程序ILicenseResultListener.verifyLicense(),提供签名数据和签名。 (提示:签名数据包含随机数,因此这里甚至不可能进行重放攻击。)
  4. 您的应用程序将签名数据连同签名一起传递到您的服务器。
  5. 您的服务器是唯一知道您的 Google 开发者控制台应用程序密钥的实例。它根据签名数据验证签名。
  6. 验证结果将有助于您有关访问服务器数据的身份验证决策。
  7. 确保不要过于频繁地检查许可证。 Google 希望您遵守许可证响应中提供的有效性时间戳(他们声称它甚至反映了 15 分钟的退款期)。显然,只有将有效性存储在server端和服务器允许应用程序跳过步骤 2 中的测试。

但有一点不同,这同样适用于 IAB。不幸的是,IAB V3 不适用于以下随机数:getPurchases()。原因大概是这样的IAB 服务本身(而不仅仅是 Google 应用程序端参考代码)广泛使用缓存。不过,对于购买,您可以通过developerPayload to com.android.vending.billing.IInAppBillingService.getBuyIntent(),这将包含在签名数据中getPurchases()返回。所以只要你有no过期标准或某种implicit(基于时间)或服务器管理的显式应用内购买的过期标准,API仍然足够安全;然后,服务器会要求应用程序消耗过期的项目,如果失败甚至不是问题,因为服务器仍然知道它,并且可以要求应用程序一次又一次地消耗这些项目。

我希望我能对这个话题有所启发。

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

使用 Google Checkout 轮询 API 验证 Android 应用内购买时出现延迟 的相关文章

  • ViewPager 显示的第一个片段与 FragmentStatePager 总是错误的

    我正在尝试拥有相同的view pager tabs设计为 PlayStore 5 1 x 这是我的布局
  • SQLite 中的 NOT NULL 列和错误捕获

    我有一个由用户定义的 EditText 填充的数据库 所有编辑文本都不允许有空字段 我知道我可以通过几个简单的 if 语句来检查这一点 if myEditText getText toString equals display error
  • 如何使用 zXing 在 Android 中创建 IntentIntegrator

    我想创建一个对象IntentIntegrator在安卓中 IntentIntegrator integrator new IntentIntegrator ZBarReaderActivity this Here ZBarReaderAct
  • Android Surface 与 Canvas 的关系

    Surface 和 Canvas 之间到底是什么关系 请解释 表面是一个缓冲区 画布保存绘图 视图未附加到画布 也不是表面 窗户被绑在 Surface 和 ViewRoot 询问 随后使用的画布表面 通过要绘制的视图 详细答案你可以阅读这篇
  • cordova - 删除不必要的权限

    我需要在游戏中播放声音 因此我将 org apache cordova media 插件添加到我的应用程序中 现在platforms android AndroidManifest xml包含2个我不需要的条目
  • 您如何在 Android 上处理超高 MP 相机(和图像)? - “画布:尝试绘制太大的位图”

    我有一个活动 用户可以像这样打开相机 getPictureUri createImageFromFile true let photoUri it openCameraActivity REQUEST IMAGE CAPTURE it ph
  • 终端 (Mac) 上的 ndk-build 命令出错

    这是我在 bashrc 中的环境变量设置 export ANDROID SDK AndroidSDK android sdks export ANDROID NDK AndroidNDK android ndk r8d export PAT
  • 如何实现可运行队列

    我正在尝试实现一个可运行队列 在异步任务期间依次执行 意味着队列中的下一个将在另一个完成后执行 我编写了一个管理器来管理这些可运行对象和本身就是可运行对象的任务 然后 我获取异步任务中的第一个任务并运行它 希望它能够在队列中运行 但是它最终
  • Android - 对话框内VideoView的MediaController出现在对话框后面

    我有一个VideoView在自定义对话框中 我正在为VideoView即时并将其分配给VideoView在代码中 但是控制器实际上并没有出现在视频上 它出现在对话框后面 知道如何让控制器位于视频上方吗 我创建了一个静态对话框帮助器类来帮助构
  • 当前收据无效或不匹配的 ds 人员 ID

    我正在尝试测试 MacOS 的应用内购买 输入测试用户凭据后 App Store 抱怨 当前收据无效或 ds 人员 ID 不匹配 并且购买失败 我尝试了很多方法来解决这个问题 获取 App Store 收据 http www kotanco
  • 使用 Retrofit 2 添加标头以请求

    我正在尝试发送带有身份验证标头的请求 但服务器似乎无法识别客户端 我用了this https futurestud io tutorials android basic authentication with retrofit教程 并实现了
  • Android“权限拒绝:无法使用相机”

    我正在学习有关在 Android 应用程序中使用相机的教程 我收到错误 权限被拒绝 无法使用相机 在模拟器和物理设备上运行调试时 我在清单文件中尝试了各种权限 似乎大多数遇到此错误的人都遇到了拼写错误 缺少权限或权限不在清单中的正确位置 这
  • Android键盘点击搜索输入时出现和消失

    我在用谷歌地图 Js API当我搜索一个地方时 我的输入搜索栏工作正常 当我通过 iPhone 设备使用它时 它也工作得很好 但是当我通过Android 设备然后键盘立即出现和消失 我已经找到了一些关于当我按下搜索栏时 android 键盘
  • GpsStatusListener:尽管状态为 GpsStatus.GPS_EVENT_FIRST_FIX,但修复中未使用卫星

    我向我的位置管理器添加了一个 GPS 状态侦听器 以便查看何时获得第一个修复 当我收到 GPS EVENT FIRST FIX 时 我会循环遍历所有卫星 但为什么修复中没有使用它们 usedInFix 我的日志对所有卫星都显示 错误 fin
  • Android 原生 AAssetManager 的文件层次结构

    Issue 我想知道如何从本机代码创建 Android 中资产文件夹的文件层次结构 我在用着AAssetManager openDir but AAssetDir getNextFileName不返回任何目录名称 因此基本上我无法深入了解层
  • Android中从一个应用程序向另一个应用程序发送数据时的加密

    我想将敏感数据从一个应用程序发送到另一个应用程序 我使用 Intent 并通过 Bundle 发送数据 现在 我应该使用加密算法来加密要发送的数据 同时接收器应用程序将解密数据 哪种算法最适合移动平台 我浏览过RSA文档 建议不建议用于长文
  • 不幸的是应用程序已在 Android 模拟器中停止

    我是 Android 新手 正在尝试一些小应用程序 例如 Compass 当我在模拟器中运行应用程序时 它会给出消息Unfortunately Compass has Stopped 我没有编译时错误 我该如何解决这个问题 是什么原因造成的
  • 我收到“循环依赖”Android Dagger Hilt 错误

    我从头开始检查了所有内容 但找不到错误 我找不到错误 可能是什么 我收到以下编译错误 HomeViewModel java 6 error ComponentProcessor MiscError dagger internal codeg
  • 如何在清单文件中添加符合我意图的标志

    我们知道 我们可以使用 java 代码中的 addFlags 方法将一些标志添加到我们的意图中 有什么方法可以将这些标志添加到清单文件本身中 而不是用 java 代码编写 我需要为清单中的一项活动添加 REORDER TO FRONT 标志
  • PinnedHeaderListView 滚动和标题问题

    背景 我正在尝试模仿 Lollipop 的联系人应用程序显示联系人首字母的固定标题的方式 正如我所写的here https stackoverflow com q 27621425 878126 问题 由于原始代码 发现here http

随机推荐

  • 在 MySQL 中的 accountID 之间转移“钱”

    我有一个问题 我尝试用谷歌搜索但尚未找到答案 我想做的是使用存储过程在 MySQL 中的两个帐户之间转账 例如 如果我使用呼叫转接 20 Test 3 5 然后我将从 accountID 3 转 20 美元到 accountID 5 并写入
  • 返回先前位置时如何避免 TDbgrid 滚动

    在下面的代码中 我们对某些选定的行进行一些操作 不是删除 然而 有时 完成后 顶部选定的行会滚动 使其显示在网格下方 1 2 处 有没有办法避免这种滚动 如果我的遍历下面选定行的代码由于某些不相关的原因不正确 我欢迎更正 Function
  • 里面有数字的叶子标记

    我想使用 Folium 在地图上做一些标记 并在标记内添加一些数字 我希望标记看起来像 Google 地图使用的标准倒置水滴形状 我看到对于 folium Marker 您可以使用参数 icon folium DivIcon html co
  • Codeigniter 查询生成器在 where_in 中使用 implode 函数

    这是我使用 implode 函数的正常 sql 查询 SELECT from search result WHERE skills IN implode s id 现在我想将其转换为 codeigniter 形式 我尝试了以下代码 但失败了
  • Unicode 组合字符的实际最大数量是多少?

    我正在寻找在非组合字符之后出现的 unicode 组合字符的最大数量在现实的自然文本中 我知道在 unicode 文本中 文本中的任何位置都可以放置任意数量的组合 但是 我正在编写一个专门的应用程序 该应用程序必须在资源有限的情况下运行 并
  • React - 从同级组件调用函数

    假设我有一个组件树 如下所示
  • 在基于 iframe 的文本编辑器中禁用 Firefox 和 Chrome 拼写检查

    有很多关于如何禁用 html 中的拼写检查的信息textarea元素通过使用spellcheck false 然而 要使文本区域具有更高级的功能 必须使用iframe with designMode on 参见例如这一页 这是在 GWT 中
  • 使用 C# 错误,可空对象必须具有值 datetime

    我在 C datetime 中遇到一个问题 我已经尝试了很多时间 它不是 给出问题的解决方案 所以给我一个解决方案 var accommodationcategoryList EmployeeAttendanceCacheMaster Ge
  • sprintf():作为参数的小数位数

    目前的解决方案是 dp lt 2 sprintf paste0 dp f 0 123 期望的解决方案没有 Paste0 并且类似于 sprintf 2 d f 0 123 2L 除了它有效之外 您可以使用 插入dp进入格式 dp lt 2
  • 使用“push”或“sub”x86 指令时,堆栈内存是如何分配的?

    我已经浏览了一段时间 我试图了解在执行以下操作时如何将内存分配给堆栈 push rax 或者移动堆栈指针为子例程的局部变量分配空间 sub rsp X Move stack pointer down by X bytes 我的理解是 堆栈段
  • 我可以信任 imageres.dll 系统图标索引吗?

    我制作了一个自定义目录树控件 它使用从中提取的系统图标imageres dll文件 我的意思是该文件是从 Windows 目录中读取的 因此根据 Windows 版本 该文件会有多个版本 下面是确切的 C 片段 ImageList Imag
  • javascript 中的 MM/DD/YYYY HH:MM:SS AM/PM 日期验证正则表达式

    我正在尝试在 JavaScript 中验证 MM DD YYYY HH MM SS AM PM 格式的日期 我无法找到任何好的答案 尝试了其他结果但没有成功 在以下问题中 asp net 已提出此问题 但 javascript 未提出此问题
  • ajax请求不同的主机

    我的网页中有以下 JavaScript var xhr new XMLHttpRequest xhr open GET http www google com true xhr onreadystatechange function if
  • SPARK - 在数组中的值上连接 2 个数据帧

    我找不到一种简单而优雅的解决方案来解决这个问题 我有一个 df1 与此列 guitars array nullable true element long containsNull true 我有一把吉他制成的 df2 还有一个与我的 df
  • 在 HTML 中查找单词

    我试图在 HTML 字符串中找到给定的单词并在其周围添加一个跨度 我现在正在做的是这样的 function find what String where String var regexp RegExp new RegExp what gi
  • JTable 不显示列名称

    这是我的代码 public class DownloadMainView extends JFrame private ArrayList
  • 如何通过 Windows API 访问系统规格?

    如何从 Windows API 访问有关计算机规格的信息 我需要查看注册表吗 如果需要的话 在哪里 我希望我的程序能够访问的一些关键信息包括显卡型号和规格 支持的 OpenGL 和 DirectX 版本 支持的屏幕分辨率 CPU 信息 总
  • SQL批量复制内存问题

    我们在 C 中使用 SqlBulkCopy 类 在sql中插入批量数据 我们有一个包含 1000 万条记录的表 我们正在循环中批量插入 10 000 条数据 我们面临物理内存问题 内存增加而不是减少 下面是我们的代码 当使用sql批量复制时
  • 使用 Zenhub API 从 Github 问题创建史诗

    这是一个后续问题如何使用 zenhub 设置问题管道 我正在尝试在 Python 脚本中将问题转换为史诗 我可以将问题转换为史诗 但当我尝试在创建史诗时添加问题时 出现错误 这有效 zenhub headers X Authenticati
  • 使用 Google Checkout 轮询 API 验证 Android 应用内购买时出现延迟

    我正在尝试使用 Google Checkout API 从我的服务器验证 Android 应用内购买 根据另一个查询 Android 市场上的应用程序 没有 HTTP 通知 我没有收到回调 所以我使用轮询 API 它工作正常 只是在轮询收到