Подтвердить что ты не робот

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

4b9b3361

Ответ 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/

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

  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() {     //... ваша конкретная реализация игры здесь...}