Ошибка Google Play при совершении покупки при внедрении плагина Soomla Unity3d

Я создаю приложение, которое реализует плагин Soomla Unity IAP. В моих усилиях заставить IAP работать, я дошел до того, что могу сделать покупку в редакторе. (Не настоящая покупка, она просто обновляет виртуальную валюту, которую пользователь может купить / потратить в игре).

Когда я запускаю это на устройстве Android, я получаю эту ошибку: требуется аутентификация. Вам нужно войти в свою учетную запись Google.

Теперь я прочитал несколько разных статей, где люди столкнулись с этой проблемой, и мне ничего не помогает.

Вот список того, что я пробовал до сих пор:

1) Убедитесь, что приложение опубликовано либо альфа, либо бета для тестирования. (Теперь в alpha)

2) Убедитесь, что цены соответствуют игре и в консоли разработчика.

3) Используйте устройство, которое зарегистрировано как пользователь, который не использует электронную почту разработчика.

4) Убедитесь, что электронная почта на тестовом устройстве указана в качестве тестера в консоли разработчика.

5) Убедитесь, что необходимые разрешения указаны в манифесте Android.

6) Убедитесь, что учетная запись продавца настроена правильно и проверена.

7) Удостоверьтесь, что вы создали как выпуск, а не разработку (не уверен, что это даже имеет значение, но я пробовал в обоих направлениях).

8) Полностью удалил весь плагин Soomla из проекта, а затем добавил его обратно, внимательно следя за учебником, чтобы удостовериться, что ничего не было пропущено. Все еще нет кубиков.

У меня есть компоненты ядра и хранилища, добавленные к месту, в котором они необходимы. Пожалуйста, дайте мне знать, если у вас есть другие идеи о том, что я должен сделать, чтобы исправить эту проблему. В то же время, вот код StoreAssets.cs, который я использую для настройки Soomla:

