我验证用户 Android 应用内订阅的步骤是否正确?

2024-01-11

我正在制作一个不需要用户帐户/登录的应用程序,并允许用户购买订阅。我想使用 Google Play 开发者 API 来验证用户是否已购买/有效订阅。从所有文档中,我收集了以下步骤。

它们是否正确?您能回答其中的两个问题吗?

  1. 创建一个服务帐号 https://developers.google.com/accounts/docs/OAuth2#serviceaccount在 Google API 控制台中。
  2. 保存给我的私钥(在哪里?肯定不是在我的代码/设备上)这个示例代码 https://code.google.com/p/google-api-java-client/wiki/OAuth2#Service_Accounts建议)
  3. Use 适用于 Java 的 Google API 客户端库 https://developers.google.com/accounts/docs/OAuth2ServiceAccount使用私钥创建并签署 JWT(如何?文档给了我这个 https://developers.google.com/accounts/docs/OAuth2ServiceAccount#jwtcontents,但这不是 Java 代码...我该怎么用它?)
  4. 构造访问令牌请求,并获取对 API 的访问权限
  5. 应用程序现在可以发送GET https://developers.google.com/android-publisher/v1/purchases/get向 API 请求以查明是否 用户有订阅
  6. 当访问令牌过期时,返回步骤 3。

另外,我有一个网络服务,尽管我对网络服务或网络服务编程一无所知……我只知道它可能有必要在这里使用。

编辑:这些步骤不正确。请参阅下面我的回答以了解正确的步骤。但是,请注意,这仅适用于使用服务帐户(因为我不想要求用户必须明确允许 API 访问)


事实证明,我的步骤不正确。我花了几周的时间才弄清楚这一点,而且似乎在其他地方没有记录到这一点。不客气:

  1. 创建一个Web应用程序帐户在Google API 控制台 https://code.google.com/apis/console/。将任何网站作为“重定向 URI”;没关系,因为您不会真正使用它。创建帐户时,您将获得客户端 ID 和客户端密钥。

  2. 在计算机上的浏览器中转至https://accounts.google.com/o/oauth2/auth?scope=https://www.googleapis.com/auth/androidpublisher&response_type=code&access_type=offline&redirect_uri=[YOUR REDIRECT URI]&client_id=[YOUR CLIENT ID]并在出现提示时允许访问。

  3. 查看地址栏。您最初输入的 URI 末尾将是您的刷新令牌。看起来像1/....您在下一步中将需要此“代码”。刷新令牌永远不会过期。

  4. 将此“代码”转换为“刷新令牌”,方法是:https://accounts.google.com/o/oauth2/token?client_id=[YOUR CLIENT ID]&client_secret=[YOUR CLIENT SECRET]&code=[CODE FROM PREVIOUS STEP]&grant_type=authorization_code&redirect_uri=[YOUR REDIRECT URI]。您可以将结果值保存在您的程序中;除非明确撤销,否则它永远不会过期。 (此步骤由 @BrianWhite 插入 - 请参阅评论) 确保您使用的是 POST。(由 Gintas 插入)

  5. 在您的代码中,将 HttpPost 请求发送到https://accounts.google.com/o/oauth2/token与 BasicNameValuePair"grant_type","refresh_token", "client_id",[YOUR CLIENT ID], "client_secret",[YOUR CLIENT SECRET], "refresh_token",[YOUR REFRESH TOKEN]。举个例子看看here http://www.androidsnippets.com/executing-a-http-post-request-with-httpclient。您需要在单独的线程中执行此操作,可能使用 AsyncTask。这将返回一个 JSONObject。

  6. 从返回的 JSONObject 获取访问令牌。举个例子看看here https://stackoverflow.com/questions/9605913/how-to-parse-json-in-android。您将需要获取字符串“access_token”。访问令牌将在 1 小时后过期。

  7. 在您的代码中,将 HttpGet 请求发送到https://www.googleapis.com/androidpublisher/v1/applications/[YOUR APP'S PACKAGE NAME]/subscriptions/[THE ID OF YOUR PUBLISHED SUBSCRIPTION FROM YOUR ANDROID DEVELOPER CONSOLE]/purchases/[THE PURCHASE TOKEN THE USER RECEIVES UPON PURCHASING THE SUBSCRIPTION]?accesstoken="[THE ACCESS TOKEN FROM STEP 4]"。举个例子看看here https://stackoverflow.com/questions/10455831/http-get-request-in-android-2-3-3.

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

