Untitled
unknown
plain_text
7 months ago
10 kB
7
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