인앱 결제
앱인토스 유니티 SDK를 사용하면 C# 코드만으로 인앱 결제를 연동할 수 있어요.
결제 플로우
정상 플로우 (소모품)
IAPGetProductItemList()— 상품 목록 조회IAPCreateOneTimePurchaseOrder()— 구매 주문 생성ProcessProductGrant콜백에서 상품 지급 후true반환- SDK가 자동으로
CompleteProductGrant를 호출해서 주문을 완료 처리해요
복구 플로우
앱 크래시나 네트워크 끊김 등으로 ProcessProductGrant 콜백이 호출되지 않은 경우에 사용해요.
GetCompletedOrRefundedOrders()— 미처리 완료 주문 조회- 각 주문에 대해 상품 지급 수행
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 코드를 통해 테스트해 주세요.