我验证用户 Android 应用内订阅的步骤是否正确? 的相关文章

  • 找不到参数的方法 dependencyResolutionManagement()

    我正在尝试使用老师给我的一个项目 但它显示了一个错误 Settings file Users admin AndroidStudioProjects HTTPNetworking settings gradle line 1 A probl
  • 在包“android”中找不到属性“backgroundTint”的资源标识符

    我发现了一些视图 xml 属性 例如backgroundTint backgroundTintMode 但是当我使用它作为视图属性定义时 Eclipse 显示错误 No resource identifier found for attri
  • 在 ViewPager Fragments 中使用 Master/Detail 模板(下载链接)

    工作代码 https github com lukeallison ViewPagerMasterDetail https github com lukeallison ViewPagerMasterDetail Android 主 详细流
  • 找不到 com.google.firebase:firebase-core:9.0.0 [重复]

    这个问题在这里已经有答案了 在遵循有些不一致的指示之后here https firebase google com docs admob android quick start name your project and here http
  • CardView 圆角获得意想不到的白色

    When using rounded corner in CardView shows a white border in rounded area which is mostly visible in dark environment F
  • 谷歌坐标认证

    当我尝试连接到 Google 坐标时 总是出现异常GoogleAuthException 我拥有 Google 地图协调中心许可证 我确实使用我的包应用程序名称和 SHA1 在 google 控制台中创建了我的客户端 ID 我将权限添加到清
  • 如何以编程方式检查 AndroidManifest.xml 中是否声明了服务?

    我正在编写一个库 该库提供了一项服务 其他开发人员可以通过将其包含在他们的项目中来使用该服务 因此 我无法控制 AndroidManifest xml 我在文档中解释了要做什么 但一个常见的问题是人们忽略了将适当的 标记添加到其清单中 或者
  • 计数物体和更好的填充孔的方法

    我是 OpenCV 新手 正在尝试计算物体的数量在图像中 我在使用 MATLAB 图像处理工具箱之前已经完成了此操作 并在 OpenCV Android 中也采用了相同的方法 第一步是将图像转换为灰度 然后对其进行阈值计算 然后计算斑点的数
  • Android 模拟器插件无法初始化后端 EGL 显示

    我在 Cloudbees 上设置了 Jenkins 作业 并且可以在那里成功签出并编译我的 Android 项目 现在我想在 android 模拟器中运行一些 JUnit 测试并添加 Android 模拟器插件 我将 显示模拟器窗口 选项设
  • 是否必须删除 Intent extra?

    这可能是一个愚蠢的问题 但是是否有一条规则规定消费活动必须显式删除 Intent 额外内容 或者只有在回收 Intent 对象时才如此 换句话说 如果我总是通过执行以下操作来链接到下一个活动 Intent i new Intent MyCu
  • 在 HTTPResponse Android 中跟踪重定向

    我需要遵循 HTTPost 给我的重定向 当我发出 HTTP post 并尝试读取响应时 我得到重定向页面 html 我怎样才能解决这个问题 代码 public void parseDoc final HttpParams params n
  • 带有 EditText 和 Spinner 的对话框

    我有一个按钮 单击后会弹出一个对话框 我希望对话框有一个EditText and a Spinner对话框内 我不知道如何设置它的视图 我有一个代码AlertDialog它有效 只是EditText and Spinner我需要将其放入其中
  • 无法访问 com.google.android.gms.internal.zzbfm 的 zzbfm 类文件未找到

    我正在将我的 Android 应用程序项目从GCM to FCM 为此 我使用 Android Studio 中的 Firebase 助手工具 并遵循 Google 开发人员指南中的说明 一切都很顺利 并将我的应用程序代码更改为FCM根据助
  • 如何使用InputConnectionWrapper?

    我有一个EditText 现在我想获取用户对此所做的所有更改EditText并在手动将它们插入之前使用它们EditText 我不希望用户直接更改中的文本EditText 这只能由我的代码完成 例如通过使用replace or setText
  • Android向menuItem添加子菜单,addSubMenu()在哪里?

    我想根据我的参数以编程方式将 OptionsMenu 内的子菜单添加到 menuItem 中 我检查了android sdk中的 MenuItem 没有addSubMenu 方法 尽管你可以找到 hasSubMenu 和 getSubMen
  • Android 套接字和 asynctask

    我即将开始制作一个应该充当 tcp 聊天客户端的应用程序 我一直在阅读和阅读 我得出的结论是最好 如果不需要 将我的套接字和异步任务中的阅读器 问题是我不确定从哪里开始 因为我是 Android 新手 这至少对我来说是一项艰巨的任务 但据我
  • 一次显示两条Toast消息?

    我希望在一个位置显示一条 Toast 消息 并在另一位置同时显示另一条 Toast 消息 多个 Toast 消息似乎总是按顺序排队和显示 是否可以同时显示两条消息 是否有一种解决方法至少可以提供这种外观并且不涉及扰乱活动布局 Edit 看来
  • 如何在Xamarin中删除ViewTreeObserver?

    假设我需要获取并设置视图的高度 在 Android 中 众所周知 只有在绘制视图之后才能获取视图高度 如果您使用 Java 有很多答案 最著名的方法之一如下 取自这个答案 https stackoverflow com a 24035591
  • 实现滚动选择 ListView 中的项目

    我想使用 ListView 您可以在其中滚动列表来选择一个项目 它应该像一个 Seekbar 但拇指应该是固定的 并且您必须使用该栏来调整它 我面临的一个问题是 我不知道这种小部件是如何调用的 这使得我很难搜索 所以我制作了下面这张图片 以
  • 按日期对 RecyclerView 进行排序

    我正在尝试按日期对 RecyclerView 进行排序 但我尝试了太多的事情 我不知道现在该尝试什么 问题就出在这条线上适配器 notifyDataSetChanged 因为如果我不放 不会显示错误 但也不会更新 recyclerview

