Получение недействительного гранта на 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, и теперь мой внутренний сервер успешно проверяет мои покупки в приложении.