【发布时间】:2022-06-14 15:57:59
【问题描述】:
我有什么
IAP 按钮在统一编辑器中运行良好。购买后,我收到调试消息 "ProcessPurchase: PASS. Product: 'full_version'" 。 但当我尝试在设备上进行购买时,按钮不起作用。
在编辑器中购买产品时不会出现任何错误
到目前为止我做了什么
- 自动初始化 UnityPurchasing 复选框已打开 screenshot from unity IAP catalog
- 我已检查产品 ID 和价格在 unity 和 Play 控制台中是否相同
- 我的 IAP 产品在游戏控制台中显示为活动状态IAP in play console
- 像这样设置无代码 IAP Unity IAP button component
按下设备上的按钮时出现 LogCat 错误
2022-03-14 20:08:18.244 9293-9334/? E/Unity: Purchase failed because Purchasing was not initialized correctly
UnityEngine.Purchasing.CodelessIAPStoreListener:InitiatePurchase(String)
UnityEngine.Events.UnityAction:Invoke()
UnityEngine.Events.UnityEvent:Invoke()
UnityEngine.EventSystems.EventFunction`1:Invoke(T1, BaseEventData)
UnityEngine.EventSystems.ExecuteEvents:Execute(GameObject, BaseEventData, EventFunction`1)
UnityEngine.EventSystems.StandaloneInputModule:ProcessTouchPress(PointerEventData, Boolean, Boolean)
UnityEngine.EventSystems.StandaloneInputModule:ProcessTouchEvents()
UnityEngine.EventSystems.StandaloneInputModule:Process()
IAP 脚本
using System;
using UnityEngine;
using UnityEngine.Purchasing; //библиотека с покупками, будет доступна когда активируем сервисы
public class IAP : MonoBehaviour, IStoreListener //для получения сообщений из Unity Purchasing
{
private static IStoreController m_StoreController; //доступ к системе Unity Purchasing
private static IExtensionProvider m_StoreExtensionProvider; // подсистемы закупок для конкретных магазинов
public static string fullVersion = "full_version";
void Start()
{
if (m_StoreController == null) //если еще не инициализаровали систему Unity Purchasing, тогда инициализируем
{
InitializePurchasing();
}
}
public void InitializePurchasing()
{
if (IsInitialized()) //если уже подключены к системе - выходим из функции
{
return;
}
var builder = ConfigurationBuilder.Instance(StandardPurchasingModule.Instance());
builder.AddProduct(fullVersion, ProductType.NonConsumable);
UnityPurchasing.Initialize(this, builder);
}
public void Buy_full_version()
{
BuyProductID(fullVersion);
}
void BuyProductID(string productId)
{
if (IsInitialized()) //если покупка инициализирована
{
Product product = m_StoreController.products.WithID(productId); //находим продукт покупки
if (product != null && product.availableToPurchase) //если продукт найдет и готов для продажи
{
Debug.Log(string.Format("Purchasing product asychronously: '{0}'", product.definition.id));
m_StoreController.InitiatePurchase(product); //покупаем
}
else
{
Debug.Log("BuyProductID: FAIL. Not purchasing product, either is not found or is not available for purchase");
}
}
else
{
Debug.Log("BuyProductID FAIL. Not initialized.");
}
}
public PurchaseProcessingResult ProcessPurchase(PurchaseEventArgs args) //контроль покупок
{
if (String.Equals(args.purchasedProduct.definition.id, fullVersion, StringComparison.Ordinal))
{
Debug.Log(string.Format("ProcessPurchase: PASS. Product: '{0}'", args.purchasedProduct.definition.id));
//действия при покупке
if (PlayerPrefs.HasKey("full_version") == false)
{
PlayerPrefs.SetInt("full_version", 1);
}
}
else
{
Debug.Log(string.Format("ProcessPurchase: FAIL. Unrecognized product: '{0}'", args.purchasedProduct.definition.id));
}
return PurchaseProcessingResult.Complete;
}
public void RestorePurchases() //Восстановление покупок (только для Apple). У гугл это автоматический процесс.
{
if (!IsInitialized())
{
Debug.Log("RestorePurchases FAIL. Not initialized.");
return;
}
if (Application.platform == RuntimePlatform.IPhonePlayer ||
Application.platform == RuntimePlatform.OSXPlayer) //если запущенно на эпл устройстве
{
Debug.Log("RestorePurchases started ...");
var apple = m_StoreExtensionProvider.GetExtension<IAppleExtensions>();
apple.RestoreTransactions((result) =>
{
Debug.Log("RestorePurchases continuing: " + result + ". If no further messages, no purchases available to restore.");
});
}
else
{
Debug.Log("RestorePurchases FAIL. Not supported on this platform. Current = " + Application.platform);
}
}
public void OnInitialized(IStoreController controller, IExtensionProvider extensions)
{
Debug.Log("OnInitialized: PASS");
m_StoreController = controller;
m_StoreExtensionProvider = extensions;
}
private bool IsInitialized()
{
return m_StoreController != null && m_StoreExtensionProvider != null;
}
public void OnInitializeFailed(InitializationFailureReason error)
{
Debug.Log("OnInitializeFailed InitializationFailureReason:" + error);
}
public void OnPurchaseFailed(Product product, PurchaseFailureReason failureReason)
{
Debug.Log(string.Format("OnPurchaseFailed: FAIL. Product: '{0}', PurchaseFailureReason: {1}", product.definition.storeSpecificId, failureReason));
}
}
问题是我不明白这个错误是什么意思,以及随后如何解决它。希望得到您的帮助
【问题讨论】:
标签: android unity3d in-app-purchase google-play-console