Skip to content
이 내용이 도움이 되었나요?

인앱 결제

앱인토스 유니티 SDK를 사용하면 C# 코드만으로 인앱 결제를 연동할 수 있어요.


결제 플로우

정상 플로우 (소모품)

  1. IAPGetProductItemList() — 상품 목록 조회
  2. IAPCreateOneTimePurchaseOrder() — 구매 주문 생성
    • ProcessProductGrant 콜백에서 상품 지급 후 true 반환
    • SDK가 자동으로 CompleteProductGrant를 호출해서 주문을 완료 처리해요

복구 플로우

앱 크래시나 네트워크 끊김 등으로 ProcessProductGrant 콜백이 호출되지 않은 경우에 사용해요.

  1. GetCompletedOrRefundedOrders() — 미처리 완료 주문 조회
  2. 각 주문에 대해 상품 지급 수행
  3. CompleteProductGrant() — 수동으로 주문 완료 처리

비소모품

한 번 구매하면 영구 소유하는 상품이에요. CompleteProductGrant 호출이 필요하지 않아요.


API

API설명
AIT.IAPGetProductItemList()등록된 상품 목록을 조회해요
AIT.IAPCreateOneTimePurchaseOrder()소모품 구매 주문을 생성해요
AIT.IAPGetPendingOrders()미처리 주문 목록을 조회해요
AIT.IAPGetCompletedOrRefundedOrders()완료/환불된 주문을 조회해요 (복구용)
AIT.IAPCompleteProductGrant()상품 지급 완료를 수동으로 처리해요 (복구용)

샘플 코드

상품 목록 조회

csharp
using AppsInToss;
using UnityEngine;

public class IAPExample : MonoBehaviour
{
    async void Start()
    {
        try
        {
            var result = await AIT.IAPGetProductItemList();
            foreach (var product in result.Products)
            {
                Debug.Log($"{product.DisplayName} ({product.Sku}) - {product.DisplayAmount}");
            }
        }
        catch (AITException ex)
        {
            Debug.LogError($"상품 조회 실패: {ex.ErrorCode} - {ex.Message}");
        }
    }
}

구매 주문 생성

csharp
using System;
using AppsInToss;
using UnityEngine;

public class IAPPurchase : MonoBehaviour
{
    private Action _purchaseDisposer;

    public void Purchase(string sku)
    {
        _purchaseDisposer?.Invoke();

        var options = new IapCreateOneTimePurchaseOrderOptionsOptions
        {
            Sku = sku,
            ProcessProductGrant = (data) =>
            {
                // 상품 지급 처리
                Debug.Log($"상품 지급: {data}");
                bool grantSuccess = GrantProduct(data);

                // true를 반환하면 SDK가 자동으로 CompleteProductGrant를 호출해요
                return grantSuccess;
            }
        };

        _purchaseDisposer = AIT.IAPCreateOneTimePurchaseOrder(
            options: options,
            onEvent: (result) =>
            {
                Debug.Log($"구매 완료: orderId={result.Data?.OrderId}, amount={result.Data?.DisplayAmount}");
            },
            onError: (error) =>
            {
                Debug.LogError($"구매 실패: {error.ErrorCode} - {error.Message}");
            }
        );
    }

    private bool GrantProduct(object data)
    {
        // 실제 게임 내 상품 지급 로직을 구현해요
        return true;
    }

    private void OnDestroy()
    {
        _purchaseDisposer?.Invoke();
    }
}

미처리 주문 복구

앱 크래시 등으로 상품 지급이 완료되지 않은 주문을 복구하는 예제예요.

csharp
using AppsInToss;
using UnityEngine;

public class IAPRecovery : MonoBehaviour
{
    async void Start()
    {
        await RecoverPendingOrders();
    }

    private async System.Threading.Tasks.Task RecoverPendingOrders()
    {
        try
        {
            // 미처리 완료 주문 조회
            var result = await AIT.IAPGetCompletedOrRefundedOrders();

            if (result.Orders == null || result.Orders.Length == 0)
            {
                Debug.Log("복구할 주문이 없어요");
                return;
            }

            foreach (var order in result.Orders)
            {
                if (order.Status == CompletedOrRefundedOrdersResultOrderStatus.REFUNDED)
                    continue;

                // 상품 지급
                GrantProduct(order.Sku);

                // 지급 완료 처리
                var args = new IAPCompleteProductGrantArgs_0
                {
                    Params = new IAPCompleteProductGrantArgs_0Params
                    {
                        OrderId = order.OrderId
                    }
                };

                bool success = await AIT.IAPCompleteProductGrant(args);
                Debug.Log($"주문 {order.OrderId} 복구 {(success ? "성공" : "실패")}");
            }
        }
        catch (AITException ex)
        {
            Debug.LogError($"주문 복구 실패: {ex.ErrorCode} - {ex.Message}");
        }
    }

    private void GrantProduct(string sku)
    {
        // SKU에 따른 상품 지급 로직
        Debug.Log($"상품 지급: {sku}");
    }
}

주의사항

TIP

  • 소모품은 반드시 ProcessProductGrant 콜백에서 상품을 지급하고 true를 반환해야 해요.
  • false를 반환하거나 콜백이 호출되지 않으면 주문이 미처리 상태로 남아요.
  • 앱 시작 시 IAPGetCompletedOrRefundedOrders()로 미처리 주문을 확인하는 것을 권장해요.
  • 실제 결제는 샌드박스 앱에서 테스트할 수 없어요. 토스 앱에서 QR 코드를 통해 테스트해 주세요.