Version: 2019.1
Unity IAP Xiaomi 통합 가이드
스토어 구현

Unity 채널 SDK 및 API 확장 프로그램

Unity 채널 API

UnityEngine.Store 네임스페이스

AppInfo 클래스

AppInfo 클래스는 클라이언스-서버 간 통신 및 인증에 필요한 클라이언트 및 Xiaomi 자격 증명을 저장합니다.

키: 타입: 설명:
appID 문자열 Xiaomi 앱 ID
appKey 문자열 Xiaomi 앱 키
clientID 문자열 Unity 클라이언트 ID
clientKey 문자열 Unity 클라이언트 키
debug bool 디버그 모드 토글

ILoginListener 인터페이스

Xiaomi는 Mi Game Center에 퍼블리시하는 모든 앱에 대해 ILoginListener를 통한 로그인을 요구합니다.

키: 타입: 설명:
OnInitialized () void 초기화 성공 시 호출됩니다.
OnInitializedFailed (string message) void 초기화 실패 시 호출됩니다.
OnLogin () void 로그인 성공 시 호출됩니다.
OnLoginFailed (string message) void 로그인 실패 시 호출됩니다.

StoreService 클래스

Unity IAP는 StoreService 클래스를 내부적으로 사용하여 Unity 채널 SDK를 초기화합니다.

키: 타입: 설명:
정적 초기화(AppInfo appInfo, ILoginListener loginListener) void Unity 채널 SDK를 초기화합니다.
정적 로그인(AppInfo appInfo, ILoginListener loginListener) void Xiaomi 계정에 로그인합니다.

UserInfo 클래스

Unity 채널에 성공적으로 로그인하면 UserInfo 클래스가 반환됩니다. 반환되는 데이터는 정보 제공용입니다.

키: 타입: 설명:
channel 문자열 사용 중인 채널을 나타냅니다. (현재 “XIAOMI”만 표시됨)
userID 문자열 채널의 고유 사용자 ID입니다.
userLoginToken 문자열 사용자 로그인을 확인합니다. (Xiaomi IAP 통합 가이드의 서버 측 초기화 섹션 참조)

UnityEngine.ChannelPurchase 네임스페이스

IPurchaseListener 인터페이스

Unity IAP는 IPurchaseListener 인터페이스를 내부적으로 사용하여 구매 활동을 처리합니다.

다음과 같이 IPurchaseListener 클래스를 구현하여 구매 흐름 상태를 처리합니다.

using UnityEngine.ChannelPurchase;
......
private class ExamplePurchaseListener : IPurchaseListener{
    public void OnPurchase (PurchaseInfo purchaseInfo){
        Debug.Log ("Purchase Succeed: " + purchaseInfo.gameOrderId);
    }
    public void OnPurchaseFailed (string message, PurchaseInfo purchaseInfo){
        Debug.Log ("Purchase Failed: " + message);
    }
    public void OnPurchaseRepeated(string productCode){
        Debug.Log ("Purchase Repeated");
    }
    public void OnReceiptValidate (ReceiptInfo receiptInfo){
        Debug.Log ("Validate Succeed");
    }
    public void OnReceiptValidateFailed (string gameOrderId, string message){
        Debug.Log ("Validate Failed");
    }
    public void OnPurchaseConfirm (string gameOrderId){
        Debug.Log ("Confirm Succeed");
    }
    public void OnPurchaseConfirmFailed (string gameOrderId, string message){
        Debug.Log ("Confirm Failed");
    }
}
키: 타입: 설명:
OnPurchase () void 구매 성공 시 호출됩니다.
OnPurchaseFailed (string message, PurchaseInfo purchaseInfo) void 구매 실패 시 호출됩니다.
OnPurchaseRepeated (string productCode) void 비소모품 상품 재구매 시 호출됩니다.
OnReceiptValidation (ReceiptInfo receiptInfo) void PurchaseService.ValidateReceipt (...) 성공 시 호출됩니다.
OnReceiptValidationFailed (string gameOrderID, string message) void PurchaseService.ValidateReceipt (...)실패 시 호출됩니다.
OnPurchaseConfirm (string gameOrderId) void 제외 예정
OnPurchaseConfirm (string gameOrderId, string message) void 제외 예정

PurchaseService 클래스

Unity IAP는 PurchaseService 클래스를 내부적으로 사용하여 구매 활동을 초기화합니다.

