0

我正在尝试按照Google-Play-Billing 文档的建议在后端实施购买验证。遵循此用于订阅购买验证的文档,它告诉我必须使用我的 android 应用程序包名称subscription_id购买令牌向该 URL ( Purchase.subscriptions: get ) 发出获取请求。但是,在我可以向该 URL 发出 get 请求之前,我必须授权我的后端服务器处理 API 请求。因此,按照该文档中的链接到此处,我开始执行这些步骤。我创建了一个OAuth 2.0 客户端 ID,然后通过转到浏览器中的下一个 url 生成初始刷新令牌。我的client_id设置为我刚刚生成的OAuth 2.0 客户端 ID,我的redirect_uri设置为urn:ietf:wg:oauth:2.0:oob,这是我从我从Google API Console下载的 JSON 文件中收到的。我成功检索了我的初始刷新令牌并将其放入我的后端代码中。

现在的目标是在我的 android 应用程序中成功购买,然后使用必要的参数向我的后端发送一个发布请求。这部分工作得很好。但是,在执行授权文档的后续步骤时,它说“通过发送 POST 请求来交换此代码以获取访问和刷新令牌对... ”以获取我的access_code,我设置了字段对于文档所说的将字段设置为的内容,但我的请求以 400 错误的形式返回,并显示错误消息:“ invalid_grant ”。我不明白为什么我会收到此错误。

这是我的帖子请求代码:

List <NameValuePair> parameters = new ArrayList <>();
parameters.add(new BasicNameValuePair("grant_type", "authorization_code"));
parameters.add(new BasicNameValuePair("code", initial_code));
parameters.add(new BasicNameValuePair("client_id", client_id));
parameters.add(new BasicNameValuePair("client_secret", client_secret));
parameters.add(new BasicNameValuePair("redirect_uri", redirect_uri));

RequestConfig requestConfig = RequestConfig.custom().setCookieSpec(CookieSpecs.IGNORE_COOKIES).build();
HttpClientBuilder httpClientBuilder = HttpClients.custom().setDefaultRequestConfig(requestConfig);

try (CloseableHttpClient httpClient = httpClientBuilder.build()) {
    HttpPost request = new HttpPost("https://accounts.google.com/o/oauth2/token");
    request.addHeader("content-type", "application/x-www-form-urlencoded");
    request.setEntity(new UrlEncodedFormEntity(parameters));

    try (CloseableHttpResponse response = httpClient.execute(request)) {
        HttpEntity entity = response.getEntity();
        final StatusLine statusLine = response.getStatusLine();
        if (entity != null) {
            System.out.println("Response returned: " + statusLine.getStatusCode() + " - " + EntityUtils.toString(entity));
        }
    }
}

请帮忙!

4

1 回答 1

0

好的,我发现了我的问题。我需要更快地发出第一个发布请求以交换初始 refresh_token 和 access_code 以及新的 refresh_token。新的 refresh_token 最终将成为我所有未来 api 请求的永久 refresh_token。我的问题是,在我发出初始发布请求之前,初始 refresh_token 一直过期。我没有意识到它会在 1 小时内过期,所以我一直使用相同的初始 refresh_token 却没有意识到它已经过期。

我按照谷歌文档上的其余步骤进行操作,现在我的后端服务器正在成功验证我的应用内订阅购买。

于 2018-10-19T00:19:38.710 回答