Unity IAP: 영수증 검증 가이드
이 문서는 Unity의 인앱 결제(IAP) 시스템에서 영수증 검증을 수행하는 방법에 대해 설명합니다. Unity IAP는 여러 플랫폼에서의 영수증 검증을 지원하며, 여기서는 로컬 및 원격 검증 방법을 다룹니다.
영수증 검증의 중요성
영수증 검증은 사용자가 구매하지 않은 콘텐츠에 접근하는 것을 방지하는 역할을 합니다. 이는 사용자 경험을 높이고, 개발자에게는 수익을 보호하는 중요한 과정입니다.
검증 시점
- 로컬 검증: 클라이언트 측에서 바로 검증. 구매한 콘텐츠가 앱에 포함된 경우에 해당합니다.
- 원격 검증: 서버 측에서 수행. 콘텐츠가 다운로드되거나 릴리스되기 전에 검증이 이루어집니다.
로컬 검증
로컬 검증은 애플리케이션이 디바이스에서 직접 영수증을 검증하는 방법입니다. 이는 사용자 경험을 향상시키지만, 사기 공격에 취약할 수 있습니다. 따라서 가능한 경우 서버측 검증이 권장됩니다.
암호화 키 난독 처리
영수증 검증에는 알려진 암호화 키가 사용됩니다. 이 키는 사용자에 의해 수정되기 어려워야 하며, Unity IAP는 이를 위해 암호화 키를 난독 처리하는 도구를 제공합니다.
CrossPlatformValidator 클래스
CrossPlatformValidator
클래스를 사용하여 Google Play와 Apple 스토어의 영수증을 검증할 수 있습니다. 이 클래스는 두 가지 주요 검사를 수행합니다:
- 서명 검증을 통한 영수증의 유효성 검사
- 애플리케이션 번들 식별자 비교
코드 예제
다음은 Unity에서 영수증을 처리하는 기본적인 코드 예제입니다:
public PurchaseProcessingResult ProcessPurchase (PurchaseEventArgs e)
{
bool validPurchase = true; // Assume valid purchase
||UNITY_IOS||
|---|---|---|
var validator = new CrossPlatformValidator(GooglePlayTangle.Data(), AppleTangle.Data(), Application.bundleIdentifier);
try {
var result = validator.Validate(e.purchasedProduct.receipt);
foreach (IPurchaseReceipt productReceipt in result) {
Debug.Log($"Product ID: {productReceipt.productID}");
Debug.Log($"Purchase Date: {productReceipt.purchaseDate}");
Debug.Log($"Transaction ID: {productReceipt.transactionID}");
}
} catch (IAPSecurityException) {
Debug.Log("Invalid receipt, not unlocking content");
validPurchase = false;
}
#endif
if (validPurchase) {
// Unlock content
}
return PurchaseProcessingResult.Complete;
}
스토어별 세부 사항
각 스토어마다 영수증의 구조는 다릅니다. IPurchaseReceipt
를 통해 Google Play와 Apple 스토어에서 제공하는 각각의 서브타입에 접근할 수 있습니다. 각각의 필드를 사용하여 추가 정보를 추출할 수 있습니다.
예를 들어, Apple 영수증의 정보를 추출하려면 아래와 같은 코드를 사용할 수 있습니다:
var appleConfig = builder.Configure<IAppleConfiguration>();
var receiptData = System.Convert.FromBase64String(appleConfig.appReceipt);
AppleReceipt receipt = new AppleValidator(AppleTangle.Data()).Validate(receiptData);
foreach (AppleInAppPurchaseReceipt productReceipt in receipt.inAppPurchaseReceipts) {
Debug.Log($"Transaction Identifier: {productReceipt.transactionIdentifier}");
Debug.Log($"Product Identifier: {productReceipt.productIdentifier}");
}
결론
Unity IAP의 영수증 검증 과정은 사용자와 개발자 모두에게 중요합니다. 위의 내용을 통해 영수증 검증의 개념과 구현 방법을 이해하고, 적용할 방법에 대해 알아보셨길 바랍니다. 각 플랫폼별 세부사항과 유의사항을 확인하여 안전한 인앱 결제 환경을 조성하시기 바랍니다.