using UnityEngine; using System.Collections; using System.Collections.Generic; using Soomla.Store; public class StoreAssets : IStoreAssets { public static bool purchased = false; public int GetVersion() { return 0; } public void onItemPurchased(PurchasableVirtualItem pvi, string payload) { purchased = true; } public VirtualCurrency[] GetCurrencies() { return new VirtualCurrency[]{TOKEN_CURRENCY}; } public VirtualGood[] GetGoods() { return new VirtualGood[] {BACKUP_FORCEFIELD, IMMUNITY, EMP, MULTIPLIER}; } public VirtualCurrencyPack[] GetCurrencyPacks() { return new VirtualCurrencyPack[] {FIVE_TOKEN_PACK, TEN_TOKEN_PACK, FIFTY_TOKEN_PACK}; } public VirtualCategory[] GetCategories() { return new VirtualCategory[]{}; } /** Virtual Currencies **/ public static VirtualCurrency TOKEN_CURRENCY = new VirtualCurrency ( "Token", // Name "Token currency", // Description "token_currency_ID" // Item ID ); /** Virtual Currency Packs **/ public static VirtualCurrencyPack FIVE_TOKEN_PACK = new VirtualCurrencyPack ( "5 Tokens", // Name "5 token currency units", // Description "5_tokens_id", // Item ID 5, // Number of currencies in the pack "token_currency_ID", // ID of the currency associated with this pack new PurchaseWithMarket ( // Purchase type (with real money $) "tokens_5_PROD_ID", // Product ID 0.99 // Price (in real money $) ) ); public static VirtualCurrencyPack TEN_TOKEN_PACK = new VirtualCurrencyPack ( "10 Tokens", // Name "10 token currency units", // Description "10_tokens_id", // Item ID 10, // Number of currencies in the pack "token_currency_ID", // ID of the currency associated with this pack new PurchaseWithMarket ( // Purchase type (with real money $) "tokens_10_PROD_ID", // Product ID 1.99 // Price (in real money $) ) ); public static VirtualCurrencyPack FIFTY_TOKEN_PACK = new VirtualCurrencyPack ( "50 Tokens", // Name "50 token currency units", // Description "50_tokens_id", // Item ID 50, // Number of currencies in the pack "token_currency_ID", // ID of the currency associated with this pack new PurchaseWithMarket ( // Purchase type (with real money $) "tokens_50_PROD_ID", // Product ID 4.99 // Price (in real money $) ) ); /** Virtual Goods **/ public static VirtualGood BACKUP_FORCEFIELD = new SingleUseVG ( "BackupForcefield", // Name "Secondary forcefield for extra protection.", // Description "bff_ID", // Item ID new PurchaseWithVirtualItem ( // Purchase type (with virtual currency) "token_currency_ID", // ID of the item used to pay with 1 // Price (amount of coins) ) ); public static VirtualGood EMP = new SingleUseVG ( "Emp", // Name "Clear the surrounding space of all lasers.", // Description "emp_ID", // Item ID new PurchaseWithVirtualItem ( // Purchase type (with virtual currency) "token_currency_ID", // ID of the item used to pay with 5 // Price (amount of coins) ) ); public static VirtualGood IMMUNITY = new SingleUseVG ( "Immunity", // Name "Immune to damage.", // Description "immunity_ID", // Item ID new PurchaseWithVirtualItem ( // Purchase type (with virtual currency) "token_currency_ID", // ID of the item used to pay with 10 // Price (amount of coins) ) ); public static VirtualGood MULTIPLIER = new SingleUseVG ( "Multiplier", // Name "Double your score per deflected laser.", // Description "multiplier_ID", // Item ID new PurchaseWithVirtualItem ( // Purchase type (with virtual currency) "token_currency_ID", // ID of the item used to pay with 15 // Price (amount of coins) ) ); } 

Чтобы купить Предметы, я звоню:

 StoreInventory.BuyItem("the id of my item"); 

Чтобы использовать купленный товар, я вызываю:

 StoreInventory.TakeItem("the id of my item"); 

StoreInventory – это класс, который включен в Soomla, когда он импортируется в Unity.

Вот код, в котором покупаются товары и потребление предметов:

 public class Purchase : MonoBehaviour { public Text tokens; public static bool bffFilled = false, immFilled = false, empFilled = false, multFilled = false, init = false; void Start() { if (!init) { init = true; SoomlaStore.Initialize(new StoreAssets()); } Token.updateTokens (tokens); } void Update() { if (StoreEvents.balanceChanged) { StoreEvents.balanceChanged = false; Token.updateTokens(tokens); } } public void BuyItem (int item) { if (item == 1) { StoreInventory.BuyItem (StoreAssets.FIVE_TOKEN_PACK.ItemId); } else if (item == 2) { StoreInventory.BuyItem (StoreAssets.TEN_TOKEN_PACK.ItemId); } else if (item == 3) { StoreInventory.BuyItem (StoreAssets.FIFTY_TOKEN_PACK.ItemId); } Token.updateTokens(tokens); } public void getUpgrade(int upgrade) { if (upgrade == 1) { bool bffNotBought = PlayerPrefs.GetInt("Bff Available", 0) == 0; if (StoreAssets.TOKEN_CURRENCY.GetBalance() >= 1 && bffNotBought) { PlayerPrefs.SetInt("Bff Available", 1); PlayerPrefs.Save(); bffFilled = true; StoreInventory.TakeItem(StoreAssets.TOKEN_CURRENCY.ItemId, 1); } } else if (upgrade == 2) { bool empNotBought = PlayerPrefs.GetInt("Emp Available", 0) == 0; if (StoreAssets.TOKEN_CURRENCY.GetBalance() >= 5 && empNotBought) { PlayerPrefs.SetInt("Emp Available", 1); PlayerPrefs.Save(); empFilled = true; StoreInventory.TakeItem(StoreAssets.TOKEN_CURRENCY.ItemId, 5); } } else if (upgrade == 3) { bool immNotBought = PlayerPrefs.GetInt("Imm Available", 0) == 0; if (StoreAssets.TOKEN_CURRENCY.GetBalance() >= 10 && immNotBought) { PlayerPrefs.SetInt("Imm Available", 1); PlayerPrefs.Save(); immFilled = true; StoreInventory.TakeItem(StoreAssets.TOKEN_CURRENCY.ItemId, 10); } } else if (upgrade == 4) { bool multNotBought = PlayerPrefs.GetInt("Mult Available", 0) == 0; if (StoreAssets.TOKEN_CURRENCY.GetBalance() >= 15 && multNotBought) { PlayerPrefs.SetInt("Mult Available", 1); PlayerPrefs.Save(); multFilled = true; StoreInventory.TakeItem(StoreAssets.TOKEN_CURRENCY.ItemId, 15); } } Token.updateTokens (tokens); } } 

8/26/15

Теперь я создал группу google и сообщество google для тестирования этого приложения. Я добавил электронное письмо для своего другого устройства Android для обоих из них, и я использовал ссылку, предоставленную для загрузки приложения. Выполнение всего этого по-прежнему приводило к той же ошибке, что и раньше.

8/27/15

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

8/31/15

После окончательной проверки моей торговой учетной записи в Google Play у меня все еще есть такая же проблема. Фиксирование моего торгового счета не изменило ничего, что я не мог сказать.

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

9/7/15

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

9/9/15

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

9/11/15

Попробовав несколько вещей, которые указал Тони, я заметил, что функция onBillingSupported () не вызывается, когда я использую это: StoreEvents.OnBillingSupported + = onBillingSupported; Я еще не знаю, почему.

9/12/15

Пройдя учебник на сайте soomla, я сделал все, что он сказал, кроме запуска Iab в фоновом режиме и защиты от мошенничества, поскольку они не требуются. Метод onBillingSupported по-прежнему не вызывается, и я все еще получаю ту же ошибку, что и раньше, на устройствах Android.

9/12/15

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

9/16/15

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

Solutions Collecting From Web of "Ошибка Google Play при совершении покупки при внедрении плагина Soomla Unity3d"

У меня никогда не было проблемы, которую вы описываете. Однако я создал частное сообщество Google+ и добавил сообщество в качестве тестеров. Сменил мое приложение на бета-версию. И пригласил людей в мое частное сообщество, где была ссылка, чтобы загрузить приложение и протестировать его. Это было легко.

Второй момент – ваш код выше. Вы получаете 4 товара и 3 валютных пакета, но код не отражает это. Может быть, вы только наклеили половину класса.

Наконец, посмотрите, поможет ли этот поток: http://answers.soom.la/t/solved-some-clarification-about-iab-testing/2067/8

Кстати, у SOOMLA есть выделенный сайт answer.soom.la для вопросов, связанных с SOOMLA.

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

В моем случае я не понимал, что то, что я использовал для моего идентификатора товара и моего идентификатора продукта, было путано. Идентификатор элемента – это просто идентификация элемента в пределах soomla, идентификатор продукта – это фактическое, которое я вам сделал, в игре google.

Из краткой дискуссии в комментариях звучит так, будто у вас может быть не все.

Посмотрите эту ссылку: http://know.soom.la/unity/store/store_gettingstarted/

В разделе «Начало работы» указано.

  1. Создайте собственную реализацию IStoreAssets, чтобы описать конкретные активы вашей игры.

  2. Инициализируйте SoomlaStore с классом, который вы только что создали:

SoomlaStore.Initialize (новый YourStoreAssetsImplementation ());

Инициализируйте SoomlaStore в функции запуска MonoBehaviour и NOT в функции Awake. SOOMLA имеет свой собственный MonoBehaviour, и перед инициализацией он должен быть «Пробужден».

Инициализировать SoomlaStore ТОЛЬКО ОДИН РАЗ, когда ваше приложение загружается.

Инициализация подтверждена и на этой странице. http://know.soom.la/unity/store/store_istoreassets/

Это говорит о том, что это необязательно, но выглядит полезным

Если у вас есть собственный магазин, реализованный внутри вашей игры, рекомендуется открыть службу IAB в фоновом режиме, когда магазин откроется и закроет его, когда магазин закрыт.

// Запуск службы Iab SoomlaStore.StartIabServiceInBg ();

// Остановить службу Iab SoomlaStore.StopIabServiceInBg ();

Это не обязательно, ваша игра будет работать без этого, но мы рекомендуем ее, потому что она повышает производительность. Идея здесь заключается в том, чтобы предварительно запустить процесс установки биллинга в приложении с серверами Google (или Amazon's).

Вы можете попробовать добавить журнал в событие initialize, чтобы убедиться, что он инициализируется. Вот список событий, которые вы можете попробовать выполнить.

http://know.soom.la/unity/store/store_events/

ПРИМЕЧАНИЕ. Следует заметить, что если вы хотите прослушать OnSoomlaStoreInitialized, вам необходимо настроить прослушиватель перед инициализацией SoomlaStore. Поэтому вам нужно будет:

StoreEvents.OnSoomlaStoreInitialized + = onSoomlaStoreInitialized;

до

Soomla.SoomlaStore.Initialize (новый файл Soomla.Example.MuffinRushAssets ());

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

StoreEvents.OnBillingSupported + = onBillingSupported;

Public void onBillingSupported () {// … конкретная реализация вашей игры здесь …}