Version: 2017.1
Tizen 스토어(Tizen Store)
스토어 구현(Implementing a Store)

CloudMoolah MOO 스토어(CloudMoolah MOO store)

Apple App Store 및 Google Play 스토어 같은 상용 온라인 서비스인 CloudMoolah MOO 스토어에서 사람들은 모바일 앱을 구매 및 판매하고 애플리케이션 내에서 아이템을 구매(‘인앱 구매’ 또는 ‘IAP’)할 수 있습니다.

MOO 스토어는 아시아 시장에서 사용 가능합니다. 사용자는 은행 및 편의점 선불 카드 같은 다양한 결제 시스템을 사용하여 충전할 수 있는 디지털 지갑을 보유합니다.

CloudMoolah MOO Store는 Unity와 호환되지만 Unity 제품은 아닙니다. 자세한 내용을 알아보려면 CloudMoolah MOO Store 설정에 대한 문서를 참조하거나 CloudMoolah Developer Portal 웹사이트인 dev.cloudmoolah.com을 방문하십시오.

이 문서에서는 사용해야 하는 기능을 명시하고 Unity APICloudMoolah API를 사용하여 스크립팅 API를 통해 구현하는 방법에 대해 설명합니다.

샘플 구현

Unity IAP의 기본 통합에는 필수 및 일부 선택적인 CloudMoolah 스크립팅 API 사용 방법을 시연하는 구현 스크립트 예제가 포함되어 있습니다.

CloudMoolah 관련 예제를 보려면 다음 작업을 수행하십시오.

  1. Assets/Plugins/UnityPurchasing/script 폴더로 이동합니다.
  2. 예제 파일인 IAPDemo.cs를 찾아서 엽니다.
  3. IAPDemo.cs에서 IMoolahConfigurationIMoolahExtension API를 검색합니다.

IMoolahConfiguration API의 appKeyhashKey는 IAPDemo.cs 파일의 Awake() 함수에서 설정됩니다. 이를 통해 앱이 스토어 백엔드와 연결됩니다.

IMoolahExtension API의 FastRegisterLogin 함수는 IAPDemo.cs 파일의 InitUI 함수에서 정의됩니다. FastRegisterLogin 함수는 게임 플레이어가 각 함수에 해당하는 GUI 버튼을 누르면 노출됩니다.

IAPDemo.cs file 파일에는 테스트 모드를 설정하고 기능을 확장하여 거래 복원을 포함시키기 위해 선택할 수 있는 API도 있습니다. 자세한 내용은 아래의 API 정의를 참조하십시오.

초기화 선행 조건

CloudMoolah MOO 스토어가 타겟인 앱에서는 Unity IAP를 초기화하기 전에 스크립팅 API를 통해 CloudMoolah appKeyhashKey를 설정해야 합니다. 앱의 CloudMoolah 개발자 대시보드에서 이러한 변수의 값을 수집하십시오.

// Configure initialization prerequisites from within an IStoreListener implementation
var module = StandardPurchasingModule.Instance();
var builder = ConfigurationBuilder.Instance(module);
builder.Configure<IMoolahConfiguration>().appKey = "d3d3cd207594ee1bd93f4564c41d463e";
builder.Configure<IMoolahConfiguration>().hashKey = "my-hash-key";
// May now initialize UnityIAP with UnityPurchasing.Initialize(this, builder)

설정 API

Unity IAP는 설정 메커니즘을 통해 초기화 전 스토어별 스크립팅 API를 지원합니다.

IMoolahConfiguration 인스턴스에는 IMoolahConfiguration moolahConfiguration = ConfigurationBuilder.Configure<IMoolahConfiguration>()을 사용하여 액세스합니다. Unity IAP 설정 API의 사용 및 액세스에 대한 자세한 내용은 Purchasing.ConfigurationBuilder.Configure를 참조하십시오.

appKey

appKey는 게임의 고유 식별자로, 신규 앱 등록 시 CloudMoolah 서버에서 생성됩니다.

구문

string IMoolahConfiguration.appKey

설명

  • 초기화하기 위해 필요합니다.

  • 게임을 고유하게 식별합니다.

  • CloudMoolah Developer Portal에서 신청합니다.

  • initialize가 호출되기 전에 설정합니다.

