Ошибка 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 script и то, что я использую, чтобы делать покупки и потреблять предметы, когда игрок их использует. Я добавил это, так как я понятия не имею, что еще может быть проблемой.
9/7/15
Пока не повезло. Проблема сохраняется в android. Сам редактор производит тестовые покупки, но покупки не могут производиться с устройства Android, не получая такую же ошибку, как указано выше.
9/9/15
Как быстрое обновление, я попытался создать проект без сборки разработки, выбранной в настройках сборки, и отправлю ссылку всем людям в моем сообществе Google, чтобы сделать снимок. Все по-прежнему имеют ту же ошибку, что и мое тестовое устройство.
9/11/15
Попробовав несколько вещей, которые указал Тони, я заметил, что функция onBillingSupported() не вызывается, когда я использую это: StoreEvents.OnBillingSupported + = onBillingSupported; Я пока не знаю, почему.
9/12/15
Пройдя учебник на сайте soomla, я сделал все, что сказал, за исключением того, что я начал работать в фоновом режиме и защищать от мошенничества, поскольку они не требуются. метод onBillingSupported по-прежнему не вызывается, и я все еще получаю ту же ошибку, что и раньше, на устройствах Android.
9/12/15
Я просто удалил все для плагина Soomla и импортировал новейшую версию и снова выполнил инструкции, и я все равно получаю ту же ошибку.
9/16/15
На самом деле не знаю, чего я здесь не вижу. После удаления всего плагина Soomla, а затем добавьте его снова и по-прежнему получайте ту же ошибку после нескольких попыток. Я следил за всем, как говорится в учебнике, и у меня есть весь код выше.
Ответы
Ответ 1
В моем случае я не понимал, что то, что я использовал для моего идентификатора товара и моего идентификатора продукта, было путано. Идентификатор элемента - это просто идентификация элемента в пределах soomla, идентификатор продукта - это фактическое я бы вас, установленный в google play.
Ответ 2
У меня никогда не было проблемы, которую вы описываете. Однако я создал частное сообщество Google+ и добавил сообщество в качестве тестеров. Сменил мое приложение на бета-версию. И пригласил людей в мое частное сообщество, где была ссылка, чтобы загрузить приложение и протестировать его. Это было легко.
Второй момент - это ваш код выше. Вы получаете 4 товара и 3 валютных пакета, но код не отражает это. Возможно, вы только наклеили половину класса.
Наконец, посмотрите, поможет ли этот поток: http://answers.soom.la/t/solved-some-clarification-about-iab-testing/2067/8
Кстати, у SOOMLA есть выделенный сайт answer.soom.la для связанных с SOOMLA проблем.
Ответ 3
Вы пытались купить товар с другого устройства?
Раньше у меня была эта проблема, но не помню, как я ее исправил.
Из того, что я помню, когда это не удавалось для меня, он работал над другим сотрудником.
Попробуйте протестировать его на другом устройстве.
Кроме того, есть ли у вас несколько учетных записей google на вашем устройстве?
Я помню, что одна из вещей, которые я пробовал, удаляет всю учетную запись google с моего устройства и просто оставила мою основную учетную запись зарегистрированной. К сожалению, я не помню, если это сработало, но я надеюсь, что это поможет вам.
если вы узнаете, как исправить это, разместите здесь обновление. удачи
Ответ 4
Из краткой дискуссии в комментариях звучит так, будто у вас может быть не все реализовано.
Посмотрите эту ссылку:
http://know.soom.la/unity/store/store_gettingstarted/
В разделе "Начало работы" указано.
-
Создайте собственную реализацию IStoreAssets, чтобы описать свои игровые активы.
-
Инициализировать 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() { //... ваша конкретная реализация игры здесь...}