java - 谷歌 androidpublish api access_token

标签 java android in-app-purchase

我正在开发一款支持 Google Play 应用内购买的 Android 应用。我还有一个在后台运行的服务器应用程序 (JAVA)。每当用户在应用程序中成功购买(购买正常)时,服务器应用程序应向 Google play 发送请求以验证购买。

Google Play 为此提供了 androidpublisher api: developers.google.com/android-publisher/getting_started

问题是 access_token。每当我获得新的 access_token(使用刷新或新 token 请求方法)时,如果我尝试使用 GET 方法从 Google Play 商店(https://developers.google.com/android-publisher/v1/purchases/get)的购买 inapp 项目中询问信息,它就不起作用-> 它总是导致错误 401(无效凭证)或 403(访问未配置)。

经过无数次尝试,我发现我只能使用该链接获得方法:https://developers.google.com/apis-explorer/#p/androidpublisher/v1.1/androidpublisher.inapppurchases.get ,我只能从那里读取 valid access_token ,并且只有使用该 token 我才能让我的服务器应用程序工作但只能运行一个小时,1 小时后我必须再次执行相同的步骤.. .

现在我真的需要一种正确的方法来为我的应用程序获取有效的 access_token

我在互联网上进行了很多研究,但找不到有用的东西。 我知道我不是唯一遇到这个问题的人,也许你们中有人知道该怎么做或者已经有过这个问题

最佳答案

您可以使用 com.google.api-clientgoogle-api-services-androidpublisher 库。

首先转到谷歌开发者控制台上的项目(https://console.developers.google.com)

  • API 和授权 -> API
  • 启用“Google Play Android 开发者 API”
  • 转到凭据 -> 创建新的客户端 ID
  • 选择服务帐号
  • 创建客户 ID
  • 将 p12 文件保存在安全的地方

然后将刚刚为服务帐户生成的电子邮件地址添加到您的 google play 开发者控制台 (https://play.google.com/apps/publish/)

  • 设置 -> 用户帐户和权限 -> 邀请新用户
  • 粘贴 @developer.gserviceaccount.com 电子邮件帐户
  • 选择“查看财务报告”
  • 发送邀请

现在到代码。将以下依赖项添加到您的 pom.xml 文件中:

<dependency>
    <groupId>com.google.api-client</groupId>
    <artifactId>google-api-client</artifactId>
    <version>1.18.0-rc</version>
</dependency>
<dependency>
    <groupId>com.google.http-client</groupId>
    <artifactId>google-http-client-jackson2</artifactId>
    <version>1.18.0-rc</version>
</dependency>
<dependency>
    <groupId>com.google.apis</groupId>
    <artifactId>google-api-services-androidpublisher</artifactId>
    <version>v1.1-rev25-1.18.0-rc</version>
</dependency>

然后先验证签名:

byte[] decoded = BASE64DecoderStream.decode(KEY.getBytes());
KeyFactory keyFactory = KeyFactory.getInstance("RSA");
PublicKey publicKey = keyFactory.generatePublic(new X509EncodedKeySpec(decoded));
Signature sig = Signature.getInstance("SHA1withRSA");
sig.initVerify(publicKey);
sig.update(signedData.getBytes());
if (sig.verify(BASE64DecoderStream.decode(signature.getBytes())))
{
    // Valid
}

如果签名验证获取订阅细节:

// fetch signature details from google
HttpTransport httpTransport = GoogleNetHttpTransport.newTrustedTransport();
JsonFactory jsonFactory = JacksonFactory.getDefaultInstance();
GoogleCredential credential = new GoogleCredential.Builder()
    .setTransport(httpTransport)
    .setJsonFactory(jsonFactory)
    .setServiceAccountId(ACCOUNT_ID)
    .setServiceAccountScopes(Collections.singleton("https://www.googleapis.com/auth/androidpublisher"))
    .setServiceAccountPrivateKeyFromP12File(new File("key.p12"))
    .build();

AndroidPublisher pub = new AndroidPublisher.Builder(httpTransport, jsonFactory, credential)
    .setApplicationName(APPLICATION_NAME)
    .build();
AndroidPublisher.Purchases.Get get = pub.purchases().get(
    APPLICATION_NAME,
    PRODUCT_ID,
    token);
SubscriptionPurchase subscription = get.execute();
System.out.println(subscription.toPrettyString());

这将通过生成 JWT token 来解决所有 token 问题,因此您不必自己处理。

关于java - 谷歌 androidpublish api access_token,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21111518/

相关文章:

java - 从 ArrayNode 中删除 element.field

java - 受信任的网络 Activity 无法启动 Activity ComponentInfo 服务 Intent 必须是明确的 : Intent

android - onHandleWork 从未收到来自 pendingintent 地理围栏的 Intent

ios - 使用 Device token 或 Apple ID 进行应用内购买

ios - Apple IAP 实体商品折扣

java - 什么集合最适合实现该计划?

java - XML 解析器获取 null

java - 在多屏幕设置中的 Activity 屏幕或监视器上打开 JavaFX 应用程序

android - Android 中 Activity 之间的 3D 动画

delphi - 带有应用内购买功能的Delphi XE2 iOS应用