Ошибка Google play при совершении покупки при реализации плагина Soomla Unity3d
Я создаю приложение, которое реализует плагин Soomla Unity IAP. Стремясь заставить IAP работать, я дошел до того, что я могу совершить покупку в редакторе. (Не реальная покупка, она просто обновляет виртуальную валюту, которую пользователь может купить / потратить в игре).
Когда я запускаю это на устройстве Android, я получаю эту ошибку: требуется аутентификация. Вам необходимо войти в свою учетную запись Google.
Теперь я прочитал несколько разных статей, где люди сталкивались с этой проблемой, и, кажется, ничто не помогает мне.
Вот список того, что я пробовал до сих пор:
1) Убедитесь, что приложение опубликовано для тестирования в альфа-версии или бета-версии.
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, а затем добавления его снова и получения такой же ошибки после нескольких попыток. Я следовал всему, как говорится в руководстве, и у меня есть весь код выше.
4 ответа
В моем случае я не осознавал, что то, что я использовал для идентификатора товара и идентификатора товара, было перепутано. Идентификатор предмета предназначен только для идентификации предмета в soomla, а идентификатор товара - это фактический номер, который вы задали бы в Google Play.
У меня никогда не было проблемы, которую вы описываете. Я создал частное сообщество Google+ и добавил его в качестве тестеров. Перенес мое приложение в бета-версию. И пригласил людей в мое частное сообщество, где была ссылка, чтобы загрузить приложение и протестировать его. Это было легко.
Второй момент - ваш код выше. Вы получаете 4 товара и 3 валютных пакета, но код не отражает это. Может быть, вы вставили только половину класса.
Наконец, посмотрите, поможет ли эта ветка: http://answers.soom.la/t/solved-some-clarification-about-iab-testing/2067/10
Кстати, у SOOMLA есть специальный сайт answers.soom.la для вопросов, связанных с SOOMLA.
Вы пробовали покупать товары с другого устройства? У меня была эта проблема раньше, но не помню, как я ее исправил. Из того, что я помню, когда он потерпел неудачу для меня, он работал на устройстве другого сотрудника. Попробуйте протестировать его на другом устройстве. Кроме того, у вас есть несколько учетных записей Google на вашем устройстве? Я помню, что одна из вещей, которые я пытался удалить, это удалить все учетные записи Google со своего устройства и просто оставить свою основную учетную запись зарегистрированной. К сожалению, я не помню, сработало ли это, но я надеюсь, что это поможет вам. если вы узнаете, как это исправить, пожалуйста, разместите обновление здесь. удачи
Из краткого обсуждения в комментариях кажется, что у вас может быть не все реализовано.
Проверьте эту ссылку: http://know.soom.la/unity/store/store_gettingstarted/
В разделе "Начало работы" говорится:
Создайте собственную реализацию IStoreAssets, чтобы описать конкретные ресурсы вашей игры.
Инициализируйте SoomlaStore с помощью класса, который вы только что создали:
SoomlaStore.Initialize (new YourStoreAssetsImplementation ());
Инициализируйте SoomlaStore в функции запуска MonoBehaviour, а НЕ в функции пробуждения. SOOMLA имеет свой собственный MonoBehaviour, и его нужно "пробудить" перед инициализацией.
Инициализируйте SoomlaStore ТОЛЬКО ОДИН РАЗ, когда ваше приложение загружается.
Инициализация также подтверждается на этой странице. http://know.soom.la/unity/store/store_istoreassets/
Это говорит о том, что это не обязательно, но выглядит полезным
Если у вас есть собственная витрина, реализованная в вашей игре, рекомендуется открывать службу IAB в фоновом режиме, когда магазин открывается, и закрывать ее, когда магазин закрыт.
// Запускаем службу Iab SoomlaStore.StartIabServiceInBg ();
// Остановить службу Iab SoomlaStore.StopIabServiceInBg();
Это не обязательно, ваша игра будет работать без этого, но мы рекомендуем, потому что это повышает производительность. Идея заключается в том, чтобы превентивно запустить процесс биллинга в приложении с помощью серверов Google (или Amazon).
Вы можете попробовать добавить запись в событие инициализации, чтобы убедиться, что оно инициализируется. Вот список событий, с которых вы можете попробовать войти.
http://know.soom.la/unity/store/store_events/
ПРИМЕЧАНИЕ. Одна вещь, которую вы должны заметить, заключается в том, что если вы хотите прослушать событие OnSoomlaStoreInitialized, вы должны настроить прослушиватель перед инициализацией SoomlaStore. Так что вам нужно сделать:
StoreEvents.OnSoomlaStoreInitialized + = onSoomlaStoreInitialized;
до
Soomla.SoomlaStore.Initialize(new Soomla.Example.MuffinRushAssets());
Вы также можете настроить событие OnBillingSetup с некоторыми регистрациями, чтобы убедиться, что оно правильно инициализирует ваш биллинг.
StoreEvents.OnBillingSupported + = onBillingSupported;
public void onBillingSupported () {//... ваша конкретная реализация игры здесь... }