07
18

사용되는 인터페이스는?

IStoreController
: IStoreController 인터페이스는 Unity In-App Purchasing 시스템의 중심적인 컨트롤러 역할을 한다.
  이 인터페이스를 통해 사용자의 인앱 구매를 관리하고, 실제로 구매를 요청하고 처리하는 등의 기능을 제공한다.    게임 내에서 사용자가 구매한 상품을 처리하고, 상점과의 인터랙션을 관리하는 주요 인터페이스이다.
IStoreListener
: Unity In-App Purchasing 시스템과 상호작용하여 사용자의 구매 상태를 모니터링하고, 구매 성공 또는 실패에 따라 적절한 처리를 수행하는 역할을 담당한다. 이 인터페이스를 사용하여 다음과 같은 역할을 수행할 수 있다

1. 상점 구매 이벤트 감지
: IStoreListener를 구현하여 상점에서 구매가 성공적으로 완료되었는지, 실패했는지 등의 이벤트를 감지할 수 있다.
2. 기능 활성화
: 사용자가 구매한 상품에 따라 해당 기능을 활성화하는 처리를 수행할 수 있다. 예를 들어, 사용자가 무기 아이템을 구매했다면, IStoreListener를 통해 해당 무기를 활성화하고 플레이어가 사용할 수 있게 할 수 있다.
3. 에러 처리
: 구매 과정에서 발생하는 에러를 처리하고, 사용자에게 적절한 메시지를 표시하는 등의 예외 상황을 다룰 수 있다.
  예를 들어, OnInitialized 메서드를 통해 인앱 구매 서비스가 초기화되었을 때 필요한 작업을 수행하고,
  OnPurchaseSucceeded 메서드를 통해 구매가 성공적으로 완료되었을 때 해당 기능을 활성화할 수 있다.
IStoreExtension
: IStoreExtension 인터페이스는 Unity In-App Purchasing 시스템의 확장 기능을 구현하는 데 사용된다.
  기본적인 인앱 구매 기능 이외에 추가적인 기능이 필요할 때 이 인터페이스를 사용하여 커스텀 확장을 구현할 수 있다. 예를 들어, 특정 플랫폼에서만 지원되는 특별한 결제 방식을 구현하거나, 사용자 정보를 커스텀 서버에 저장하는 기능을 추가할 수 있다.
IExtensionProvider
: IExtensionProvider 인터페이스는 Unity In-App Purchasing 시스템의 확장 기능을 제공하는 역할을 한다.
  이 인터페이스를 통해 IStoreExtension 인터페이스를 구현한 확장 기능들을 얻고 사용할 수 있다.
  IExtensionProvider는 IStoreController 인터페이스를 통해 접근되며,
  추가적인 기능을 확장하는 모듈들을 제공하는 역할을 한다.

Unity 프로젝트 설정

1. Unity 에디터에서 프로젝트를 열고, "Window" 메뉴에서 "Package Manager"를 선택한다.

2. "Unity IAP(In-App Purchasing)" 패키지를 검색하여 설치한다.

인앱 구매 상품 등록

인앱 구매를 위해 운영체제(Android 또는 iOS)에서 지원하는 스토어에 상품을 등록해야 한다.

구글 플레이 스토어 또는 애플 앱 스토어의 개발자 콘솔에서 상품을 생성하고 상품 ID를 받아온다.

Unity IAP 초기화

"Services" 탭에서 "In-App Purchasing"을 활성화한다.

"Window" 메뉴에서 "Unity IAP"를 선택하여 Unity IAP 설정 창을 연다.

"Android" 또는 "iOS"를 선택하고, 각 스토어에 대한 상점 ID와 상품 ID를 등록한다.

Unity IAP가 초기화될 때 상품 정보를 가져오도록 설정한다.

구매 버튼 만들기

Unity 씬에 인앱 구매 버튼을 생성한다.

이 버튼을 클릭하면 사용자가 인앱 구매를 시작할 수 있도록 한다.
  • 간단한 예제
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.Purchasing;

public class PurchaseManager : MonoBehaviour
{
    public string productID = "your_product_id"; // 상품 ID

    void Start()
    {
        Button purchaseButton = GetComponent<Button>();
        purchaseButton.onClick.AddListener(OnPurchaseButtonClick);
    }

    void OnPurchaseButtonClick()
    {
        // 인앱 구매 실행
        if (IAPManager.Instance != null)
        {
            IAPManager.Instance.PurchaseProduct(productID);
        }
    }
}

구매 처리 코드 작성

인앱 구매 버튼의 클릭 이벤트를 처리하는 스크립트를 작성한다.

Unity IAP API를 사용하여 인앱 구매를 처리합니다. 예를 들어, "Purchase" 메서드를 호출하여 상품을 구매한다.
  • 간단한 예제