예제

var builder = ConfigurationBuilder.Instance(StandardPurchasingModule.Instance());
 
builder.Configure<IMoolahConfiguration>().appKey = "d3d3cd207594ee1bd93f4564c41d463";

hashKey

hashKey는 게임을 CloudMoolah MOO 스토어에서 정의할 때 게임을 고유하게 식별하고, 클라이언트 앱과 서버 스토어의 연결 보안을 강화하는 데 도움이 됩니다.

appKey는 게임의 고유 식별자로, 신규 앱 등록 시 CloudMoolah 서버에서 생성됩니다.

구문

string IMoolahConfiguration.hashKey

설명

  • 초기화하기 위해 필요합니다.

  • CloudMoolah Developer Portal에서 신청합니다.

  • 게임을 고유하게 식별하고, 개발자에 의해 정의됩니다.

  • initialize가 호출되기 전에 설정합니다.

예제

var builder = ConfigurationBuilder.Instance(StandardPurchasingModule.Instance());
 
builder.Configure<IMoolahConfiguration>().hashKey = "my-hash-key";

확장자 API

Unity IAP는 초기화 후 스토어별 스크립팅 API를 확장 메커니즘을 통해 지원합니다.

초기화 시 IStoreListener.OnInitialized API에서 반환하는 IExtensionProvider를 통해 CloudMoolah용 IMoolahExtension 인터페이스 인스턴스를 가져옵니다.

다음을 사용하여 IMoolahExtension 인스턴스를 캡처합니다.

private IMoolahExtension m_MoolahExtensions;
public void OnInitialized(IStoreController controller, IExtensionProvider extensions)
{
    m_MoolahExtensions = extensions.GetExtension<IMoolahExtension> ();
}

참고: 이 스토어별 스크립팅 API 확장자를 사용하여 비소모품 거래(문서 참조)를 복원하십시오.

구매 선행 조건: 등록 및 로그인

CloudMoolah 지갑은 선불 카드와 SMS 결제에서 실제 화폐를 가져옵니다. 거래에서는 결제 프로세스를 진행하는 도중에 지갑에 있는 화폐를 사용합니다.

따라서 CloudMoolah에서 사용자의 디지털 지갑을 생성하고 이에 액세스하려면 등록과 로그인을 통해 사용자의 신원을 확인해야 합니다.

등록

컴퓨터에서 생성된 자격 증명을 사용하여 등록하고 로그인하는 앱을 만들거나, 타사 신원 확인 서비스에서 이전에 생성된 자격 증명을 공유하는 앱을 만드는 두 가지 방법으로 사용자 개입 없이 사용자 신원을 확인할 수 있습니다. 그러면 사용자의 성명과 같이 보안 수준이 낮거나 중복 가능성이 높은 식별자 대신 무작위로 생성되는 문자 및 숫자의 문자열 등 보안 수준이 더 높은 식별자가 생성됩니다.

때에 따라 스탠드얼론 또는 오프라인 게임에서는 게임 개발자 또는 퍼블리셔의 신원 확인 서비스에 액세스하지 못할 수 있으며, 그럴 경우 사용자 자격 증명을 생성해야 할 수 있습니다. Unity SystemInfo.deviceUniqueIdentifier API의 결과를 사용하여 등록하고 사용자 식별 “암호”로 제공할 수 있습니다. 이 API를 사용할 경우 android.permission.READ_PHONE_STATE가 Android 앱의 매니페스트에 자동으로 추가됩니다.

온라인 게임의 경우에는 게임 플레이어가 게임 서버를 통해 제공되는 온라인 신원 확인 서비스를 사용할 수 있습니다. 이 경우 사용자 식별 자격 증명을 복사하여 등록 암호로 사용해야 합니다.

참고: 사용자 계정이 삭제될 때까지 동일한 등록 암호를 유지하여 사용자 지갑의 영구적인 액세스 토큰으로 사용해야 합니다.

로그인

구매를 진행하려면 로그인을 해야 하고, 로그인하려면 사용자가 등록 절차를 완료해야 합니다.

