Как отслеживать покупки в приложении

Выберите платформу: iOS+ Android Unity


Покупки в приложении – это цифровой контент или функции, которые можно продавать в мобильном приложении через Apple App Store или Google Play. В этом случае приложению не нужно обрабатывать финансовые транзакции. Примеры покупок в приложении: контент по подписке или специальные игровые предметы.

Analytics показывает события покупок в приложении в отчете "Покупки в приложении".

В приложениях Unity SDK Analytics интегрируется с Apple App Store на устройствах iOS и Google Play на устройствах Android.

В большинстве случаев SDK Analytics автоматически собирает данные о покупках в приложении без необходимости вызывать API в приложении. Требования к настройке и отслеживанию зависят от целевой платформы:

  • Android. Транзакции Google Play отслеживаются автоматически после того, как вы свяжете Google Play. При этом не нужно изменять код сайта.
  • iOS (StoreKit 1). Транзакции в App Store, совершенные с помощью API StoreKit 1, отслеживаются автоматически. При этом не нужно изменять код сайта.
  • iOS (StoreKit 2). Транзакции в App Store, выполненные с помощью API StoreKit 2, необходимо регистрировать вручную с помощью специального API Unity.

Подготовка

Реализация

Android

Для приложений Android события, связанные с покупками в приложении, можно отслеживать сразу после установки связи с Google Play. Вам не нужно писать собственный код в проекте Unity, чтобы отслеживать покупки.

iOS

Для приложений iOS стратегия реализации зависит от того, какая версия StoreKit используется в приложении:

StoreKit 1

Если в вашем приложении для совершения покупок используется StoreKit 1, SDK Аналитики автоматически регистрирует события покупки в приложении. Чтобы отслеживать эти покупки, не нужно добавлять специальный код.

StoreKit 2

Если в вашем процессе покупки используется StoreKit 2, вам нужно вручную регистрировать подтвержденные транзакции, передавая строку идентификатора транзакции в LogAppleTransactionAsync().

using Firebase.Analytics;

// Call this method once you have completed a StoreKit 2 transaction
// and have the transaction identifier.
public void LogPurchase(string transactionId) {
    FirebaseAnalytics.LogAppleTransactionAsync(transactionId).ContinueWith(task => {
        if (task.IsFaulted || task.IsCanceled) {
            Debug.LogError("Failed to log Apple purchase transaction: " + task.Exception);
        } else {
            Debug.Log("Successfully logged Apple purchase transaction");
        }
    });
}
Как получить идентификатор транзакции с помощью Unity IAP

Если в вашем проекте используется стандартный пакет Unity для покупок в приложении (UnityEngine.Purchasing), способ получения идентификатора транзакции зависит от версии Unity IAP API.

Обратный вызов подтверждения с помощью Unity IAP версии 5.2 и более поздних

В Unity IAP версии 5.2 и более поздних версий информацию о транзакциях, относящуюся к Apple, можно получить непосредственно из объекта Order в функции обратного вызова подтверждения. Вы можете передать в LogAppleTransactionAsync() либо OriginalTransactionID, либо текущий идентификатор транзакции:

using UnityEngine.Purchasing;
using Firebase.Analytics;
using Firebase.Extensions;

// Example using Unity IAP v5.2+ Order confirmation
void OnPurchaseConfirmed(Order order) {
    #if UNITY_IOS
    if (order is ConfirmedOrder confirmedOrder) {

        var appleInfo = confirmedOrder.Info.Apple;
        if (appleInfo != null) {

            string transactionId = appleInfo.OriginalTransactionID;

            if (!string.IsNullOrEmpty(transactionId)) {
                // Log the StoreKit 2 transaction with Firebase Analytics
                FirebaseAnalytics.LogAppleTransactionAsync(transactionId).ContinueWithOnMainThread(task => {
                    if (task.IsFaulted || task.IsCanceled) {
                        Debug.LogError($"Failed to log Apple purchase transaction: {task.Exception}");
                    } else {
                        Debug.Log("Successfully logged Apple purchase transaction");
                    }
                });
            } else {
                Debug.LogWarning("Apple OriginalTransactionID is null or empty. Skipping Firebase logging.");
            }
        }
    } else if (order is FailedOrder failedOrder) {
        Debug.Log($"Purchase confirmation bypassed due to failure: {failedOrder.FailureReason}");
    }
    #endif
}
Обратный вызов устаревшей версии ProcessPurchase

Если вы используете устаревший обратный вызов ProcessPurchase, то можете извлечь идентификатор транзакции из купленного товара:

using UnityEngine.Purchasing;
using Firebase.Analytics;
using Firebase.Extensions;

public PurchaseProcessingResult ProcessPurchase(PurchaseEventArgs args) {
    // Extract the transaction ID from the purchased product
    string transactionId = args.purchasedProduct.transactionID;

    #if UNITY_IOS
    // Log the StoreKit 2 transaction with Firebase Analytics
    FirebaseAnalytics.LogAppleTransactionAsync(transactionId).ContinueWithOnMainThread(task => {
        if (task.IsFaulted || task.IsCanceled) {
            Debug.LogError($"Failed to log Apple purchase transaction: {task.Exception}");
        } else {
            Debug.Log("Successfully logged Apple purchase transaction");
        }
    });
    #endif

    return PurchaseProcessingResult.Complete;
}

Как вручную регистрировать события покупки в приложении

Если вам нужно отслеживать покупки в приложении, совершенные не через Google Play или App Store (например, через альтернативные магазины, специальные платежные системы или другие торговые площадки), вы можете вручную регистрировать эти транзакции с помощью события IN_APP_PURCHASE.

using Firebase.Analytics;

public void LogCustomInAppPurchase(string productName, double value, string currencyCode, int quantity = 1)
{
    FirebaseAnalytics.LogEvent(
        FirebaseAnalytics.EventInAppPurchase,
        new Parameter(FirebaseAnalytics.ParameterProductName, productName),
        new Parameter(FirebaseAnalytics.ParameterValue, value),
        new Parameter(FirebaseAnalytics.ParameterCurrency, currencyCode),
        new Parameter(FirebaseAnalytics.ParameterQuantity, quantity)
    );
}