namespace Guru { using UnityEngine; using System; using System.Linq; public partial class GuruSDK { public static bool IsIAPReady = false; //---------- 支付失败原因 ---------- public const string BuyFail_PurchasingUnavailable = "PurchasingUnavailable"; public const string BuyFail_Pending = "ExistingPurchasePending"; public const string BuyFail_ProductUnavailable = "ProductUnavailable"; public const string BuyFail_SignatureInvalid = "SignatureInvalid"; public const string BuyFail_UserCancelled = "UserCancelled"; public const string BuyFail_PaymentDeclined = "PaymentDeclined"; public const string BuyFail_DuplicateTransaction = "DuplicateTransaction"; public const string BuyFail_Unknown = "Unknown"; /// /// 初始化IAP 功能 /// public static void InitIAP(byte[] googleKey, byte[] appleRootCerts) { GuruIAP.Instance.OnInitResult += OnIAPInitResult; GuruIAP.Instance.OnRestored += OnRestored; GuruIAP.Instance.OnBuyStart += OnBuyStart; GuruIAP.Instance.OnBuyEnd += OnBuyEnd; GuruIAP.Instance.OnBuyFailed += OnBuyFailed; GuruIAP.Instance.OnGetProductReceipt += OnGetReceipt; GuruIAP.Instance.InitWithKeys(googleKey, appleRootCerts, IsDebugMode); } /// /// 初始化结果 /// /// private static void OnIAPInitResult(bool success) { LogI($"IAP init result: {success}"); IsIAPReady = success; Callbacks.IAP._onIAPInitComplete?.Invoke(success); } private static bool CheckIAPReady() { if (!IsIAPReady) { LogE("IAP is not ready, call first."); return false; } return true; } #region Data public static ProductSetting GetProductSettingById(string productId) { var products = GuruSettings.Instance.Products; if (products != null && products.Length > 0) { return products.FirstOrDefault(p => p.ProductId == productId); } return null; } public static ProductSetting GetProductSetting(string productName) { var products = GuruSettings.Instance.Products; if (products != null && products.Length > 0) { return products.FirstOrDefault(p => p.ProductName == productName); } return null; } /// /// 查询某个商品是否已经包含订单了 /// /// /// public static bool IsProductHasReceipt(string productName) { return GuruIAP.Instance.IsProductHasReceipt(productName); } #endregion #region Purchase private static Action _onPurchaseCallback; /// /// 购买商品, 通过商品Name /// /// /// public static void Purchase(string productName, Action purchaseCallback = null) { if (CheckIAPReady()) { _onPurchaseCallback = purchaseCallback; GuruIAP.Instance.Buy(productName); } } /// /// 购买商品, 通过商品ID /// /// /// public static bool PurchaseById(string productId, Action purchaseCallback = null) { var productName = GetProductSettingById(productId)?.ProductName ?? ""; if (CheckIAPReady() && !string.IsNullOrEmpty(productName)) { Purchase(productName, purchaseCallback); return true; } return false; } /// /// 支付回调 /// /// /// private static void OnBuyEnd(string productName, bool success) { _onPurchaseCallback?.Invoke(productName, success); } /// /// 支付开始 /// /// private static void OnBuyStart(string productName) { Callbacks.IAP._onPurchaseStart?.Invoke(productName); } /// /// 支付失败 /// /// /// private static void OnBuyFailed(string productName, string reason) { Callbacks.IAP._onPurchaseFailed?.Invoke(productName, reason); } #endregion #region Restore Purchase private static Action _onRestored; /// /// 恢复购买 /// /// public static void Restore(Action restoreCallback) { if (CheckIAPReady()) { _onRestored = restoreCallback; GuruIAP.Instance.Restore(); } } private static void OnRestored(bool success) { _onRestored?.Invoke(success); } #endregion #region Receipt private static void OnGetReceipt(string productId, string receipt, bool appleProductIsRestored = false) { var productName = GetProductSettingById(productId).ProductName; Model.AddReceipt(receipt, productName, productId, appleProductIsRestored); } #endregion } }