【问题标题】:How to get Purchases.subscriptions: Details in Android如何获取 Purchases.subscriptions:Android 中的详细信息
【发布时间】:2017-09-24 16:54:34
【问题描述】:

我在我的移动应用中实现了应用内结算。它使用自动续订订阅。我想通过应用程序检查订阅到期日期。我找到了这个链接来查看订阅详情:Purchases.subscriptions:get

文档显示需要一些授权。我已经尝试过,但我无法得到结果。我得到了客户端 secret.json 文件,但它不包含客户端密钥 ID。所以请帮我获取订阅到期日期。

【问题讨论】:

    标签: android in-app-billing subscription


    【解决方案1】:

    我的回答迟了,但也许它可以帮助其他人。在这里查看我的答案:Server side authorization with Google Play Developer API?

    这些是您手动执行的步骤:

    1.) 使用以下链接在 Google API 中的 OAuth2 配置中创建凭据:https://developers.google.com/mobile/add?platform=android&cntapi=signin&cnturl=https:%2F%2Fdevelopers.google.com%2Fidentity%2Fsign-in%2Fandroid%2Fsign-in%3Fconfigured%3Dtrue&cntlbl=Continue%20Adding%20Sign-In

    2.) 转到您的开发人员 API 控制台。如果您正确完成了第一步,结果应该如下所示:

    3.) 转到 Google Play Developer Console -> All Apps -> Settings -> API Access 并链接您在 Developer API Console 中定义的项目(步骤 2,左上角的黑条)。 (如果您无法在 Google Play 中链接您的项目,因为您没有找到一些,您使用了不同的 Google 帐户用于 Google Developer API 和 Google Play Developer Console。)

    4.) 使用您的回调网址调用以下链接: https://accounts.google.com/o/oauth2/auth?scope=https://www.googleapis.com/auth/androidpublisher&response_type=code&access_type=offline&redirect_uri=http://www.yourdomain.com/oauth2callback&client_id=[WEBAPPLICATION_ID_FROM_ABOVE.apps.googleusercontent.com]
    我的 /oauth2callback 脚本是一个简单的 php 脚本。 (这不是生产安全的。这只是为了说明):

    oauth2callback.php

    <?php
    print_r($_REQUEST);
    ?>
    

    5.) 从上面调用 url 后,系统会要求您提供 google 帐户和访问 api 的权限。确认后,您将被重定向到您的回调 url 并获得如下所示的结果:

    4/vPv_eYX-az6YucwdpBzATpJEu8129gN9aYsUIMI3qgQ

    6.)¹ 通过使用以下标头向 https://accounts.google.com/o/oauth2/token 调用 POST 请求,获取 oauth2 访问令牌和刷新令牌:

    grant_type=authorization_code
    code=4/vPv_eYX-az6YucwdpBzATpJEu8129gN9aYsUIMI3qgQ
    client_id=[YOUR_WEBAPPLICATIONID.apps.googleusercontent.com]
    client_secret=[YOUR CLIENT SECRET OF THIS WEBAPPLICATION ID]
    redirect_uri=http://www.yourdomain.com/oauth2callback
    

    (在第 2 步的开发者控制台中单击 OAuth2 客户端 ID 的 Web 客户端 ID 时,可以找到客户端密码)

    结果将如下所示:

    {
        "access_token": "ya29.GdsCBbnM584k3SUzoxDgIdaY26pEM_p_AdhkIkFq3tsai8U7x8DuFKq3WEF7KquxkdLO89KHpuUFdJOgkhpGbGyDfxkD32bK1ncnsu2IkA0e_5ZayOEr86u4A1IN",
        "expires_in": 3600,
        "refresh_token": "1/U5HF1m0nHQwZaF2-X35f_xyFaSOofdw3SEubnkkYUQ0",
        "token_type": "Bearer"
    }
    

    7.) 调用 Google Developer API 请求需要访问令牌,例如:https://www.googleapis.com/androidpublisher/v2/applications/[packageName]/purchases/subscriptions/subscriptionId/tokens/[purchaseToken]?access_token=ya29.GdsCBbnM584k3SUzoxDgIdaY26pEM_p_AdhkIkFq3tsai8U7x8DuFKq3WEF7KquxkdLO89KHpuUFdJOgkhpGbGyDfxkD32bK1ncnsu2IkA0e_5ZayOEr86u4A1IN

    8.) 访问令牌很快就会过期。通过刷新,您可以使用以下 url 和标头获取新的访问令牌: 发布 https://accounts.google.com/o/oauth2/token

    grant_type=refresh_token
    client_secret=[YOUR CLIENT SECRET]
    refresh_token=1/U5HF1m0nHQwZaF2-X35f_xyFaSOofdw3SEubnkkYUQ0
    client_id=[YOUR_WEBAPPLICATION_ID.apps.googleusercontent.com]
    

    结果:

    {
        "access_token": "ya29.GlsCBZuN7hYJILi5VaVggIsCIb1_5feGvcjvQFmJRnPYXsnhsi_w3Md87tQwGd_WXmifo4s5739c3IU5INPmby8q64k0LdDFkO2JpNRG13K9sizvU1Sc-3cWzbf8",
        "expires_in": 3600,
        "token_type": "Bearer"
    }
    

    提示 (1):如果您没有从第 6 步的请求中获得刷新令牌,请将以下查询参数附加到您的请求中:prompt=consent

    【讨论】:

    • 你的回答太棒了!非常感谢
    【解决方案2】:

    我也为此苦苦挣扎,但至少我找到了需要做的事情。

    Google 提供了一个 Android 库 google-api-services-androidpublishe,可用于访问 Purchase.Subscription.Get API。

    implementation 'com.google.apis:google-api-services-androidpublisher:v3-rev74-1.25.0'
    

    这是一个 Kotlin 代码示例:

    import com.google.api.client.http.apache.ApacheHttpTransport
    import com.google.api.client.json.jackson2.JacksonFactory
    import com.google.api.services.androidpublisher.AndroidPublisher
    ...
    
    fun retrieveSubscriptionInfo(sku: String) {
    
       val packageName = ""
       val sku = ""
       val purchasedSubscriptionToken = ""
    
       val apacheHttpTransport = ApacheHttpTransport()
       val jacksonJsonFactory = JacksonFactory.getDefaultInstance()
    
       val AndroidPublisher.Builder(apbacheHttpTransport, jacksonJsonFactory, null).build()
    
       val request = publisher.Purchases().subscriptions().get(packageName, sku, purchasedSubscriptionToken);
    
       return request.execute()
    }        
    

    请注意,在执行上述代码之前,您必须先授权AndroidPublisher。您必须请求用户权限才能查询Purchase.Subscription.Get

    希望对您有所帮助。

    【讨论】:

    • 能否请您告诉如何授权Androidpublisher。我读了很多,但它有点混乱!提前致谢
    • 如何获得购买的SubscriptionToken?
    • 购买令牌由 Google Play 返回。
    • @NewestStackOverflowUser 如何授权 AndroidPublisher ?你能简单介绍一下吗..
    • @Jay Rathod RJ 据我了解,您需要实现 google 的 OAuth 流程。您可以查看涉及该主题的这篇文章:stackoverflow.com/questions/52471362/… 但请注意,该 API 通常旨在供后端服务使用,而不是由 android 应用程序使用。为了支持在 android 中购买,您可以使用 google 提供的计费库,而无需实现授权流程。
    猜你喜欢
    • 1970-01-01
    • 2016-09-24
    • 1970-01-01
    • 1970-01-01
    • 2015-11-14
    • 2014-10-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多