본문 바로가기

Unity

Unity - In APP Purchase 유니티 인앱결제

(유니티 버전 2022.3.20f1 기준)

(이전 버전 2021.3.15f1)

 

1. 인앱 결제 활성화

Project Settings/Services/In-App Purchasing

이전 버전에는 Services에 인앱결제 부분이 있었는데 이 버전에는 안보임

원래는 서비스에서 활성화를 해야하지만 이 부분은 제외하고, 넘어가려 했지만

원래 이 후에 Services/In-App Purchasing/Receipt Validation Obfuscator 여기에 라이센스를 입력해야 하는데

그것도 없어서 확인해보니 패키지 매니저에 인앱결제를 따로 설치해야했다.

설치하고 나니 제대로 다 생겼다.

 

2.라이센스키 복사 

이후에 구글 콘솔 -> 수익 창출 설정 -> 라이센스 키 복사

 

Project Settings/Services/In-App Purchasing

뭔가 이번 버전엔 빨간 글씨가 가득하다 무서워하지말고 유니티 대시 보드 => 서비스에서 계정을 만들었다면 자동으로 생성 되었을 거다. 그러면 그 앱에 들어가 project details를 확인하면 라이센스 란에 라이센스키 붙이고 확인 => 다시 유니티로 돌아와 Receipt obfuscator 란에도 똑같이 복사해서 붙여넣어주면 오류들이 사라진다.

 

(원래는 Receipt Validation Obfuscator 여기에도 했어야 했는데 역시 사라졌고)

 

3. 인앱 상품 설정.

구글 콘솔에서 상품을 만들어주자. 만약 안만들어진다면 앱 번들이 하나라도 올라가 있는지 확인해야함.

 

4. 스크립트 설정.

예전에 세번째 어플 만들때 코드리스 버튼으로 만들어서 코드 없이 플레이 스토어에 올렸었는데 결제가 잘 되어서 마음놓고있었는데 결제 후 2~3일인가 자동 환불 시작 ㅋㅋㅋㅋ

초반에 알아서 다행이었지..

using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Purchasing;


public class IAPManager : MonoBehaviour, IStoreListener
{
    private IStoreController storeController;
    private IExtensionProvider storeExtensionProvider;

    public const string productIDConsumable = "consumable";

    //Android 상품 ID
    private const string _Android_ConsumableId = "com.obscure.first.chracter3";
    private const string _Android_NonconsumableId = "com.studio.app.nonconsumable.android";
    private const string _Android_SubscriptionId = "com.studio.app.subscription.android";

    //iOS 상품 ID
    private const string _IOS_ConsumableId = "com.studio.app.consumable.ios";
    private const string _IOS_NonconsumableId = "com.studio.app.nonconsumable.ios";
    private const string _IOS_SubscriptionId = "com.studio.app.subscription.ios";
    private static IAPManager instance;

    int hng;
    int heropurchase;
    public static IAPManager Instance
    {
        get
        {
            if (instance != null)
            {
                return instance;
            }

            instance = FindObjectOfType<IAPManager>();

            if (instance == null)
            {
                instance = new GameObject("IAP Manager").AddComponent<IAPManager>();
            }

            return instance;
        }
    }
    private void Awake()
    {
        if (instance != null && instance != this)
        {
            Destroy(gameObject);
            return;
        }

        DontDestroyOnLoad(gameObject);
        InitUnityIAP();
    }
    
    public void Purchase(string productId)
    {

        var product = storeController.products.WithID(productId);
        if (product != null && product.availableToPurchase)
        {
            Debug.Log($"구매 시도 - {product.definition.id}");
            storeController.InitiatePurchase(product);
        }
        else
        {
            Debug.Log($"구매 시도 불가 - {productId}");
        }
    }
    public void PerChase1_Rai()
    {
        hng = 1;
        Purchase(productIDConsumable);
    }
    private void InitUnityIAP()
    {
        var builder = ConfigurationBuilder.Instance(StandardPurchasingModule.Instance());

        builder.AddProduct(productIDConsumable, ProductType.Consumable, new IDs(){
            {_Android_ConsumableId, GooglePlay.Name }
        }
        );
        builder.AddProduct(productIDNonConsumable, ProductType.NonConsumable, new IDs(){
            {_Android_NonconsumableId, GooglePlay.Name },
                        {_IOS_NonconsumableId, AppleAppStore.Name}
       }
       );

        builder.AddProduct(productIDSubscription, ProductType.Subscription, new IDs(){
            {_Android_SubscriptionId, GooglePlay.Name },
                        {_IOS_SubscriptionId, AppleAppStore.Name}
       }
       );

        UnityPurchasing.Initialize(this, builder);
    }
    public void OnInitialized(IStoreController controller, IExtensionProvider extension)
    {
        Debug.Log("유니티 IAP 초기화 성공");
        storeController = controller;
        storeExtensionProvider = extension;
    }
    public void OnInitializeFailed(InitializationFailureReason error, string message)
    {
        Debug.LogError($"유니티 IAP 초기화 실패 {error}");
    }
    public void OnInitializeFailed(InitializationFailureReason error)
    {
        Debug.LogError($"유니티 IAP 초기화 실패 {error}");
    }
    public void OnPurchaseFailed(Product product, PurchaseFailureReason reason)
    {
        Debug.LogWarning($"구매 실패 - {product.definition.id}, {reason}");
    }
    public PurchaseProcessingResult ProcessPurchase(PurchaseEventArgs args)
    {
        Debug.Log($"구매 성공 - ID : {args.purchasedProduct.definition.id}");

        //이 부분에 결제 상품 전달

        return PurchaseProcessingResult.Complete;
    }
}

 

이렇게 한 거 같은데 애플 출시할때 그냥 여기서 조금 바꾸면 ios 까지 된다고? 했는데 되더라..

 

 

ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
새 프로젝트를 이전 프로젝트에서 복사했을 때,

Services/In-App Purchasing/Configure

에 들어가면 In-App Purchasing화면이 바로 나오는데

여기서 바로 바꾸지 말고 상위 카테고리 Services로 들어가서 원래의 유니티 프로젝트를 언링크 해주고 새로 만들고 위의 단계를 진행해야함.

 

'Unity' 카테고리의 다른 글

[IOS] Unity - 빌드 정리  (4) 2024.09.26
[Unity] 파이어베이스 + 구글 로그인  (0) 2024.04.04