Flutter Android: невозможно получить продукты в приложении из Google Play

В настоящее время я сталкиваюсь с проблемой, когда моему приложению Flutter не удается получить расходные материалы в приложении из магазина Google Play. Однако мое приложение может получать все продукты из магазина приложений Apple.

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

Для Android я предпринял следующие шаги по настройке.

  1. Я настроил свою консоль Google Play и учетную запись разработчика
  2. Выполнены все задачи в разделе «Настройка приложения».
  3. Сгенерировал файл хранилища ключей для подписи моего приложения keytool -genkey -v -keystore c:\Users\USER_NAME\key.jks -storetype JKS -keyalg RSA -keysize 2048 -validity 10000 -alias key
  4. Создал файл с именем /android/key.properties, который содержит ссылку на мой файл хранилища ключей. Содержимое этого файла выглядит следующим образом:
storePassword=<password from previous step>
keyPassword=<password from previous step>
keyAlias=key
storeFile=<location of the key store file, such as /Users/<user name>/key.jks>
  1. Настроил мой файл build.gradle, чтобы включить следующее
def keystoreProperties = new Properties()
def keystorePropertiesFile = rootProject.file('key.properties')
if (keystorePropertiesFile.exists()) {
   keystoreProperties.load(new FileInputStream(keystorePropertiesFile))
}
android {
   signingConfigs {
       release {
           keyAlias keystoreProperties['keyAlias']
           keyPassword keystoreProperties['keyPassword']
           storeFile keystoreProperties['storeFile'] ? file(keystoreProperties['storeFile']) : null
           storePassword keystoreProperties['storePassword']
       }
   }
   buildTypes {
       release {
           signingConfig signingConfigs.release
       }
   }
}
  1. Создал набор приложений и опубликовал его под закрытой дорожкой flutter build appbundle --flavor prod --release. Я также позволил Google подписать мое приложение «Google подписывает приложение», когда загружал артефакт.

  2. Я добавил тестера, который не связан с учетной записью разработчика, и добавил то же электронное письмо в разделе «Тестирование лицензии» с ответом на лицензию «RESPOND_NORMALLY».

  3. Я также создал три расходных продукта и сделал их активными.

Ниже показан мой код, который извлекает продукты.

  List<String> _kProductIds = <String>[
    'my_app_premium_year_c',
    'my_app_premium_month_c',
    'my_app_premium_week_c'
  ];
final ProductDetailsResponse productResponse =
        await InAppPurchase.instance.queryProductDetails(_kProductIds.toSet());

Ниже показаны неожиданные результаты, которые я получаю. То есть все мои продукты находятся в списке notFoundIDs. [my_app_premium_year_c, my_app_premium_month_c, my_app_premium_week_c]

Я ожидаю, что список notFoundIDs будет пустым при включении следующего кода print("ProductIDs not found: ${productResponse.notFoundIDs}");

Любые подсказки или предложения будут высоко оценены.

Обновлено: На следующем снимке экрана показана моя страница продуктов в приложении на консоли Google. Я скрыл некоторые идентификаторы, чтобы защитить свою конфиденциальность, однако идентификаторы продуктов на снимке экрана совпадают с идентификаторами продуктов в моем коде. Flutter Android: невозможно получить продукты в приложении из Google Play

На следующем снимке экрана показано, как мое приложение опубликовано в закрытой альфа-версии. Flutter Android: невозможно получить продукты в приложении из Google Play

правильно ли указано ваше имя продукта? как насчет скриншота

ch271828n 02.04.2022 05:18

Да, это правильно. Он точно соответствует всем трем продуктам.

dporth 02.04.2022 07:04

не могли бы вы предоставить несколько скриншотов консоли google

ch271828n 02.04.2022 10:19

@ ch271828n Обновлен скриншотом.

dporth 02.04.2022 18:24

Мое приложение даже не может найти продукт с идентификатором android.test.purchased. Разве этот продукт не настроен и не доступен автоматически?

dporth 02.04.2022 23:24

хм, не могли бы вы использовать сетевые инструменты для изучения сетевого трафика? (даже если вы используете https, есть некоторые инструменты для его расшифровки или перехвата флаттера HttpClient и т. д.). Вставьте сюда необработанный сетевой трафик (возможно, HTTP-запрос и ответ), чтобы увидеть, что конечно отправляется в Google.

ch271828n 03.04.2022 02:14

Имеет ли значение, что продукты в приложении были созданы до того, как первый пакет был загружен на тестовую версию?

dporth 03.04.2022 06:07

Я не уверена. Почему я говорю о сетевом трафике, так это то, что вы используете обернутый API (InAppPurchase), в котором могут быть незаметные ошибки. Итак, нам нужно изучить необработанные данные (необработанный HTTP-запрос), которые отправляются в Google.

ch271828n 03.04.2022 07:11

Ок имеет смысл. Всегда есть вероятность ошибок, но может быть важно знать, что это собственная библиотека, официально поддерживаемая Flutter. В любом случае, мне удалось собрать довольно много пакетов, отправленных между Google Play и моим приложением через Wireshark. Я сохранил пакеты с использованием протокола DNS и последующие пакеты с использованием протокола QUIC. Я не уверен, как извлечь много информации из этих пакетов.

dporth 03.04.2022 07:25

Ну это должен быть HTTP/HTTPS. Поищи про это - как вытащить https

ch271828n 03.04.2022 10:43

Проверьте это может помочь. stackoverflow.com/questions/16547984/…!

Mukund Jogi 03.04.2022 10:53
6
11
198
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Проблема наконец решена. Вам нужно вызвать метод InAppPurchase isAvailable() перед queryProductDetails() на платформе Android. Я не уверен, почему вам не нужно делать то же самое на платформе IOS.

В документации прямо не указывалось на необходимость этого, но пусть будет так, что запрос продуктов ПОСЛЕ проверки доступности магазина устранил мою проблему на Android.

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