using System;
using UnityEngine;
using UnityEngine.Purchasing;

public class IAPManager : MonoBehaviour, IStoreListener
{
    private static IAPManager instance;
    private IStoreController storeController;
    private IExtensionProvider extensionProvider;

    public static IAPManager Instance { get { return instance; } }

    void Awake()
    {
        if (instance != null && instance != this)
        {
            Destroy(this.gameObject);
        }
        else
        {
            instance = this;
            DontDestroyOnLoad(this.gameObject);
        }
    }

    void Start()
    {
        InitializePurchasing();
    }

    void InitializePurchasing()
    {
        ConfigurationBuilder builder = ConfigurationBuilder.Instance(StandardPurchasingModule.Instance());

        builder.AddProduct(productID, ProductType.NonConsumable); // 상품 ID와 타입 지정

        UnityPurchasing.Initialize(this, builder);
    }

    public void PurchaseProduct(string productID)
    {
        if (storeController != null)
        {
            Product product = storeController.products.WithID(productID);
            if (product != null && product.availableToPurchase)
            {
                storeController.InitiatePurchase(product);
            }
            else
            {
                Debug.Log("Product not found or not available for purchase.");
            }
        }
    }

    public void OnInitialized(IStoreController controller, IExtensionProvider extensions)
    {
        storeController = controller;
        extensionProvider = extensions;
    }

    public void OnInitializeFailed(InitializationFailureReason error)
    {
        Debug.Log("Initialization failed: " + error);
    }

    public void OnPurchaseFailed(Product product, PurchaseFailureReason failureReason)
    {
        Debug.Log("Purchase failed: " + product.definition.storeSpecificId + ", Reason: " + failureReason);
    }

    public PurchaseProcessingResult ProcessPurchase(PurchaseEventArgs args)
    {
        // 구매 완료 처리
        // 여기서 영수증 유효성 검사 등의 추가 처리를 할 수 있습니다.
        return PurchaseProcessingResult.Complete;
    }
}

영수증 검증

인앱 구매를 한 사용자가 실제로 해당 상품을 구매했는지 확인하기 위해 영수증을 검증해야 한다.

영수증 검증을 통해 인앱 구매를 보다 안전하게 처리할 수 있다.

구글 플레이 스토어 또는 애플 앱 스토어로부터 받은 영수증을 서버를 통해 검증한다.
  • 간단한 예제(실제로는 서버 측에서 영수증을 검증하고, 해당 상품을 지급하거나 처리하는 로직을 구현해야 한다.)
using UnityEngine;
using System.Collections;
using System.Collections.Generic;
using System.Security.Cryptography;
using System.Text;

public class ReceiptValidator : MonoBehaviour
{
    private const string yourServerURL = "http://your_server_url/validate_receipt.php"; // 서버 URL

    public void ValidateReceipt(string receiptData)
    {
        StartCoroutine(SendReceiptToServer(receiptData));
    }

    private IEnumerator SendReceiptToServer(string receiptData)
    {
        // 서버에 영수증 데이터를 전송하고 응답 받기
        WWWForm form = new WWWForm();
        form.AddField("receipt_data", receiptData);

        WWW www = new WWW(yourServerURL, form);

        yield return www;

        if (www.error == null)
        {
            // 서버 응답 처리
            // 유효한 영수증인지 확인하고, 상품을 지급하거나 처리합니다.
        }
        else
        {
            Debug.Log("Receipt validation error: " + www.error);
        }
    }
}

인앱 상태 복원

사용자가 앱을 삭제하고 다시 설치한 경우, 이전에 구매한 상품을 복원하는 기능을 추가할 수 있다.
  • 간단한 예제
using UnityEngine;
using UnityEngine.Purchasing;

public class IAPManager : MonoBehaviour, IStoreListener
{
    // (생략)

    public void RestorePurchases()
    {
        if (storeController != null && extensionProvider != null)
        {
            extensionProvider.GetExtension<IAppleExtensions>().RestoreTransactions(OnTransactionsRestored);
            //  안드로이드의 경우 IGooglePlayStoreExtensions
        }
    }

    private void OnTransactionsRestored(bool success)
    {
        if (success)
        {
            // 복원된 구매 상품 처리
        }
        else
        {
            Debug.Log("Restore purchases failed.");
        }
    }

    // (생략)
}

레트로님 인앱결제 강의영상을 보진 못하였지만, 이것도 추후 참고가 될 것 같습니다.
유니티 공식 메뉴얼을 참고하여 작성하였습니다.

'유니티 개발 기술 > 수익화' 카테고리의 다른 글

리텐션을 높이기 위한 방안  (0) 2023.07.18
보상형 광고 구현  (0) 2023.07.17
Unity Ads  (0) 2023.07.17
COMMENT