Skip to main content

Unity InAppPurchasing

Xsolla Mobile SDK seamlessly integrates with Unity InAppPurchasing by providing an extension module for it.

All you are required to do is to configure and initialize it anywhere in the code before attempting to make a purchase.

Configuration & Initialization

public class MyIAPManager
{

// ...

public MyIAPManager()
{
var settings = XsollaStoreClientSettings.Builder.Create()
.SetProjectId(77640)
.SetLoginId("026201e3-7e40-11ea-a85b-42010aa80004")
.SetSandbox(true)
.Build();

var configuration = XsollaStoreClientConfiguration.Builder.Create()
.SetSettings(settings)
.Build();

var module = XsollaPurchasingModule.Builder.Create()
.SetConfiguration(configuration)
.Build();

var builder = ConfigurationBuilder.Instance(module);
builder.AddProduct("100_gold_coins", ProductType.Consumable, new IDs
{
{ "100_gold_coins_google", "com.mycompany.mygame.100_gold_coins_google" }
});

UnityPurchasing.Initialize(this, builder);
}

// ...

}
tip

The official Unity IAP initialization guide can be found here.

A fully-fledged implementation

We'll base our code on the existing official Unity IAP sample called "01 Buying Consumables":

publisher account 6

The code:

using UnityEngine;
using UnityEngine.Purchasing;
using UnityEngine.Purchasing.Extension;
using UnityEngine.UI;
using Xsolla.MobileSDK.Common;
using Xsolla.MobileSDK.Store;
using Xsolla.MobileSDK.UnityPurchasing;

namespace Samples.Purchasing.Core.BuyingConsumables
{
public class BuyingConsumables : MonoBehaviour, IDetailedStoreListener
{
IStoreController m_StoreController; // The Unity Purchasing system.

//Your products IDs. They should match the ids of your products in your store.
public string goldProductId = "com.mycompany.mygame.gold1";
public string diamondProductId = "com.mycompany.mygame.diamond1";

public Text GoldCountText;
public Text DiamondCountText;

int m_GoldCount;
int m_DiamondCount;

void Start()
{
InitializePurchasing();
UpdateUI();
}

void InitializePurchasing()
{
//Remove this line from the original code.
//var builder = ConfigurationBuilder.Instance(StandardPurchasingModule.Instance());

//Add these lines here..
var settings = XsollaStoreClientSettings.Builder.Create()
.SetProjectId(77640)
.SetLoginId("026201e3-7e40-11ea-a85b-42010aa80004")
.SetSandbox(true)
.Build();

var configuration = XsollaStoreClientConfiguration.Builder.Create()
.SetSettings(settings)
.Build();

var module = XsollaPurchasingModule.Builder.Create()
.SetConfiguration(configuration)
.Build();

var builder = ConfigurationBuilder.Instance(module);

//Add products that will be purchasable and indicate its type.
builder.AddProduct(goldProductId, ProductType.Consumable);
builder.AddProduct(diamondProductId, ProductType.Consumable);

UnityPurchasing.Initialize(this, builder);
}

public void BuyGold()
{
m_StoreController.InitiatePurchase(goldProductId);
}

public void BuyDiamond()
{
m_StoreController.InitiatePurchase(diamondProductId);
}

public void OnInitialized(IStoreController controller, IExtensionProvider extensions)
{
Debug.Log("In-App Purchasing successfully initialized");
m_StoreController = controller;
}

public void OnInitializeFailed(InitializationFailureReason error)
{
OnInitializeFailed(error, null);
}

public void OnInitializeFailed(InitializationFailureReason error, string message)
{
var errorMessage = $"Purchasing failed to initialize. Reason: {error}.";

if (message != null)
{
errorMessage += $" More details: {message}";
}

Debug.Log(errorMessage);
}

public PurchaseProcessingResult ProcessPurchase(PurchaseEventArgs args)
{
//Retrieve the purchased product
var product = args.purchasedProduct;

//Add the purchased product to the players inventory
if (product.definition.id == goldProductId)
{
AddGold();
}
else if (product.definition.id == diamondProductId)
{
AddDiamond();
}

Debug.Log($"Purchase Complete - Product: {product.definition.id}");

//We return Complete, informing IAP that the processing on our side is done and the transaction can be closed.
return PurchaseProcessingResult.Complete;
}

public void OnPurchaseFailed(Product product, PurchaseFailureReason failureReason)
{
Debug.Log($"Purchase failed - Product: '{product.definition.id}', PurchaseFailureReason: {failureReason}");
}

public void OnPurchaseFailed(Product product, PurchaseFailureDescription failureDescription)
{
Debug.Log($"Purchase failed - Product: '{product.definition.id}'," +
$" Purchase failure reason: {failureDescription.reason}," +
$" Purchase failure details: {failureDescription.message}");
}

void AddGold()
{
m_GoldCount++;
UpdateUI();
}

void AddDiamond()
{
m_DiamondCount++;
UpdateUI();
}

void UpdateUI()
{
GoldCountText.text = $"Your Gold: {m_GoldCount}";
DiamondCountText.text = $"Your Diamonds: {m_DiamondCount}";
}
}
}