Economy

Read more about the Economy system in Hiro here.

Store type configuration #

When making hard currency purchases, set the correct EconomyStoreType based on the player’s platform. The store type determines which platform’s receipt validation endpoint the server uses.

ValueDescription
EconomyStoreType.AppleAppstoreApple App Store
EconomyStoreType.GooglePlayGoogle Play Store
EconomyStoreType.FbinstantFacebook Instant Games
EconomyStoreType.UnspecifiedDefaults to Apple App Store

For more details on store types and purchase validation, see Virtual Store.

Initializing the economy system #

The economy system relies on the Nakama System and an ILogger, both must be passed in as dependencies via the constructor. You must also specify the store type for receipt validation.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
EconomyStoreType storeType;

#if UNITY_ANDROID
    storeType = EconomyStoreType.GooglePlay;
#elif UNITY_IOS
    storeType = EconomyStoreType.AppleAppstore;
#else
    storeType = EconomyStoreType.Unspecified;
#endif

var economySystem = new EconomySystem(logger, nakamaSystem, storeType);
systems.Add(economySystem);

Subscribing to changes in the economy system #

You can listen for changes in the economy system so that you can respond appropriately, such as updating the UI, by implementing the IObserver pattern, or use the SystemObserver<T> type which handles it for you.

1
2
3
4
5
var disposer = SystemObserver<EconomySystem>.Create(economySystem, system => {
    Instance.Logger.Info($"System updated.");

    // Update UI elements etc as necessary here...
});

Refreshing the economy system #

To ensure the economy system has the latest information from Nakama you can refresh it.

1
await economySystem.RefreshAsync();

Processing IAP purchases #

To validate a hard currency purchase, call PurchaseStoreItemAsync with the store item ID and the receipt from Unity IAP.

1
2
3
  var ack = await economySystem.PurchaseStoreItemAsync(
  product.definition.storeSpecificId,
  product.receipt);

Where product comes from Unity’s ProcessPurchase callback (PurchaseEventArgs.purchasedProduct).

The method also accepts underlying platform receipts, pass the raw receipt string in place of product.receipt. The SDK determines the format automatically:

  • Unity IAP receipt: a JSON string with a Payload key. The SDK extracts the payload and forwards it to the server.
  • Underlying platform receipt: any other non-empty string. The SDK forwards it to the server as-is.

The server handles final validation and rejects invalid receipts. An empty receipt string always fails.

Additional information #