跳到主要内容

Extended Example (IAP)

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

This integration works seamlessly across both iOS and Android platforms, allowing you to implement in-app purchases effortlessly.

All you need to do is configure and initialize the module anywhere in your 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);
}

// ...

}

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.SDK.Common;
using Xsolla.SDK.Store;
using Xsolla.SDK.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}";
}
}
}