lib_unity_purchase/Runtime/Purchasing/Analytics/AnalyticsAdapter.cs

144 lines
5.3 KiB
C#

#if IAP_ANALYTICS_SERVICE_ENABLED
using System;
using System.Collections.Generic;
using Unity.Services.Analytics;
using UnityEngine.Purchasing.Extension;
namespace UnityEngine.Purchasing
{
class AnalyticsAdapter : IAnalyticsAdapter
{
readonly IAnalyticsService m_Analytics;
readonly ILogger m_Logger;
public AnalyticsAdapter(IAnalyticsService analytics, ILogger logger)
{
m_Analytics = analytics;
m_Logger = logger;
}
public void SendTransactionEvent(Product product)
{
var unifiedReceipt = JsonUtility.FromJson<UnifiedReceipt>(product.receipt);
var analyticsReceipt = unifiedReceipt.ToReceiptAndSignature();
var txParams = BuildTransactionParameters(product, unifiedReceipt, analyticsReceipt);
m_Analytics.Transaction(txParams);
}
TransactionParameters BuildTransactionParameters(Product product,
UnifiedReceipt unifiedReceipt, AnalyticsTransactionReceipt analyticsReceipt)
{
return new TransactionParameters
{
ProductID = product.definition.storeSpecificId,
TransactionName = GetTransactionName(product),
TransactionID = unifiedReceipt.TransactionID,
TransactionType = TransactionType.PURCHASE,
TransactionReceipt = analyticsReceipt.transactionReceipt,
TransactionReceiptSignature = analyticsReceipt.transactionReceiptSignature,
TransactionServer = analyticsReceipt.transactionServer,
ProductsReceived = GenerateItemReceivedForPurchase(product),
ProductsSpent = GenerateRealCurrencySpentOnPurchase(product)
};
}
public void SendTransactionFailedEvent(Product product, PurchaseFailureDescription description)
{
var transactionFailedParameters = BuildTransactionFailedParameters(product, BuildFailureReason(description));
m_Analytics.TransactionFailed(transactionFailedParameters);
}
static string BuildFailureReason(PurchaseFailureDescription description)
{
var failureReason = $"Failure reason: {description.reason.ToString()}";
if (string.IsNullOrEmpty(description.message))
{
failureReason += $" Failure message: {description.message}";
}
return failureReason;
}
TransactionFailedParameters BuildTransactionFailedParameters(Product product,
string failureReason)
{
return new TransactionFailedParameters
{
ProductID = product.definition.storeSpecificId,
TransactionName = GetTransactionName(product),
TransactionType = TransactionType.PURCHASE,
ProductsReceived = GenerateItemReceivedForPurchase(product),
ProductsSpent = GenerateRealCurrencySpentOnPurchase(product),
FailureReason = failureReason
};
}
static string GetTransactionName(Product product)
{
return string.IsNullOrEmpty(product.metadata.localizedTitle) ?
product.definition.storeSpecificId :
product.metadata.localizedTitle;
}
Unity.Services.Analytics.Product GenerateItemReceivedForPurchase(Product product)
{
return new Unity.Services.Analytics.Product
{
Items = new List<Item>
{
new Item
{
ItemName = product.definition.id,
ItemType = product.definition.type.ToString(),
ItemAmount = 1
}
}
};
}
Unity.Services.Analytics.Product GenerateRealCurrencySpentOnPurchase(Product product)
{
return new Unity.Services.Analytics.Product
{
RealCurrency = CreateRealCurrencyFromProduct(product)
};
}
RealCurrency CreateRealCurrencyFromProduct(Product product)
{
return new RealCurrency
{
RealCurrencyType = product.metadata.isoCurrencyCode,
RealCurrencyAmount = CheckCurrencyCodeAndExtractRealCurrencyAmount(product)
};
}
long CheckCurrencyCodeAndExtractRealCurrencyAmount(Product product)
{
if (product.metadata.isoCurrencyCode != null)
{
return ExtractRealCurrencyAmount(product);
}
else
{
m_Logger.LogIAPWarning($"The isoCurrencyCode for product ID {product.definition.id} is null. Were you trying to purchase an unavailable product? The price will be recorded as 0.");
return 0;
}
}
long ExtractRealCurrencyAmount(Product product)
{
try
{
return m_Analytics.ConvertCurrencyToMinorUnits(product.metadata.isoCurrencyCode, (double)product.metadata.localizedPrice);
}
catch (Exception)
{
m_Logger.LogIAPWarning($"Could not convert real currency amount payable for product ID {product.definition.id}. The price will be recorded as 0.");
return 0;
}
}
}
}
#endif