Получение недействительного гранта на OAuth2 запрос на отправку кода авторизации для подтверждения покупки Google Play Billing

Я пытаюсь внедрить подтверждение покупки в своем бэкэнде, как рекомендуют документы Google-Play-Billing. Следуя этой документации по подтверждению покупки подписки, она говорит мне, что я должен сделать запрос на получение этого URL ( Buyases.subscription: get) с именем пакета моего приложения для Android, subscription_id и токеном покупки. Однако прежде чем я смогу сделать запрос на получение этого URL-адреса, я должен авторизовать свой внутренний сервер для запросов API. Итак, перейдя по ссылке в этой документации здесь, я начал следовать этим шагам. Я создал идентификатор клиента OAuth 2.0, а затем сгенерировал начальный токен обновления, перейдя по следующему URL в моем браузере. Мой client_id был установлен на мой идентификатор клиента OAuth 2.0, который был только что сгенерирован, а мой redirect_uri был установлен на urn: ietf: wg: oauth: 2.0: oob, который я получил из файла JSON, который я скачал из консоли API Google. Я успешно получил свой первоначальный токен обновления и поместил его в свой код бэкэнда.

Теперь цель состоит в том, чтобы сделать успешную покупку в моем приложении для Android, а затем отправить запрос в мой бэкэнд с необходимыми параметрами. Эта часть работает просто отлично. Однако, следуя следующим шагам в документации по авторизации, в части, где говорится " Обменять этот код для пары токенов доступа и обновления, отправив запрос POST в... ", чтобы получить свой код доступа, я устанавливаю поля на то, что документы говорят, чтобы установить поля, но мой запрос возвращается как ошибка 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));
        }
    }
}

Пожалуйста помоги!

1 ответ

Хорошо, я понял мою проблему. Мне нужно быстрее выполнить первый пост-запрос для обмена начального refresh_token и access_code и нового refresh_token. Этот новый refresh_token станет моим постоянным refresh_token для всех будущих запросов API. Моя проблема заключалась в том, что срок действия первоначального файла refresh_token истек до того, как я сделал свой первоначальный пост-запрос. Я не предполагал, что он истечет через 1 час, и поэтому я продолжал использовать тот же начальный refresh_token, даже не подозревая, что срок его действия истек.

Я выполнил остальные шаги в документации Google, и теперь мой внутренний сервер успешно проверяет мои покупки в приложении.

Другие вопросы по тегам