随机推荐

  • 如何使用 C# 获取所有复选框?

    In Asp net 我怎样才能访问每个checkbox存在于页面中使用C code 这让你每Checkbox在页面上 您可以更改form1到您想要在其中搜索的任何控件 foreach Control ctl in form1 Contro
  • 在 Android 中使用 MQTT 的基本步骤

    我是 Android 新手 希望使用 MQTT 作为来自服务器的 Android 推送通知程序 我读过有关 MQTT 的内容 但不太了解 如果有人使用过这个库 请告诉我我必须做什么才能开始使用它 我有一个 Java 服务器 在 Window
  • Javascript - 生成范围内的随机数,不包括某些数字

    基本上我正在创建一个网格并在其上绘制点 并且没有两个点可以位于完全相同的位置 3 4 与 4 3 不同 y 坐标必须在 2 和 7 之间 因此 2 3 4 5 6 7 x 坐标必须在 1 和 7 之间 我有一个 getRandom 函数 如
  • Python:BaseHTTPRequestHandler - 阅读原始文章

    如何阅读原始 http 帖子 STRING 我找到了几种用于读取帖子的解析版本的解决方案 但是我正在处理的项目提交了没有标头的原始 xml 有效负载 所以我试图找到一种方法来读取发布数据 而不将其解析为键 gt 值数组 self rfile
  • ByteBuffer 到 bigdecimal、二进制、字符串

    请检查本文底部的编辑我有一个字节缓冲区 128 位 其中有数字 我需要将其转换为大十进制 二进制 字符串 因为这些是使用 jdbc 时相应的 sql 映射 我可以使用库 API 来执行此操作吗 我看到 String valueof 不接受字
  • PHP CS Fixer File Watcher 导致 PHPStorm 中的文件缓存冲突

    I use a 文件观察者定义为这样 这是我的watchers xml file
  • 查找窗口错误 183

    有谁知道什么会导致FindWindow http msdn microsoft com en us library windows desktop ms633499 28v vs 85 29 aspx返回错误的函数 ALREADY EXIS
  • Flutter Web中如何获取本地IP

    我正在尝试在 Flutter Web 应用程序中获取本地 IP 地址 在互联网上搜索我发现了这个包 get ip0 4 0 它声明它正在网络下工作 我有这个功能 Future
  • C# 在运行时启用/禁用网络跟踪?

    在示例中 我可以发现跟踪是通过配置文件启用的 例如
  • 正确使用cudaDeviceReset()

    由于我怀疑 黑匣子 GPU 在一些较大的代码中没有完全关闭 其他人也许也是 https stackoverflow com questions 10294595 handling ctrlc exception with gpu 我会包括一
  • php - array_fill 负索引

    使用时php 数组填充 http php net manual en function array fill php和负指数 为什么php只填充第一个负索引 然后跳转到0 例如 array fill 4 4 10 应该填满 4 3 2 1
  • Windows 8 Consumer Preview + Visual Studio 11 Developer Preview 中的套接字 BUG

    我正在 Visual Studio 11 开发人员预览版中编写一个应用程序 在该应用程序使用 reader InputStreamOptions InputStreamOptions Partial 运行一段时间后出现此错误 选项集 An
  • Docker 镜像损坏?删除图层?

    系统重新启动后 现有的 docker 映像似乎已损坏 我尝试了以下方法 在该机器内重建一个泊坞窗 这有效 该图像运行良好 我拉了一个已经存在的图像 它说图层已经存在 但这个图像似乎仍然被损坏了 我觉得删除图像会有帮助 当我尝试删除时 似乎只
  • Pandas-创建一个新列,填充另一列中的观察数量

    我有一个 DataFrame 对象df 中的列值之一df is ID有许多行具有相同的 ID 我想创建一个新列num totals计算每个 ID 的观察次数 例如 这样的事情 ID Num Totals 1 3 1 3 1 3 2 2 2
  • 如何使用 Jersey (JAX-RS 2.0) 客户端启用 gzip 压缩以进行内容编码?

    我有一个使用 JAX RS 2 0 的 Jersey 实现的 Java 应用程序 我想在客户端启用 gzip 压缩 服务器已启用它 并且我已通过在 Chrome 中查看开发人员工具中客户端正在使用的特定 URL 的 大小 内容 来验证这一点
  • 自定义 UITextField 委托设置为 self 启动无限循环

    我正在编写 iPhone 应用程序 其中需要自定义 UITextField 类 对于我的文本字段 我需要缩进 文本之前的图像和最大字符数 为此 我创建了基于 UITextField 的自定义类 我所有的文本字段都将基于这个新类 我使用 Go
  • 如何从 Javascript 中的 HH:MM AM 时间字符串中减去小时?

    从格式如下的时间字符串中减去几个小时的最佳方法是什么 8 32 AM 我考虑过在冒号处拆分字符串 但是当从上午 1 00 减去 3 小时时 我得到 2 00 AM 而不是所需的晚上 10 00 最可靠的方法是将其转换为JS日期对象 然后你对
  • CMake 错误:在 Windows 上执行 make 失败

    我在尝试构建时遇到错误纳米信息项目 https github com nanomsg nanomsg在 Windows 7 中 cmake Building for NMake Makefiles The C compiler identi
  • 如何在php中验证正确的域名和子域

    如何去除www and validate有效的域名 有效域名 domain com subdomain domain com sub domain domain com 无效域名 www domain com www subdomain d
  • 我验证用户 Android 应用内订阅的步骤是否正确?

    我正在制作一个不需要用户帐户 登录的应用程序 并允许用户购买订阅 我想使用 Google Play 开发者 API 来验证用户是否已购买 有效订阅 从所有文档中 我收集了以下步骤 它们是否正确 您能回答其中的两个问题吗 创建一个服务帐号 h