Я создаю приложение, которое реализует плагин 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, а затем добавьте его снова и по-прежнему получайте ту же ошибку после нескольких попыток. Я следил за всем, как говорится в учебнике, и у меня есть весь код выше.