在购买Soomla Unity3d插件的同时,Google玩错误

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

当我在Android设备上启动时,出现此错误: 需要身份validation。 您需要login到您的Google帐户。

现在我已经阅读了多个不同的文章,人们有这个问题,似乎没有任何帮助我。

这是我到目前为止所尝试的清单:

1)确保应用程序已发布到alpha或beta进行testing(现在在alpha中)

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

3)使用以未使用开发人员电子邮件的用户身份login的设备。

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

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

6)确认商家帐户设置正确并validation。

7)确保build立作为释放而不是发展(不知道这是否甚至重要,但我尝试了两种方式)。

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日

我现在已经创build了一个谷歌组和谷歌社区来testing这个应用程序。 我添加了我的其他Android设备的电子邮件到这两个,我用提供的链接下载应用程序。 尽pipe如此,仍然导致了和以前一样的错误。

15年8月27日

我刚刚注意到我的商户账户上的信用卡已经过期。 我读到的一篇文章提到有这样的问题,如果有商业帐户的问题。 我已经更新了这些信息,现在我必须等待他们将存入我的帐户的存款,以确保它的工作。 一旦完成,我会更新是否这固定我目前的问题。

15年8月31日

在Google Play上最终validation我的商家帐户后,我似乎仍然有同样的问题。 修复我的商家账户并没有改变我无法说清的任何事情。

我只是更新了我的post,包括我的整个StoreAssets.cs脚本,以及当玩家使用它们时用于购买和消耗物品的东西。 我加了这个,因为我不知道还有什么问题可以解决。

15年9月7日

到目前为止还没有运气。 问题仍然存在于android中。 编辑器本身进行testing购买,但购买不能从Android设备制造,没有得到上面列出的相同的错误。

15年9月9日

就像一个快速更新,我已经尝试构build项目,没有在构build设置中select的开发构build,我发送链接到我的Google社区中的所有人,以便给它一个镜头。 大家仍然有我的testing设备一样的错误。

15年9月11日

在尝试了几个Tony指出的事情之后,我注意到当我使用这个时,onBillingSupported()函数没有被调用:StoreEvents.OnBillingSupported + = onBillingSupported; 我不确定为什么。

15年9月12日

在通过soomla网站上的教程之后,我已经做了所有的事情,除了在后台启动Iab和欺诈保护,因为它们不是必需的。 onBillingSupported方法仍然没有被调用,我仍然在Android设备上获得像以前一样的错误。

15年9月12日

我只是删除了Soomla插件的所有内容,并导入了最新版本,并再次按照说明进行操作,但仍然出现相同的错误。

15年9月16日

真的不知道我在这里错过了什么。 删除所有的Soomla插件,然后再次添加,并在多次尝试后仍然得到相同的错误。 我已经按照教程所说的做了所有的事情,而且我拥有上面所有的代码。

Solutions Collecting From Web of "在购买Soomla Unity3d插件的同时,Google玩错误"

我从来没有遇到过你所描述的问题。 我创build了一个私人的Google+社区,并将社区添加为testing人员。 将我的应用程序转移到testing版。 并邀请到我的私人社区,有一个链接下载应用程序,并进行testing。 很容易。

第二点,是你的代码上面。 您正在获取4个货物和3个货币包,但代码并不反映这一点。 也许你只贴了一半的课。

最后,看看这个线程是否有帮助: http : //answers.soom.la/t/solved-some-clarification-about-iab-testing/2067/8

顺便说一句,SOOMLA有专门的网站answers.soom.la SOOMLA相关的问题。

您是否尝试从其他设备购买商品? 我以前有过这个问题,但不记得我是如何修复它的。 从我记得当我失败的时候,这是在不同的同事的设备上工作。 尝试在另一台设备上进行testing。 另外,你的设备上有多个谷歌帐户? 我记得我试过的一件事是从我的设备中删除所有的谷歌帐户,只是离开我的主要帐户注册。 不幸的是,我不记得这是否有效,但我希望它会帮助你。 如果你发现如何解决它,请在这里发布更新。 祝你好运

在我的情况下,我没有意识到我用我的物品ID和我的产品ID混在一起。 项目ID只是标识soomla内的项目,产品ID是我想要的,在谷歌播放设置。

从评论中的简短讨论,听起来你可能没有实现一切。

看看这个链接: http : //know.soom.la/unity/store/store_gettingstarted/

在入门部分说明..

  1. 创build您自己的IStoreAssets实现来描述您的游戏的特定资产。

  2. 使用刚刚创build的类来初始化SoomlaStore:

SoomlaStore.Initialize(new YourStoreAssetsImplementation());

在MonoBehaviour的Start函数中初始化SoomlaStore,不在Awake函数中。 SOOMLA有自己的MonoBehaviour,在初始化之前需要被“唤醒”。

初始化SoomlaStore只有当您的应用程序加载。

初始化在这个页面也被确认。 http://know.soom.la/unity/store/store_istoreassets/

这说这不是强制性的,但看起来很有帮助

如果您在游戏中实现了自己的店面,build议您在商店打开时在后台打开IAB服务,并在商店closures时closures它。

//开始Iab服务SoomlaStore.StartIabServiceInBg();

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

这不是强制性的,你的游戏没有这个工作,但我们推荐它,因为它提高了性能。 这里的想法是抢先启动谷歌(或亚马逊)服务器的应用内结算设置过程。

您可以尝试将日志logging添加到初始化事件,以确保它正在初始化。 以下是您可以尝试从中logging的事件列表。

http://know.soom.la/unity/store/store_events/

注意:有一点你需要注意的是,如果你想听OnSoomlaStoreInitialized事件,你必须在初始化SoomlaStore之前设置监听器。 所以你需要做:

StoreEvents.OnSoomlaStoreInitialized + = onSoomlaStoreInitialized;

之前

Soomla.SoomlaStore.Initialize(new Soomla.Example.MuffinRushAssets());

您还可以使用某些日志logging设置OnBillingSetup事件,以确保它正确地初始化您的结算。

StoreEvents.OnBillingSupported + = onBillingSupported;

公共无效onBillingSupported(){/ /您的游戏具体实现在这里…}