В настоящее время я сталкиваюсь с проблемой, когда моему приложению Flutter не удается получить расходные материалы в приложении из магазина Google Play. Однако мое приложение может получать все продукты из магазина приложений Apple.
Я не могу определить, какой шаг я пропустил или почему не найдены все идентификаторы моих продуктов. Я использую модуль покупки в приложении флаттера для облегчения покупок приложений.
Для Android я предпринял следующие шаги по настройке.
keytool -genkey -v -keystore c:\Users\USER_NAME\key.jks -storetype JKS -keyalg RSA -keysize 2048 -validity 10000 -alias keystorePassword=<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>
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
}
}
}
Создал набор приложений и опубликовал его под закрытой дорожкой flutter build appbundle --flavor prod --release. Я также позволил Google подписать мое приложение «Google подписывает приложение», когда загружал артефакт.
Я добавил тестера, который не связан с учетной записью разработчика, и добавил то же электронное письмо в разделе «Тестирование лицензии» с ответом на лицензию «RESPOND_NORMALLY».
Я также создал три расходных продукта и сделал их активными.
Ниже показан мой код, который извлекает продукты.
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. Я скрыл некоторые идентификаторы, чтобы защитить свою конфиденциальность, однако идентификаторы продуктов на снимке экрана совпадают с идентификаторами продуктов в моем коде.

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

Да, это правильно. Он точно соответствует всем трем продуктам.
не могли бы вы предоставить несколько скриншотов консоли google
@ ch271828n Обновлен скриншотом.
Мое приложение даже не может найти продукт с идентификатором android.test.purchased. Разве этот продукт не настроен и не доступен автоматически?
хм, не могли бы вы использовать сетевые инструменты для изучения сетевого трафика? (даже если вы используете https, есть некоторые инструменты для его расшифровки или перехвата флаттера HttpClient и т. д.). Вставьте сюда необработанный сетевой трафик (возможно, HTTP-запрос и ответ), чтобы увидеть, что конечно отправляется в Google.
Имеет ли значение, что продукты в приложении были созданы до того, как первый пакет был загружен на тестовую версию?
Я не уверена. Почему я говорю о сетевом трафике, так это то, что вы используете обернутый API (InAppPurchase), в котором могут быть незаметные ошибки. Итак, нам нужно изучить необработанные данные (необработанный HTTP-запрос), которые отправляются в Google.
Ок имеет смысл. Всегда есть вероятность ошибок, но может быть важно знать, что это собственная библиотека, официально поддерживаемая Flutter. В любом случае, мне удалось собрать довольно много пакетов, отправленных между Google Play и моим приложением через Wireshark. Я сохранил пакеты с использованием протокола DNS и последующие пакеты с использованием протокола QUIC. Я не уверен, как извлечь много информации из этих пакетов.
Ну это должен быть HTTP/HTTPS. Поищи про это - как вытащить https
Проверьте это может помочь. stackoverflow.com/questions/16547984/…!
Проблема наконец решена. Вам нужно вызвать метод InAppPurchase isAvailable() перед queryProductDetails() на платформе Android. Я не уверен, почему вам не нужно делать то же самое на платформе IOS.
В документации прямо не указывалось на необходимость этого, но пусть будет так, что запрос продуктов ПОСЛЕ проверки доступности магазина устранил мою проблему на Android.
правильно ли указано ваше имя продукта? как насчет скриншота