namespace Guru { 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"; #region Start /// /// 初始化IAP 功能 /// public static void InitIAP(string uid, 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; Callbacks.IAP.InvokeOnIAPInitStart(); // 初始化之前进行调用 GuruIAP.Instance.InitWithKeys(uid, googleKey, appleRootCerts, IsDebugMode); } /// /// 初始化结果 /// /// private static void OnIAPInitResult(bool success) { LogI($"IAP init result: {success}"); IsIAPReady = success; Callbacks.IAP.InvokeOnIAPInitComplete(success); } private static bool CheckIAPReady() { if (!IsIAPReady) { LogE("IAP is not ready, call first."); return false; } return true; } #endregion #region Data /// /// 获取商品信息 /// /// /// public static ProductInfo GetProductInfo(string productName) { return GuruIAP.Instance?.GetInfo(productName); } /// /// 获取商品信息 (提供 ProductId) /// /// /// public static ProductInfo GetProductInfoById(string productId) { return GuruIAP.Instance?.GetInfoById(productId); } [Obsolete("Will be discarded in next version. Using GetProductInfoById(string productId) instead.")] 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; } [Obsolete("Will be discarded in next version. Using GetProductInfo(string productName) instead.")] 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); } public static string GetProductLocalizedPriceString(string productName) { return GuruIAP.Instance.GetLocalizedPriceString(productName); } #endregion #region Purchase private static Action InvokeOnPurchaseCallback; /// /// 老接口, 将会被废弃 /// /// /// [Obsolete("Will be discarded in next version. Using Purchase(string productName, string category, Action purchaseCallback) instead.")] internal static void Purchase(string productName, Action purchaseCallback = null) { Purchase(productName, "", purchaseCallback); } /// /// 购买商品, 通过商品Name /// /// /// /// public static void Purchase(string productName, string category = "", Action purchaseCallback = null) { if (CheckIAPReady()) { InvokeOnPurchaseCallback = purchaseCallback; GuruIAP.Instance.Buy(productName, category); } } /// /// 购买商品, 通过商品ID /// /// /// /// public static bool PurchaseById(string productId, string category = "", Action purchaseCallback = null) { var productName = GetProductInfoById(productId)?.Name ?? ""; if (CheckIAPReady() && !string.IsNullOrEmpty(productName)) { Purchase(productName, category, purchaseCallback); return true; } return false; } /// /// 支付回调 /// /// /// private static void OnBuyEnd(string productName, bool success) { if (success) Model.PurchasedCount++; InvokeOnPurchaseCallback?.Invoke(productName, success); Callbacks.IAP.InvokeOnPurchaseEnd(productName, success); } /// /// 支付开始 /// /// private static void OnBuyStart(string productName) { Callbacks.IAP.InvokeOnPurchaseStart(productName); } /// /// 支付失败 /// /// /// private static void OnBuyFailed(string productName, string reason) { Callbacks.IAP.InvokeOnPurchaseFailed(productName, reason); } #endregion #region Restore Purchase /// /// 恢复购买 /// /// public static void Restore(Action restoreCallback = null) { if( restoreCallback != null) Callbacks.IAP.OnIAPRestored += restoreCallback; if (CheckIAPReady()) { GuruIAP.Instance.Restore(); } } private static void OnRestored(bool success, string msg) { Callbacks.IAP.InvokeOnIAPRestored(success, msg); // 更新回复购买回调 } #endregion #region Receipt /// /// 获取订单收据 /// /// /// /// private static void OnGetReceipt(string productId, string receipt, bool appleProductIsRestored = false) { var productName = GetProductInfoById(productId)?.Name ?? ""; if(!string.IsNullOrEmpty(productName)) Model.AddReceipt(receipt, productName, productId, appleProductIsRestored); } #endregion #region Subscriptions /// /// 订阅是否被取消 /// /// /// public static bool IsSubscriptionCancelled(string productName) { return GuruIAP.Instance.IsSubscriptionCancelled(productName); } /// /// 订阅是否可用 /// /// /// public static bool IsSubscriptionAvailable(string productName) { return GuruIAP.Instance.IsSubscriptionAvailable(productName); } /// /// 订阅是否过期 /// /// /// public static bool IsSubscriptionExpired(string productName) { return GuruIAP.Instance.IsSubscriptionExpired(productName); } public static bool IsSubscriptionFreeTrail(string productName) { return GuruIAP.Instance.IsSubscriptionFreeTrail(productName); } public static bool IsSubscriptionAutoRenewing(string productName) { return GuruIAP.Instance.IsSubscriptionAutoRenewing(productName); } public static bool IsSubscriptionIntroductoryPricePeriod(string productName) { return GuruIAP.Instance.IsSubscriptionIntroductoryPricePeriod(productName); } public DateTime GetSubscriptionExpireDate(string productName) { return GuruIAP.Instance.GetSubscriptionExpireDate(productName); } public DateTime GetSubscriptionPurchaseDate(string productName) { return GuruIAP.Instance.GetSubscriptionPurchaseDate(productName); } public DateTime GetSubscriptionCancelDate(string productName) { return GuruIAP.Instance.GetSubscriptionCancelDate(productName); } public TimeSpan GetSubscriptionRemainingTime(string productName) { return GuruIAP.Instance.GetSubscriptionRemainingTime(productName); } public TimeSpan GetSubscriptionIntroductoryPricePeriod(string productName) { return GuruIAP.Instance.GetSubscriptionIntroductoryPricePeriod(productName); } public TimeSpan GetSubscriptionFreeTrialPeriod(string productName) { return GuruIAP.Instance.GetSubscriptionFreeTrialPeriod(productName); } public string GetSubscriptionInfoJsonString(string productName) { return GuruIAP.Instance.GetSubscriptionInfoJsonString(productName); } #endregion } }