사용자는 등록 API에 암호를 하나만 제공하면 됩니다. 그러면 디지털 지갑이 생성됩니다. 등록하면 사용자 이름도 생성됩니다. API는 이 이름을 클라이언트에 다시 전달하고, 사용자가 로그인하려면 이 이름을 사용해야 합니다.

사용자는 세션당 한 번씩 로그인해야 하고, 로그인하려면 생성된 사용자 이름과 사용자를 식별하는 암호가 필요합니다. 사용자는 로그인한 후에 MOO 스토어 지원 결제 제공자를 통해 지갑에 금액을 추가한 후 구매를 시도할 수 있습니다.

사용자가 지갑을 이메일 주소에 영구적으로 바인딩하려면 Android 기기에서 구매 프로세스를 진행하는 도중에 추가 식별 자격 증명(전화번호 등)을 CloudMoolah 웹 서비스에 제공해야 합니다.

디지털 지갑 등록

구문

void IMoolahExtension.FastRegister(string CMpassword, Action<string> registerSuccessed, Action<FastRegisterError, string> registerFailed)

파라미터

  • CMpassword: CloudMoolah 사용자 시스템으로 가입하는 데 필요한 사용자 정의 암호입니다.

  • registerSuccessed: 빠른 등록(아래 참조)을 성공적으로 완료하면 전달(문자열 cmUserName)합니다.

  • registerFailed: 빠른 등록에 실패하면 오류 코드와 문자열 설명을 전달합니다.

설명

  • 구매를 위해 필요합니다.

  • FastRegister 함수는 CloudMoolah 디지털 지갑에 액세스하기 위해 CloudMoolah에서 생성하는 사용자 이름을 반환합니다. 사용자는 이후에 CloudMoolah 구매 웹 서비스에서 전체 등록을 수행하여 자신의 전화번호를 통해 지갑을 자신에게 영구적으로 바인딩할 수 있습니다.

  • 초기화 후에 호출됩니다.

예제

// Use custom password to register a CloudMoolah acount.
m_MoolahExtensions.FastRegister("CMPassword", registerSucceed, registerFailed);
 
public void registerSucceed(string cmUserName)
{
    m_CloudMoolahUserName = cmUserName;
    Debug.Log ("registerSucceed : cmUserName is " + cmUserName);
}
 
public void registerFailed(FastRegisterError error, string errorMsg)
{
    Debug.Log ("registerFailed :FastRegisterError is " + error.ToString() + ", errorMsg is " + errorMsg);
}

기존 지갑에 로그인

구문

void IMoolahExtension.Login(string CMUserName, string CMPassword, Action<LoginResultState, string> LoginResult)

파라미터

  • CMUserName: 이전 FastRegister(아래 참조) 호출에서 반환됩니다.

  • CMpassword: 이전 FastRegister(아래 참조) 호출에서 사용됩니다.

  • LoginResult: 필수입니다. (LoginResultState) 시도 결과를 (string message) 진단 메시지와 함께 전달합니다.

설명

  • 필수입니다.

  • 사용자가 CloudMoolah 사용자 이름으로 로그인합니다.

  • 모든 스탠드얼론 게임은 Unity GUID를 사용자 이름으로 사용할 수 있습니다. 이 경우 사용자가 이러한 로그인 과정 없이 구매할 수 있습니다.

예제

m_MoolahExtensions.Login(m_CloudMoolahUserName, "CMPassword", loginResult);
 
public void loginResult(LoginResultState state, string message)
{
    m_IsLoggedIn = state == LoginResultState.LoginSucceed;
}

테스트

CloudMoolah는 앱의 구매 흐름 오류 처리를 확인하고 실제 화폐를 결제하지 않고 결제를 시뮬레이션하는 로컬 테스트를 지원합니다.

개발자 모드 설정

구문

void IMoolahExtension.SetMode(CloudMoolahMode mode)

파라미터

  • mode: 수행할 구매 흐름 타입입니다.

설명

  • CloudMoolahMode를 지정하여 성공, 실패 또는 정상 작동을 활성화합니다.

예제

m_MoolahExtensions.SetMode(CloudMoolahMode.AlwaysFail); // TESTING: all purchases fail

추가 API

이전 구매 거래 복원

구문

