<bdo id='6MSeh'></bdo><ul id='6MSeh'></ul>

  1. <legend id='6MSeh'><style id='6MSeh'><dir id='6MSeh'><q id='6MSeh'></q></dir></style></legend>

  2. <i id='6MSeh'><tr id='6MSeh'><dt id='6MSeh'><q id='6MSeh'><span id='6MSeh'><b id='6MSeh'><form id='6MSeh'><ins id='6MSeh'></ins><ul id='6MSeh'></ul><sub id='6MSeh'></sub></form><legend id='6MSeh'></legend><bdo id='6MSeh'><pre id='6MSeh'><center id='6MSeh'></center></pre></bdo></b><th id='6MSeh'></th></span></q></dt></tr></i><div id='6MSeh'><tfoot id='6MSeh'></tfoot><dl id='6MSeh'><fieldset id='6MSeh'></fieldset></dl></div>

  3. <small id='6MSeh'></small><noframes id='6MSeh'>

      <tfoot id='6MSeh'></tfoot>
    1. 我是否获得了验证用户的 Android 应用内订阅的正确步骤?

      Am I getting the steps right for verifying a user#39;s Android in-app subscription?(我是否获得了验证用户的 Android 应用内订阅的正确步骤?)

        <tbody id='84BP1'></tbody>

        <bdo id='84BP1'></bdo><ul id='84BP1'></ul>
        <tfoot id='84BP1'></tfoot>
        <i id='84BP1'><tr id='84BP1'><dt id='84BP1'><q id='84BP1'><span id='84BP1'><b id='84BP1'><form id='84BP1'><ins id='84BP1'></ins><ul id='84BP1'></ul><sub id='84BP1'></sub></form><legend id='84BP1'></legend><bdo id='84BP1'><pre id='84BP1'><center id='84BP1'></center></pre></bdo></b><th id='84BP1'></th></span></q></dt></tr></i><div id='84BP1'><tfoot id='84BP1'></tfoot><dl id='84BP1'><fieldset id='84BP1'></fieldset></dl></div>

            <small id='84BP1'></small><noframes id='84BP1'>

              <legend id='84BP1'><style id='84BP1'><dir id='84BP1'><q id='84BP1'></q></dir></style></legend>

              • 本文介绍了我是否获得了验证用户的 Android 应用内订阅的正确步骤?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着跟版网的小编来一起学习吧!

                问题描述

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

                I am making an app that does not require a user account/login, and allows the user to purchase a subscription. I want to use the Google Play Developer API to verify whether or not a user has a purchased/active subscription. From all of the documentation, I've gathered the following steps.

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

                Are they correct, and could you answer the two questions in them?

                1. 在 Google API 控制台中创建一个服务帐户.
                2. 将提供给我的私钥(在哪里?肯定不在我的代码中/设备上保存为 此示例代码建议)
                3. 使用 适用于 Java 的 Google APIs 客户端库 创建 JWT 并使用私有密钥(如何?文档给我这个,但那不是 Java 代码……我该怎么处理它?)
                4. 构造访问令牌请求,并获取对 API 的访问权限
                5. 应用程序现在可以向 API 发送 GET 请求以查找出是否用户订阅了
                6. 访问令牌过期后,返回第 3 步.
                1. Create a Service Account in the Google APIs Console.
                2. Save the private key that is given to me (where? surely not in my code/on the device as this sample code suggests)
                3. Use Google APIs Client Library for Java to create and sign a JWT with the private key (how? the docs give me this, but that is not Java code... What do I do with it?)
                4. Construct an access token request, and get access to the API
                5. Application can now send a GET request to the API to find out whether or not the user has a subscription
                6. When the access token expires, go back to step 3.

                另外,我有一个 Web 服务,虽然我对 Web 服务或 Web 服务编程一无所知...我只知道足够了解它可能需要在这里使用.

                Also, I have a web service, though I know nothing about web services or web service programming... I only know enough to be aware that it is probably necessary to use here.

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

                推荐答案

                事实证明,我的步骤不正确.我花了几个星期才弄清楚这一点,而且似乎没有在其他任何地方记录下来.不客气:

                As it turns out, my steps were not correct. It took me weeks to figure this out and it doesn't seem to be documented anywhere else. You're welcome:

                1. 在 Google API 控制台<中创建 Web 应用程序 帐户/a>.将任何网站作为重定向 URI";没关系,因为您不会真正使用它.创建帐户时,您将获得一个客户端 ID 和客户端密码.

                1. Create a Web Application account in the Google APIs Console. Put any website as a "redirect URI"; it doesn't matter since you will not really be using it. You will get a client id and client secret when you create the account.

                在您计算机上的浏览器中,转到 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] 并在出现提示时允许访问.

                In a browser on your computer go to 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] and allow access when prompted.

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

                Look in the address bar. At the end of the URI you entered originally will be your refresh token. It looks like 1/.... You will need this "code" in the next step. The refresh token never expires.

                转至 https://accounts.google.com/o/oauth2/token?client_id=[YOUR CLIENT ID]&client_secret= 将此代码"转换为刷新令牌"[您的客户机密]&code=[上一步的代码]&grant_type=authorization_code&redirect_uri=[YOUR REDIRECT URI].您可以将结果值保存在程序中;除非明确撤销,否则它永远不会过期.(@BrianWhite 插入的这一步——见评论)确保您使用的是 POST.(由 Gintas 插入)

                Convert this "code" to a "refresh token" by going to 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]. You can save the resulting value right in your program; it never expires unless explicitly revoked. (this step inserted by @BrianWhite -- see comments) Make sure you are using POST.(inserted by Gintas)

                在您的代码中,使用 BasicNameValuePairs "grant_type","refresh_token" 向 https://accounts.google.com/o/oauth2/token 发送 HttpPost 请求, "client_id",[YOUR CLIENT ID], "client_secret",[YOUR CLIENT SECRET], "refresh_token",[YOUR REFRESH TOKEN].有关示例,请查看此处.您将需要在单独的线程中执行此操作,可能使用 AsyncTask.这将返回一个 JSONObject.

                In your code, send an HttpPost request to https://accounts.google.com/o/oauth2/token with the BasicNameValuePairs "grant_type","refresh_token", "client_id",[YOUR CLIENT ID], "client_secret",[YOUR CLIENT SECRET], "refresh_token",[YOUR REFRESH TOKEN]. For an example look here. You will need to do this in a separate thread, probably using AsyncTask. This will return a JSONObject.

                从返回的 JSONObject 中获取访问令牌.有关示例,请查看此处.您将需要获取字符串access_token".访问令牌将在 1 小时后过期.

                Get the access token from the returned JSONObject. For an example look here. You will need to get the string "access_token". The access token expires in 1 hour.

                在您的代码中,向 https://www.googleapis.com/androidpublisher/v1/applications/[YOUR APP'S PACKAGE NAME]/subscriptions/[THE ID OF YOUR PUBLISHED SUBSCRIPTION] 发送 HttpGet 请求从您的 Android 开发者控制台]/purchases/[用户在购买订阅时收到的购买令牌]?accesstoken="[第 4 步的访问令牌]".示例请看这里.

                In your code, send an HttpGet request to 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]". For an example look here.

                这篇关于我是否获得了验证用户的 Android 应用内订阅的正确步骤?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持跟版网!

                本站部分内容来源互联网,如果有图片或者内容侵犯了您的权益,请联系我们,我们会在确认后第一时间进行删除!

                相关文档推荐

                Android - Is it possible to get install referrer programmatically(Android - 是否有可能以编程方式安装引荐来源网址)
                How to sign an APK with more than one certificate?(如何使用多个证书签署 APK?)
                versionCode vs versionName in Android Manifest(Android Manifest 中的 versionCode 与 versionName)
                What does this Google Play APK publish error message mean?(这个 Google Play APK 发布错误消息是什么意思?)
                Lost my keystore for uploaded app on android market(丢失了我在 android 市场上上传的应用程序的密钥库)
                App on Google Play always shows quot;Updatequot; instead of open(Google Play 上的应用程序总是显示“更新;而不是打开)
                <tfoot id='veZ7x'></tfoot>

                <small id='veZ7x'></small><noframes id='veZ7x'>

                    <tbody id='veZ7x'></tbody>

                    • <bdo id='veZ7x'></bdo><ul id='veZ7x'></ul>

                      <legend id='veZ7x'><style id='veZ7x'><dir id='veZ7x'><q id='veZ7x'></q></dir></style></legend>
                    • <i id='veZ7x'><tr id='veZ7x'><dt id='veZ7x'><q id='veZ7x'><span id='veZ7x'><b id='veZ7x'><form id='veZ7x'><ins id='veZ7x'></ins><ul id='veZ7x'></ul><sub id='veZ7x'></sub></form><legend id='veZ7x'></legend><bdo id='veZ7x'><pre id='veZ7x'><center id='veZ7x'></center></pre></bdo></b><th id='veZ7x'></th></span></q></dt></tr></i><div id='veZ7x'><tfoot id='veZ7x'></tfoot><dl id='veZ7x'><fieldset id='veZ7x'></fieldset></dl></div>