구매 리스너가 구현된 상태에서 PurchaseService.Purchase 메서드를 호출하여 구매 거래를 실행합니다.

using UnityEngine.ChannelPurchase;
......
    var myPurchaseListener = new ExamplePurchaseListener ();
    PurchaseService.Purchase ("Product ID", "Game Order ID", myPurchaseListener);

상품 ID가 Xiaomi 개발자 포털에 나열됩니다. 앱이 디버그 모드에서 실행되는 경우 상품 ID가 MiGameProductCatalog.prop 파일에도 익스포트됩니다. Game Order ID는 null일 수 있습니다. Unity 채널 SDK에서 UUID를 생성합니다.

키: 타입: 설명:
static Purchase (string productCode, string gameOrderId, IPurchaseListener productListener) void 상품 구매
static ValidateReceipt (string gameOrderId, IPurchaseListener purchaseListener) void 구매 확인
static ConfirmPurchase () void 지원 중단됨(대신 ValidateReceipt (...) 사용)

PurchaseInfo 클래스

구매 후 PurchaseService.ValidateReceipt 메서드를 호출하여 구매를 확인합니다.

    PurchaseService.ValidateReceipt(gameOrderId, myPurchaseListener);

gameOrderId가 유효하면 Unity 채널에서 구매를 확인하기 위해 사용하는 signDatasignature가 포함된 ReceiptInfomyPurchaseListener에 수신됩니다.

키: 타입: 설명:
productCode 문자열 프로젝트의 고유 ID입니다. Xiaomi 개발자 포털에서 직접 설정할 수도 있습니다.
gameOrderId 문자열 주문의 구매 ID입니다.
orderQueryToken 문자열 구매를 확인하는 데 사용됩니다.

ReceiptInfo 클래스

확인은 일반적으로 게임 서버에서 수행되지만, signData를 클라이언트 쪽에서 확인할 수도 있습니다.

키: 타입: 설명:
gameOrderId 문자열 주문의 구매 ID입니다.
signData 문자열 구매 세부 정보가 포함된 JSON 문자열입니다.
signature 문자열 signData의 서명입니다.

영수증 검증 및 확장 프로그램 API

계속 진행하기 전에 Unity IAP 영수증 검증 문서를 검토하십시오. UnityEngine.Purchasing 스크립팅 API도 참조하십시오.

UnityEngine.Purchasing 네임스페이스

IUnityChannelConfigurationIUnityChannelExtensions 인터페이스는 앱 스토어 영수증 언패킹을 위한 확장 기능을 제공합니다.

구매 시에 Unity IAP CrossPlatformValidator 클래스(자세한 설명은 Receipt validation 문서 참조)와 IUnityChannelExtensions.ValidateReceipt 메서드(자세한 설명은 아래 참조)를 사용하여 로컬 영수증 검증을 수행합니다.

영수증 검증을 구현하기 전에 Xiaomi에 대해 영수증 난독 처리를 활성화합니다.

  1. 앱 스토어 설정(Xiaomi IAP 통합 가이드앱 스토어 설정 섹션 참조) 또는 Unity 클라이언트 설정 대시보드에서 앱의 Client RSA Public Key 를 얻습니다.
  2. Unity 에디터에서 Unity 채널 키를 Unity IAP 영수증 검증 난독 처리기 창(Window > Unity IAP > Receipt Validation Obfuscator)에 입력합니다. 이 창에서는 프로젝트의 공용 키를 영수증 검증 용도로 수집하고 난독 처리하고 저장합니다.
  3. 영수증 검증 난독 처리기 창에서 Obfuscate Unity Channel Public Key 를 선택하여 그 결과로 생성되는 UnityChannelTangle 데이터 파일을 프로젝트에 저장합니다.
Unity IAP 영수증 검증 난독 처리기 창. 프로젝트에서 CrossPlatformValidator와 함께 사용할 데이터 클래스를 생성합니다.
Unity IAP 영수증 검증 난독 처리기 창. 프로젝트에서 CrossPlatformValidator와 함께 사용할 데이터 클래스를 생성합니다.

IUnityChannelConfiguration 인터페이스

