Получение недействительного гранта на OAuth2 запрос на отправку кода авторизации для подтверждения покупки Google Play Billing - PullRequest
0 голосов
/ 18 октября 2018

Я пытаюсь осуществить проверку покупки в своем бэкэнде, как рекомендую Документы Google-Play-Billing .Следуя этой документации для подтверждения покупки подписки, он говорит мне, что я должен сделать запрос на получение этого URL ( Purchases.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, загруженного из Google API Console .Я успешно получил свой первоначальный токен обновления и поместил его в свой код бэкенда.

Теперь цель состоит в том, чтобы сделать успешную покупку в моем приложении для 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 Ответ

0 голосов
/ 19 октября 2018

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...