123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143 |
- #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
|