구매 중에 Unity 채널에서 필요한 영수증 데이터를 자동으로 가져오려면 Unity IAP를 초기화할 때 IUnityChannelConfiguration.fetchReceiptPayloadOnPurchasetrue로 설정합니다. 이렇게 하면 성공적인 구매 후에 IUnityChannelExtensions.ValidateReceipt가 내부적으로 호출됩니다. 이상적인 경우 PurchaseEventArgspurchasedProduct.receipt 필드가 IStoreListener.ProcessPurchase 성공 콜백을 트리거할 때 호출됩니다.

참고: fetchReceiptPayloadOnPurchase 플래그를 true로 설정하면 성공적인 구매 후에 암호화된 영수증 데이터를 가져오기 위한 네트워크 요청이 발생합니다. 이 두 번째 네트워크 요청이 어떤 이유로든 실패하면 ProcessPurchase 성공 콜백에서 영수증이 유효하지 않은 상품을 수신합니다.

purchasedProduct.receipt 데이터를 CrossPlatformValidator.Validate API를 통해 전달하면 완전히 검증된 영수증인 IPurchaseReceipt 가 반환됩니다. 결과가 비어 있으면 영수증 검증에 실패했음을 의미합니다. 아래 예제를 참조하십시오.

CrossPlatformValidator validator = new CrossPlatformValidator (GooglePlayTangle.Data(), AppleTangle.Data(), UnityChannelTangle.Data(), Application.identifier);

var result = validator.Validate(purchasedProduct.receipt);
키: 타입: 설명:
fetchReceiptPayloadOnPurchase bool 구매 중에 Unity 채널 영수증 데이터 수집을 자동화합니다.

IUnityChannelExtensions 인터페이스

IUnityChannelExtensions 인터페이스를 사용하여 구매를 확인하고 영수증을 검증합니다. 위 메서드에 대한 콜백은 성공을 나타내는 부울, ‘signData’ 문자열, ‘signature’ 문자열을 반환합니다. ChannelPurchase.ReceiptInfo 섹션을 참조하십시오.

참고: ValidateReceipt ()중간자 공격에 취약합니다. 클라이언트 RSA 공용 키를 사용하여 보안을 강화하십시오. Xiaomi IAP 통합 가이드앱 스토어 설정 섹션을 참조하십시오.

키: 타입: 설명:
ConfirmPurchase (string transactionID, Action<bool, string, string>, callback) void 이전 구매의 구매 상태를 수집합니다. 구매 이력에서 특히 게임 중단 또는 네트워크 시간 초과 등을 검토하는 데 사용됩니다.
ValidateReceipt (string transactionID, Action<bool, string, string>, callback) void 특정 transactionID의 영수증을 검증합니다.

UnifiedReceipt 클래스

UnifiedReceipt 클래스에는 Unity IAP가 해석할 수 있는 스토어별 거래 데이터가 있습니다. 통합된 영수증 문자열을 언패킹하는 방법은 아래 예제를 참조하십시오.

var unifiedReceipt = JsonUtility.FromJson<UnifiedReceipt>(purchEvtArg.purchasedProduct.receipt)
키: 타입: 설명:
Payload 문자열 스토어마다 다른 포맷으로 반환되는 영수증을 래핑하는 Unity IAP 래퍼입니다.
Store 문자열 구매가 발생한 스토어입니다.
TransactionID 문자열 고유 거래 ID입니다.

UnityChannelPurchaseReceipt 인터페이스

UnityChannelPurchaseReceipt를 사용하여 통합된 영수증을 추가로 Unity 채널 영수증으로 언패킹합니다. 아래 예제를 참조하십시오.

var ucReceipt = JsonUtility.FromJson<UnityChannelPurchaseReceipt>(unifiedReceipt.Payload)

아래의 추가적인 Unity 채널 영수증 데이터는 정보 제공용으로 사용하십시오.

키: 타입: 설명:
productID 문자열 구매된 상품의 고유 ID입니다.
transactionID 문자열 고유 거래 ID입니다.
orderQueryToken 문자열 주문 쿼리 토큰입니다.

런타임 시점에 스토어 식별

런타임 시점에 Xiaomi 앱 스토어가 게임에서 활성화되는지 확인하려면 다음 코드 스니핏에서 제공되는 부울 값을 사용합니다.

var module = StandardPurchasingModule.Instance();
bool m_IsUnityChannelSelected =
    Application.platform == RuntimePlatform.Android &&
    module.androidStore == AndroidStore.XiaomiMiPay;
Unity IAP Xiaomi 통합 가이드
스토어 구현