Untitled
unknown
plain_text
15 days ago
10 kB
4
Indexable
using BravestarsSDK; using System; using System.Collections.Generic; using Unity.Services.Core; using Unity.Services.Core.Environments; using UnityEngine; using UnityEngine.Purchasing; using UnityEngine.Purchasing.Extension; using UnityEngine.Purchasing.Security; public class IAPManager : MonoBehaviour, IDetailedStoreListener { private readonly string[] _productId = { "casual.dessert.maker.diy.ice.cream.noads" }; private IStoreController m_StoreController; private IExtensionProvider m_StoreExtensionProvider; private ConfigurationBuilder builder; private readonly string environment = "production"; private Action _iapCallback = null; private DateTime timeFirstPurchase; [HideInInspector] public bool IsInitIAPDone = false; [HideInInspector] public string NoAdsPrice = ""; private bool _isNoads; private void Awake() { IsInitIAPDone = false; } private bool IsInitialized() { return m_StoreController != null && m_StoreExtensionProvider != null; } private async void Start() { try { var options = new InitializationOptions().SetEnvironmentName(environment); await UnityServices.InitializeAsync(options); InitializePurchasing(); } catch (Exception) { // An error occurred during initialization. } } public void RestorePurchases() { if (!IsInitialized()) { Debug.Log("No initialized IAP !"); return; } if (UserData.IsNoAds) { UIManager.Instance.ShowToast(Localization.Instance.GetStr(61)); return; } if (Application.platform == RuntimePlatform.IPhonePlayer || Application.platform == RuntimePlatform.OSXPlayer) { //Debug.Log("RestorePurchases started ..."); var apple = m_StoreExtensionProvider.GetExtension<IAppleExtensions>(); apple.RestoreTransactions((result, _messege) => { if (result) { Debug.Log("RestorePurchases continuing: " + result + ". If no further messages, no purchases available to restore."); foreach (var item in m_StoreController.products.all) { OnPurchaseComplete(item); } } else { UIManager.Instance.ShowToast(Localization.Instance.GetStr(62)); } }); } else { Debug.Log("RestorePurchases FAIL. Not supported on this platform. Current = " + Application.platform); } } public void OnPurchaseComplete(Product product) { if (product.hasReceipt) { RestorePack(); } else { UIManager.Instance.ShowToast(Localization.Instance.GetStr(62)); } } public void RestorePack() { UserData.IsNoAds = true; GameUI.Instance.CheckBtnNoAds(); MediationManager.Instance.ShowBanner(false); UIManager.Instance.ShowToast(Localization.Instance.GetStr(63)); } private void InitializePurchasing() { if (IsInitialized()) return; builder = ConfigurationBuilder.Instance(StandardPurchasingModule.Instance()); builder.AddProduct(_productId[0], ProductType.NonConsumable); Debug.Log("Starting Initialized..."); UnityPurchasing.Initialize(this, builder); } public void OnInitialized(IStoreController controller, IExtensionProvider extensions) { m_StoreController = controller; m_StoreExtensionProvider = extensions; _isNoads = controller.products.WithID(_productId[0]).hasReceipt; Debug.Log("isNoads " + _isNoads); if (!_isNoads) { Debug.Log("IAP =====> Did not buy No Ads"); // MediationManager.Instance.ConfigForNoAds(); } else { UserData.IsNoAds = _isNoads; Debug.Log("IAP =====> Bought No Ads"); } foreach (Product item in controller.products.all) { if (item.receipt != null) { //string intro_json = (dict == null || !dict.ContainsKey(item.definition.storeSpecificId)) ? null : dict[item.definition.storeSpecificId]; if (item.definition.type == ProductType.Subscription) { SubscriptionManager p = new SubscriptionManager(item, null); SubscriptionInfo info = p.getSubscriptionInfo(); Debug.Log("SubInfo: " + info.getProductId().ToString()); Debug.Log("getExpireDate: " + info.getExpireDate().ToString()); Debug.Log("isSubscribed: " + info.isSubscribed().ToString()); } } } Debug.Log($"====> IAP Initilize successfully! IsPurchasedNodAds {UserData.IsNoAds}"); IsInitIAPDone = true; try { NoAdsPrice = controller.products.WithID(_productId[0]).metadata.localizedPriceString; } catch (Exception) { NoAdsPrice = "$2.99"; } } public void CompletePurchase(Configs.IAP_PRODUCT productType, Action callback) { if (IsInitialized()) { MediationManager.IsSkipResumeAds = true; Product product = m_StoreController.products.WithID(_productId[(int)productType]); _iapCallback = callback; if (product != null && product.availableToPurchase) { Debug.Log(string.Format("Purchasing product:" + product.definition.id.ToString())); m_StoreController.InitiatePurchase(product); } else { _iapCallback = null; SDKManager.AddTrackingEvent("IAP_Fail"); Debug.Log("BuyProductID: FAIL. Not purchasing product, either is not found or is not available for purchase"); } } else { Debug.Log("BuyProductID FAIL. Not initialized."); SDKManager.AddTrackingEvent("IAP_Fail"); } } private void LogAFPurchase(Product product) { double price = (double)product.metadata.localizedPrice; float multi = (float)(BS_Data.GetIntData("af_net_IAP_ios") * 0.01f); price *= multi; Dictionary<string, string> eventValues = new Dictionary<string, string>(); eventValues.Add(AFInAppEvents.CURRENCY, product.metadata.isoCurrencyCode); eventValues.Add(AFInAppEvents.REVENUE, price.ToString()); eventValues.Add(AFInAppEvents.QUANTITY, "1"); eventValues.Add("product_id", product.definition.id); Debug.Log("================log appfly===>>: " + price); SDKManager.AddTrackingEvent(AFInAppEvents.PURCHASE); SDKManager.PushAFEventIAP(AFInAppEvents.PURCHASE, eventValues); } public void OnPurchaseFailed(Product product, PurchaseFailureReason error) { Debug.Log($"Purchase Failed! Product: {product.definition.id}, error {error}"); SDKManager.AddTrackingEvent("IAP_Fail"); Debug.Log("fail_1"); MediationManager.IsSkipResumeAds = true; _iapCallback = null; } public void OnPurchaseFailed(Product product, PurchaseFailureDescription failureDescription) { Debug.Log($"Purchase Failed! Product: {product.definition.id}, error {failureDescription}"); SDKManager.AddTrackingEvent("IAP_Fail"); Debug.Log("fail_2"); MediationManager.IsSkipResumeAds = true; _iapCallback = null; } public void OnInitializeFailed(InitializationFailureReason error) { MediationManager.IsSkipResumeAds = true; Debug.Log($"====> IAP Initilize Failed: {error}"); } public void OnInitializeFailed(InitializationFailureReason error, string message) { MediationManager.IsSkipResumeAds = true; Debug.Log($"====> IAP Initilize Failed:{error}, message : {message} "); } public PurchaseProcessingResult ProcessPurchase(PurchaseEventArgs args) { MediationManager.IsSkipResumeAds = true; if (_iapCallback != null) { Debug.Log("go to callback of process purchase"); _iapCallback?.Invoke(); _iapCallback = null; if (!ValidatePurchase(GetProductFromStore(0))) { } } // Return a flag indicating whether this product has completely been received, or if the application needs // to be reminded of this purchase at next app launch. Use PurchaseProcessingResult.Pending when still // saving purchased products to the cloud, and when that save is delayed. return PurchaseProcessingResult.Complete; } private bool ValidatePurchase(Product product) { bool validPurchase = true; var validator = new CrossPlatformValidator(GooglePlayTangle.Data(), AppleTangle.Data(), Application.identifier); try { var result = validator.Validate(product.receipt); foreach (IPurchaseReceipt productReceipt in result) { if (productReceipt.purchaseDate >= DateTime.UtcNow.AddMinutes(-1f)) { LogAFPurchase(product); } } } catch (IAPSecurityException) { validPurchase = false; Debug.Log("===> Tuan Anh False"); } return validPurchase; } private Product GetProductFromStore(int index) { if (m_StoreController != null && m_StoreController.products != null) { return m_StoreController.products.WithID(_productId[index]); } else { InitializePurchasing(); if (m_StoreController != null && m_StoreController.products != null) { return m_StoreController.products.WithID(_productId[index]); } else { return null; } } } public string GetPricePack(Configs.IAP_PRODUCT idPack) { if (m_StoreController == null) return null; UnityEngine.Purchasing.Product product = m_StoreController.products.WithID(_productId[(int)idPack]); if (product == null) return null; return product.metadata.localizedPriceString; } }
Editor is loading...
Leave a Comment