在实施Soomla Unity3d插件时进行购买时出现Google播放错误

时间:2015-08-24 23:49:38

标签: c# android unity3d in-app-purchase soomla

我正在创建一个实现Soomla Unity IAP插件的应用程序。为了让IAP工作,我已经达到了可以在编辑器中进行购买的程度。 (不是真正的购买,它只是更新用户可以在游戏中购买/消费的虚拟货币)。

当我在Android设备上启动此操作时,出现此错误: 需要进行身份验证。您需要登录自己的Google帐户。

现在我已经阅读了多篇不同的文章,其中人们已经遇到过这个问题,似乎没有什么能帮助我。

以下列出了我迄今为止所尝试的内容:

1)确保将app发布到alpha或beta进行测试。(现在在alpha中)

2)确保价格与游戏和开发者控制台相匹配。

3)使用以未使用开发者电子邮件的用户身份登录的设备。

4)确保测试设备上的电子邮件在开发者控制台中列为测试人员。

5)确保Android Manifest中列出了必要的权限。

6)确认商户帐户已正确设置并验证。

7)确保构建为发布而不是开发(不确定这是否重要,但我尝试了两种方式)。

8)从项目中完全删除了所有Soomla插件,然后将其重新添加,同时非常仔细地遵循教程,以确保没有遗漏任何小的内容。仍然没有骰子。

我将核心和商店组件添加到他们必要的场景中。如果您对解决此问题应采取的措施有任何其他想法,请告诉我。同时,这里是我用于设置Soomla的StoreAssets.cs代码:

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);
    }
}

15年8月26日

我现在已经创建了一个用于测试此应用的Google群组和Google社区。我添加了我的其他Android设备的电子邮件到这两个,我使用提供的链接下载该应用程序。完成所有这些操作仍会导致与以前相同的错误。

15年8月27日

我刚注意到我的商家帐户上的信用卡已过期。如果商家帐户存在问题,我读过的其中一篇文章提到了这样的问题。我已经更新了信息,现在我必须等待他们将存入我的帐户的存款,以确保它正常工作。一旦完成,我将更新这是否解决了我当前的问题。

15年8月31日

最终在Google Play上验证我的商家帐户后,我似乎仍然遇到同样的问题。修复我的商家帐户并没有改变我无法说出的任何内容。

我刚刚更新了我的帖子,以包含我的整个StoreAssets.cs脚本,以及当玩家使用它时我用来购买和使用物品的内容。我添加了这个,因为我不知道这个问题还有什么。

15年9月7日

到目前为止仍然没有运气。问题在android中仍然存在。编辑器本身进行测试购买,但是如果没有得到与上面列出的相同的错误,则无法从Android设备购买。

15年9月9日

正如快速更新一样,我尝试在构建设置中未选择开发构建的情况下构建项目,并将链接发送给Google社区中的所有人员,以便为其提供帮助。每个人仍然有与我的测试设备相同的错误。

15年9月11日

在尝试了Tony指出的一些事情之后,我注意到当我使用它时没有调用onBillingSupported()函数:StoreEvents.OnBillingSupported + = onBillingSupported;我现在还不确定。

15年9月12日

在浏览了soomla网站上的教程后,除了在后台启动Iab和欺诈保护之外,我已经做了所有的事情,因为它们并不是必需的。仍未调用onBillingSupported方法,我仍然在Android设备上获得与以前相同的错误。

15年9月12日

我刚刚删除了Soomla插件的所有内容并导入了最新版本并再次按照说明操作,我仍然得到同样的错误。

15年9月16日

真的不知道我在这里缺少什么。删除所有Soomla插件然后再次添加它并在多次尝试后仍然得到相同的错误。我按照教程说的那样跟踪了所有内容,并且我拥有上面的所有代码。

3 个答案:

答案 0 :(得分:1)

您是否尝试过从其他设备购买商品? 我以前遇到过这个问题,但是不记得我是如何解决这个问题的。 从我记得它失败的那一刻起,它正在研究不同的同事的设备。 尝试在其他设备上测试它。 此外,您的设备上有多个Google帐户吗? 我记得我试过的其中一件事就是从我的设备中删除所有谷歌帐户,然后只是注册了我的主帐户。不幸的是,我不记得是否有效,但我希望它会对你有所帮助。 如果您发现如何修复它,请在此处发布更新。祝你好运

答案 1 :(得分:1)

在我的情况下,我没有意识到我用于我的商品ID和我的商品ID的内容混淆了。商品ID仅用于标识soomla中的商品,产品ID是我在Google Play中设置的实际商品ID。

答案 2 :(得分:0)

从评论中的简短讨论来看,您可能没有实施所有内容。

查看此链接: http://know.soom.la/unity/store/store_gettingstarted/

在“入门”部分中说明..

  
      
  1. 创建自己的IStoreAssets实现,以描述您游戏的特定资产。

  2.   
  3. 使用刚刚创建的类初始化SoomlaStore:

  4.         
        

    SoomlaStore.Initialize(new YourStoreAssetsImplementation());

             

    在MonoBehaviour和NOT的Start函数中初始化SoomlaStore     在唤醒功能。 SOOMLA有自己的MonoBehaviour,它需要     被唤醒"被唤醒"在你初始化之前。

             

    仅在应用程序加载时初始化SoomlaStore。

      

此页面也确认了初始化。 http://know.soom.la/unity/store/store_istoreassets/

这表示它不是强制性的,但看起来很有用

  

如果您在游戏中实施了自己的店面,那就是它   建议您在后台打开IAB服务时   商店在商店关闭时打开并关闭它。

     

//启动Iab服务SoomlaStore.StartIabServiceInBg();

     

//停止Iab服务SoomlaStore.StopIabServiceInBg();

     

这不是强制性的,如果没有这个,你的游戏会有效,但我们建议你这样做   因为它提高了性能。这里的想法是先发制人   使用Google(或亚马逊)启动应用内结算设置流程   服务器

您可以尝试将日志记录添加到initialize事件以确保它正在初始化。以下是您可以尝试登录的事件列表..

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(){       // ...这里你的游戏特定实现......}