본문 바로가기
[Unity]

[Unity] 구글 플레이 인앱 결제(IAP) 구현

by 김기승 2023. 1. 14.

1) 유니티에서 Project Settings/Services/In-App Purchasing를 활성화

- 13세 이하 어린이를 대상으로 하는 경우에는 Yes, 아니면 No

 

2) Services/In-App Purchasing/Receipt Validation Obfuscator에 라이선스 키 입력

- 수익 창출 설정 탭에서 라이선스 키를 복사할 수 있다.

- 입력 후에 Obfuscate Google Play License Key를 클릭한다.

- Project Settings/Services/In-App Purchasing 탭에서 라이선스 키를 확인할 수 있다.

 

3) 유니티 대시보드로 이동하여, 위에서 입력한 라이선스 키를 해당 부분에 입력

 

4) 인앱 상품 탭에서 '상품 만들기' 버튼을 클릭하고, 모든 입력란을 작성

- 상품 생성 후, 활성화 상태로 변경할 수 있다.

 

5) Services/In-App Purchasing/IAP Catalog에 생성한 제품 ID 입력

- 상품이 여러개면 추가하면 된다.

- Automatically initialize UnityPurchasing은 체크한다.

6) IAP를 사용하기 위한 스크립트 작성

- Purchase 함수에 제품 ID를 전달하면 구매 패널이 활성화된다.

using UnityEngine;
using UnityEngine.Purchasing;

public class IAPManager : MonoBehaviour, IStoreListener
{
    [Header("Product ID")]
    public readonly string productId_test_id = "test_id";
    public readonly string productId_test_id2 = "test_id2";

    [Header("Cache")]
    private IStoreController storeController; //구매 과정을 제어하는 함수 제공자
    private IExtensionProvider storeExtensionProvider; //여러 플랫폼을 위한 확장 처리 제공자

    private void Start()
    {
        InitUnityIAP(); //Start 문에서 초기화 필수
    }

    /* Unity IAP를 초기화하는 함수 */
    private void InitUnityIAP()
    {
        ConfigurationBuilder builder = ConfigurationBuilder.Instance(StandardPurchasingModule.Instance());

        /* 구글 플레이 상품들 추가 */
        builder.AddProduct(productId_test_id, ProductType.Consumable, new IDs() { { productId_test_id, GooglePlay.Name } });
        builder.AddProduct(productId_test_id2, ProductType.Consumable, new IDs() { { productId_test_id2, GooglePlay.Name } });

        UnityPurchasing.Initialize(this, builder);
    }

    /* 구매하는 함수 */
    public void Purchase(string productId)
    {
        Product product = storeController.products.WithID(productId); //상품 정의

        if (product != null && product.availableToPurchase) //상품이 존재하면서 구매 가능하면
        {
            storeController.InitiatePurchase(product); //구매가 가능하면 진행
        }
        else //상품이 존재하지 않거나 구매 불가능하면
        {
            Debug.Log("상품이 없거나 현재 구매가 불가능합니다");
        }
    }

    #region Interface
    /* 초기화 성공 시 실행되는 함수 */
    public void OnInitialized(IStoreController controller, IExtensionProvider extension)
    {
        Debug.Log("초기화에 성공했습니다");

        storeController = controller;
        storeExtensionProvider = extension;
    }

    /* 초기화 실패 시 실행되는 함수 */
    public void OnInitializeFailed(InitializationFailureReason error)
    {
        Debug.Log("초기화에 실패했습니다");
    }

    /* 구매에 실패했을 때 실행되는 함수 */
    public void OnPurchaseFailed(Product product, PurchaseFailureReason reason)
    {
        Debug.Log("구매에 실패했습니다");
    }

    /* 구매를 처리하는 함수 */
    public PurchaseProcessingResult ProcessPurchase(PurchaseEventArgs args)
    {
        Debug.Log("구매에 성공했습니다");

        if (args.purchasedProduct.definition.id == productId_test_id)
        {
            /* test_id 구매 처리 */
        }
        else if (args.purchasedProduct.definition.id == productId_test_id2)
        {
            /* test_id2 구매 처리 */
        }

        return PurchaseProcessingResult.Complete;
    }
    #endregion
}

 

댓글