Unity IAP 패키지는 코딩 및 코드리스 접근 방식을 통해 다음과 같은 설정을 지원한다.
Unity IAP가 애플리케이션에 구매 관련 이벤트에 대해 알리기 위해 사용하는 IStoreListener 인터페이스를 구현해야 한다.
UnityPurchasing.Initialize 메서드를 호출하여 초기화 프로세스를 시작해 리스너 구현 및 설정을 제공한다.
/// <summary>
/// Called when Unity IAP is ready to make purchases.
/// </summary>
public void OnInitialized (IStoreController controller, IExtensionProvider extensions)
{
this.controller = controller;
this.extensions = extensions;
}IStoreController의 InitiatePurchase 메서드를 호출하여 구매하고자 하는 상품을 식별한다.
ProcessPurchase 호출, 구매 실패의 경우 OnPurchaseFailed 호출로 결과를 비동기적으로 전달 받게 된다.// Example method called when the user presses a 'buy' button
// to start the purchase process.
public void OnPurchaseClicked(string productId) {
controller.InitiatePurchase(productId);
}애플리케이션이 오프라인 상태인 경우에 완료된 구매는 다음 초기화 시점에서 애플리케이션에 전송된다.
구매 처리 완료 결과
| 결과 | 설명 |
|---|---|
| PurchaseProcessingResult.Complete | 애플리케이션이 구매 처리를 완료하였으며 이에 대해 다시 알리지 않는다. |
| PurchaseProcessingResult.Pending | 애플리케이션이 아직 구매를 처리하고 있는 상태이며 애플리케이션이 다음에 실행되면 IStoreController의 ConfirmPendingPurchase 함수가 호출되지 않는 한 ProcessPurchase가 호출된다. |
구매 즉시 완료
PurchaseProcessingResult.Complete가 반환되면 Unity IAP는 거래를 아래의 다이어그램에서 보는 바와 같이 즉시 완료된다.
PurchaseProcessingResult.Complete을 반환하면 클라우드에 저장되지 않은 상태에서 애플리케이션이 삭제될 때 소모품 구매 내역이 손실될 수 있다.
비소모품이나 구독형 상품과 달리 소모품의 경우 결제 recepie를 따로 저장하고 있지 않기 때문이다.

💡 과정 설명
- APP에서 Unity IAP로 구매 요청
- Unity IAP에서 App Store로 구매 요청
- 결제 완료 후 성공 반환
- 프로세스 구매
- 프로세스 구매 결과 ‘Complete’ 전달
- transaction 종료
클라우드에 구매 저장
소비 품목 구매를 클라우드에 저장하는 경우, 구매를 성공적으로 완료한 경우에만 PurchaseProcessingResult.Pending를 반환하고 ConfirmPendingPurchase를 호출해야 한다.
Pending를 반환하는 경우 Unity IAP는 처리를 확인하기 전까지 해당 스토어 내의 거래를 유지시켜서 소비 품목이 이러한 상태일 때 사용자가 애플리케이션을 다시 설치하더라도 그 구매 내역이 손실되지 않도록 한다.

💡 과정 설명
PurchaseProcessingResult.Pending을 반환- app’s server와 통신 중에 App Store와의 Transaction이 종료되지 않기 위해
Complete가 아닌Pending을 반환함- 서버에 영수증을 전송
- Receipt 인증이 완료
- ConfirmPendingPurchase 호출
- ConfirmPendingPurchase는 영수증이 클라우드에 저장된 후에만 호출해야 한다.
- transaction 종료
IStoreController의 OnPurchaseFailed를 호출함/// <summary>
/// Called when a purchase fails.
/// </summary>
public void **OnPurchaseFailed** (Product i, PurchaseFailureReason p)
{
if (p == PurchaseFailureReason.PurchasingUnavailable) {
// IAP may be disabled in device settings.
}
}Unity IAP 설명 - Unity 메뉴얼
https://docs.unity3d.com/kr/2021.3/Manual/UnityIAPSettingUp.html