Untitled

 avatar
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