사용되는 인터페이스는?
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.");
}
}
// (생략)
}
레트로님 인앱결제 강의영상을 보진 못하였지만, 이것도 추후 참고가 될 것 같습니다.
유니티 공식 메뉴얼을 참고하여 작성하였습니다.