void IMoolahExtension.RestoreTransactionID(Action<RestoreTransactionIDState> result)

파라미터

  • result: 거래 상태입니다.

설명

  • 성공적으로 결제되었지만 아직 결제 대금이 지급되지 않은 종료되지 않은 거래를 모두 반환합니다(아래의 RequestPayOut 스크립팅 API 참조).

  • 초기화 후에 호출해야 합니다.

  • 로그인을 먼저 호출해야 합니다.

예제

// Retrieve transaction identifiers, when Client does not already have transaction identifiers.
 
m_MoolahExtensions.RestoreTransactionID(( RestoreTransactionIDState restoreTransactionIDState)=>{
    // Restore complete, see ProcessPurchase for restored products
};

완전 완료 또는 소비 거래

구문

void IMoolahExtension.RequestPayOut(string transactionId, Action<string, RequestPayOutState, string> result)

파라미터

  • transactionId: 완료할 거래 식별자입니다.

  • result: TransactionId, 지급 결과 또는 오류 메시지입니다.

설명

  • 가상 아이템 전송의 핵심입니다. 오프라인 게임에 유용하거나 필요합니다. 가상 아이템 전송 후에 이 API를 사용하십시오.

  • 결제에 성공했지만 가상 아이템 전송이 완료되기 전에 게임이 종료되는 경우에 사용합니다. 스탠드얼론 게임 개발자에게는 이 사실에 대한 기록이 없으므로 개발자는 IMoolahExtension.RestoreTransactionIDIMoolahExtension.RequestPayOut을 차례로 호출하여 거래를 완료해야 합니다.

  • 온라인 게임의 경우 지급을 직접 관리할 수 있으므로 클라이언트에서 IMoolahExtension.RequestPayOut 연산을 호출하고 복원할 필요가 없습니다. 클라이언트의 게임 서버에서는 콜백 중에 전송 상태를 반환하여 IMoolahExtension.RequestPayOut 연산을 수행할 수도 있습니다.

  • ProcessPurchase에서 호출합니다.

예제

오프라인 게임의 경우 ProcessPurchase 내에서 다음을 사용합니다.

// If platform is CloudMoolah, you should do payout on a standalone game and "return PurchaseProcessingResult.Pending" at the end.
 
if (m_IsCloudMoolahStoreSelected) {
    m_MoolahExtensions.RequestPayOut (m_CloudMoolahTransactionID, (string transactionID, RequestPayOutState state, string message) => {
        msg = "ProcessPurchase requestPayOut TannsationID:" + transactionID + ",state:"+ state.ToString() + ",msg:" + message;
 
        if (state == RequestPayOutState.RequestPayOutSucceed) {
            // Finish Transaction
                    m_Controller.ConfirmPendingPurchase(e.purchasedProduct);
            //payout success, issue virtual props. 
        } else {
            //PayOut Failed , Don't issue virtual props.
        }
    });
}
 
// You should unlock the content here.
// Indicate we have handled this purchase, we will not be informed of it again.
// If platform is CloudMoolah, you should "return PurchaseProcessingResult.Pending" on a standalone game or "return PurchaseProcessingResult.Complete" on an online game.
 
return PurchaseProcessingResult.Pending;

온라인 게임의 경우:

// You should unlock the content here.
// Indicate we have handled this purchase, we will not be informed of it again.
// If platform is CloudMoolah, you should "return PurchaseProcessingResult.Pending" on a standalone game or "return PurchaseProcessingResult.Complete" on an online game.
 
return PurchaseProcessingResult.Complete;

서버에서 수신 확인

구문

void IMoolahExtension.ValidateReceipt(string transactionId, string receipt, Action<string, ValidateReceiptState, string> result

파라미터

  • transactionId: 결제 거래 ID입니다.

  • receipt: ProcessPurchase를 통해 반환되는 영수증 데이터입니다.

  • result: transactionId, 상태 열거 또는 오류 메시지입니다.

설명

  • CloudMoolah 서버에서 거래의 유효성을 검증합니다.

  • 결제 후에 호출합니다.

예제

// Validate a receipt on the server.
 
m_MoolahExtensions.ValidateReceipt(m_CloudMoolahTransactionID, m_CloudMoolahReceipt, (string transactionID, ValidateReceiptState state, string msg)=>{
    bool succeeded = state == ValidateReceiptState.ValidateSucceed;
});

상수와 열거형

AndroidStore: CloudMoolah의 추가 기능

구문

public enum AndroidStore

신규 멤버

  • CloudMoolah: CloudMoolah MOO 스토어의 Android 식별자입니다.

설명

  • CloudMoolah MOO 스토어가 Unity IAP에 대해 활성화되었음을 나타냅니다.

  • standardPurchasingModuleandroidStore 필드에서 가져옵니다.

예제

// Determine whether we are using CloudMoolah IAP. 
 
bool m_IsCloudMoolahStoreSelected = Application.platform == RuntimePlatform.Android && module.androidStore == AndroidStore.CloudMoolah;

CloudMoolah MOO 스토어 이름

구문

string AndroidStore.CloudMoolah

설명

  • CloudMoolah MOO Store를 읽기 쉽게 축약한 이름입니다.

  • 상수는 MoolahAppStore입니다.

예제

AndroidStore.CloudMoolah;

로그인 결과 코드

구문

public enum LoginResultState

멤버

  • LoginSucceed: 로그인에 성공했고 세션 토큰이 생성되었습니다.

  • UserNotExists: CMUserName을 CloudMoolah 서버에서 찾을 수 없습니다.

  • PasswordError: CMPassword가 올바르지 않습니다.

  • LoginCallBackIsNull: 콜백 파라미터가 null입니다.

  • UserOrPasswordEmpty: 사용자 이름 또는 암호가 비어 있습니다.

  • NetworkError: 네트워크 오류.

  • NotKnown: 알 수 없음.

설명

  • ICloudMoolahExtension.Login에서 이 스테이트를 반환합니다.

사용자 등록 결과 코드

구문

public enum FastRegisterError

멤버

  • PasswordEmpty: CMPassword가 비어 있습니다.

  • FastRegisterCallBackIsNull: FastRegister 콜백 파라미터가 null입니다.

  • NetworkError: 네트워크 오류.

  • NotKnown: 알 수 없는 오류입니다.

설명

  • CloudMoolah IMoolahExtension.FastRegister에서 오류 또는 예외를 반환합니다.

  • FastRegister에 실패하는 경우 콜백에서 FastRegisterError를 반환합니다.

영수증 확인

구문

public enum ValidateReceiptState

멤버

  • ValidateSucceed: 영수증 확인에 성공했습니다.

  • ValidateFailed: 영수증 확인에 실패했습니다.

  • NotKnown: 알 수 없는 오류입니다.

설명

  • 구매 완료 후, 클라이언트에서 CloudMoolah 서버에 쿼리하여 영수증이 유효한지 확인합니다.

  • 콜백에서 확인 결과를 반환합니다.

거래 식별자 복원 상태

구문

public enum RestoreTransactionIDState

멤버

  • NoTransactionRestore: 복원해야 할 거래가 없습니다.

  • RestoreSucceed: 복원에 성공했습니다.

  • RestoreFailed: 복원에 실패했습니다.

  • NotKnown: 알 수 없는 오류입니다.

설명

  • 오프라인 게임의 경우 로그인 프로세스 후의 이전 거래가 복원됩니다.

  • 오프라인 게임에만 권장됩니다.

  • 반환 상태입니다.

거래 완료 지급 요청 상태

구문

public enum RequestPayOutState

멤버

  • RequestPayOutSucceed: 결제에 성공했습니다.

  • RequestPayOutNetworkError: 결제 중에 네트워크 오류가 발생했습니다.

  • RequestPayOutFailed: 결제에 실패했습니다.

  • NotKnown: 알 수 없는 오류입니다.

설명

  • 결제 API 호출 결과입니다.

  • 연결되지 않은 오프라인 게임에만 유용하다고 간주되고, 연결된 온라인 게임에는 불필요합니다.




  • 2017–07–03 일부 편집 리뷰를 거쳐 페이지 수정됨
  • 2017–07–03 - 문서만 업데이트
Tizen 스토어(Tizen Store)
스토어 구현(Implementing a Store)