Android LVL и InAppBilling: как выбрать текущую учетную запись пользователя для покупки?

Я использую Google LVL и Google Inapp Billing API ver 3 в своем приложении java для Android. Конечно, я использую (слегка измененный) проект библиотеки LVL из дополнений Google и банку IAP, который предлагает Google.

Библиотека лицензии LicenseValidator в verifyLicense получает ResponseData с идентификатором пользователя в нем. В документах Google говорится, что это уникальный идентификатор пользователя, представляющий учетную запись пользователя google, используемую для покупки. Поэтому я предположил (и убедился в тестах), что это одна и та же строка (например, «ANlOH <…> ppA ==») на всех устройствах, где пользователь вошел в систему с той же учетной записью Google.

Итак, вот моя схема защиты iap-покупки короче.


Перед приложением покупки отправляет идентификатор пользователя на мой сервер. Он генерирует зашифрованную полезную нагрузку от идентификатора пользователя и отправляет ее обратно. Приложение делает запрос на покупку и помещает в него полезную нагрузку. Приложение получает квитанцию, подписанную Google, которая имеет ту же полезную нагрузку. Приложение отправляет эту квитанцию ​​на мой сервер с текущим идентификатором пользователя. Сервер выполняет подписи и другие проверки, сравнивает идентификаторы пользователей с полезной нагрузкой и отправителем, и если все нормально отправляет файлы приложения iap в приложение.

В другом случае, когда пользователь переустанавливает приложение на это или другое устройство, приложение получает квитанции, принадлежащие ему от InAppBilling, отправляет их на мой сервер с текущим идентификатором пользователя. Сервер выполняет те же проверки и – если все в порядке – отправляет все необходимые файлы в приложение.


Такой подход с небольшими отличиями хорошо работает на других платформах. Но в последнее время я испытываю некоторые странные сбои в приложении для Android. В моем журнале регистрируются проблемы с проверкой чеков, и я обнаружил странные ошибки: пользователь с одним идентификатором пользователя отправил правильно подписанные квитанции, принадлежащие другому идентификатору пользователя (полезная нагрузка в квитанции содержит другой идентификатор пользователя). Когда я начал исследовать, я обнаружил, что одна из таких странных «хакерских атак» относится к одному из моих тестовых устройств, в то время как другие принадлежат реальным пользователям (в соответствии с идентификаторами заказа в квитанциях).

В этом тестовом устройстве с Android 4.4.2 есть несколько учетных записей google, добавленных в «Настройки». Раньше я был уверен, что Google использует первую учетную запись. Я видел такие сообщения журнала:

InAppBillingUtils.getPreferredAccount: com.mypackage.appname: Account from first account - [jbC...FgH] 

Но теперь я вижу, что иногда LVL использует не первый аккаунт, а другой. Я вижу такие сообщения в LogCat:

 InAppBillingUtils.pickAccount: smpxg.mythdefdf: Account determined from library ownership - [boL...M5E] 

Более того, после новой установки моего приложения InAppBilling возвратил квитанции для одной учетной записи, но LVL дал идентификатор пользователя другого ! Но это поведение нестабильно. Например, теперь я вижу, что LVL и InAppBilling считают, что вторая учетная запись является моей основной и работает с ней, как и ожидалось.

Я предположил, что обе библиотеки будут работать бок о бок, но похоже, что я ошибался. Очевидно, когда приложение отправляет квитанцию, принадлежащую идентификатору пользователя «… yUQ» вместе с текущим идентификатором использования «… ppA», сервер отказывается отправлять приобретенный контент. И он прав.

Если пользователь может изменить текущий аккаунт, используемый для покупок, я бы просто добавил этот трюк в FAQ. НО Я не вижу способа выбрать его вручную в настройках. Кроме того, система каким-то образом выбирает его случайным образом! Единственный способ заставить все работать – попросить пользователя удалить все учетные записи с устройства, кроме его основного, но это плохое решение.

Когда пользователь покупает элемент iap, который регистрируется в одной учетной записи, а затем переключается на другую учетную запись, он должен ожидать, что не увидит купленный товар. Это предсказуемое поведение, как при покупке приложений. Но он даже не знает, какая учетная запись используется в данный момент!

AFAIK, не существует способа получить от пользователя InAppBilling сервиса google user-id, который он выбрал для покупок. Но даже если бы я мог – если пользовательский идентификатор случайно менялся, система заставляла элементы iap появляться и время от времени исчезать 🙂

Похоже, Google советует использовать полезную нагрузку разработчика для защиты, но не дает никакого стабильного идентификатора, который может использоваться для идентификации конкретной учетной записи.

Поэтому мои вопросы:

  1. Кто-нибудь испытывает эту странную переключение учетной записи?
  2. Как я могу узнать, какая учетная запись является текущей?
  3. Есть ли способ синхронизировать выбор учетной записи LVL и InAppBilling? Любые обходные пути?

Заранее спасибо!

    У меня не было точного опыта с вашей проблемой, но это может быть несколько актуальным

    Согласно документации по выставлению счетов In

    Если устройство имеет более одной учетной записи, покупка будет производиться с учетной записью, загружающей приложение. Если ни одна из учетных записей не загрузила приложение, покупка производится с первой учетной записью. Пользователи могут подтвердить учетную запись, которая совершает покупку, путем расширения диалогового окна покупки.