{!See https://docs.google.com/document/d/1takg_GmIBBKKTj-GHZCwzxohpQz7Bhekivkk72kYMtE/edit for reference implementation of OneTrust, dataLayer and GTM} {!OneTrust Cookies Consent} {!OneTrust Cookies Consent end} {!dataLayer initialization push} {!dataLayer initialization push end} {!Google Tag Manager} {!Google Tag Manager end} UDP 패키지로 인앱 구매 구현 | Unity Distribution Portal | 2.1.4
docs.unity3d.com
"{0}"의 검색 결과

    목차 표시/숨기기

    UDP 패키지로 인앱 구매 구현

    UDP용 게임에서 인앱 구매를 구현하려면 다음 단계를 따르십시오.

    1. 파트너 스토어의 인벤토리를 쿼리합니다.
    2. IAP 상품을 구매합니다.
    3. 구매 상품을 소비합니다.
    4. 클라이언트 측 통합을 확인합니다.
    5. 서버에서 구매를 확인합니다.
    6. IAP 카탈로그를 작성합니다.

    이 단계를 완료하면 게임 빌드 단계로 이동할 수 있습니다.

    파트너 스토어의 인벤토리 쿼리

    초기화에 성공하면 QueryInventory 메서드를 호출합니다. 이 메서드는 파트너 스토어의 인벤토리를 쿼리합니다.

    이 메서드로 다음 작업을 수행할 수 있습니다.

    • 소비되지 않은 IAP 상품 확인
    • 제공되지 않은 구매 상품 확인
    • 상품 세부 정보 쿼리

    이 메서드는 아직 소비되지 않은 비소비성 구매와 소비성 구매에 대한 상품 정보(상품 이름, ID, 가격, 설명)를 반환합니다.

    이를 통해 앱 크래시 후 소비되지 않은 구매를 복원할 수 있습니다.


    게임에서 UDP 인벤토리로 쿼리 보내기

    상품 ID를 지정하면 지정된 IAP 상품에 대한 상품 정보를 가져올 수 있습니다.

    StoreService.QueryInventory(List<string> productIds, IPurchaseListener listener);
    

    상품 ID를 지정하지 않으면 모든 IAP 상품에 대한 상품 정보를 가져옵니다.

    StoreService.QueryInventory(IPurchaseListener listener);
    

    구매 서비스와 관련된 이벤트의 리스너를 구현합니다.

    다음은 그에 대한 예시입니다.

    public class PurchaseListener : IPurchaseListener
    {
        public void OnPurchase(PurchaseInfo purchaseInfo)
        {
            // The purchase has succeeded.
            // If the purchased product is consumable, you should consume it here.
            // Otherwise, deliver the product.
        }
    
        public void OnPurchaseFailed(string message, PurchaseInfo purchaseInfo)
        {
            Debug.Log("Purchase Failed: " + message);
        }
    
        public void OnPurchaseRepeated(string productCode)
        {
            // Some stores don't support queryInventory.
            
        }
    
        public void OnPurchaseConsume(PurchaseInfo purchaseInfo)
        {
            // The consumption succeeded.
            // You should deliver the product here.        
        }
    
        public void OnPurchaseConsumeFailed(string message, PurchaseInfo purchaseInfo)
        {
            // The consumption failed.
        }
    
        public void OnQueryInventory(Inventory inventory)
        {
            // Querying inventory succeeded.
        }
    
        public void OnQueryInventoryFailed(string message)
        {
            // Querying inventory failed.
        }
    }
    

    IAP 상품 구매

    게임에서 구매 요청을 시작하려면 사용자가 아이템을 구매할 때 Purchase 메서드를 호출하십시오. UDP는 구매 영수증을 자동으로 확인하여 구매가 유효한지 확인합니다.


    게임에서 UDP로 구매 요청 보내기

    Purchase 메서드를 호출하면 다음이 제공됩니다.

    • productId - 플레이어가 구매하려는 IAP 상품의 고유 식별자입니다.
    • developerPayload - UDP SDK로 보낼 정보입니다.
    • IPurchaseListener - 모든 구매 관련 이벤트의 결과를 알려주는 리스너입니다.

    예제:

    StoreService.Purchase(string productId, string developerPayload, IPurchaseListener listener);
    

    참고: IAP가 있는 게임에는 Purchase 메서드가 포함되어야 합니다.

    구매가 완료되면 UDP는 게임에 정보를 반환합니다.

    일부 파트너 스토어의 결제 게이트웨이는 실시간으로 결제 콜백을 가져올 수 없습니다. 이로 인해 UDP가 결제 SUCCESS 또는 FAILED 콜백을 빨리 수신할 수 없게 됩니다. 이 경우 UDP는 콜백을 FAILED로 간주합니다. 이 문제를 해결하기 위해 Unity는 서버에서 주문을 쿼리하여 최신 상태를 가져올 것을 권장합니다.

    온라인 게임의 경우 콜백 알림을 통해 게임 서버에서 구매를 확인할 수 있습니다. UDP는 UDP 설정에서 지정한 URL로 콜백 알림을 보냅니다.

    상품 소비

    소비성 상품의 경우 게임은 UDP SDK에 ‘소비’ 요청을 전송해야 합니다. 게임은 상품이 소비된 후 상품을 제공해야 합니다. 이렇게 하면 상품의 중복 제공을 방지할 수 있습니다.

    참고: OnPurchase는 PurchaseInfo를 반환합니다.

    ‘PurchaseListener' 클래스의 'OnPurchase' 이벤트에서 아이템이 소비성인지 확인합니다. 아이템이 소비성이면 아이템을 소비하고 'PurchaseListener' 클래스의 'OnPurchaseConsume'이벤트에서 구매 완료에 대한 게임 로직을 구현합니다. 예를 들면 다음과 같습니다.

    StoreService.ConsumePurchase(PurchaseInfo, IPurchaseListener);
    // implement game logic for purchase
    


    게임에서 UDP로 소비 요청 보내기

    클라이언트 측 통합 확인

    UDP는 클라이언트 측 확인을 자동으로 수행합니다. 사용자가 IAP 상품을 구매하면 파트너 스토어가 페이로드와 서명을 반환합니다. 그러고 나면 UDP SDK가 서명을 확인합니다. 확인에 실패하면 그에 따라 구매가 실패합니다.

    서버에서 구매 확인

    다음 방법 중 하나로 서버 측에서 구매를 확인할 수 있습니다.

    • 주문 쿼리
    • 콜백 알림 수신

    참고: 콜백 알림은 현재 Huawei AppGallery 스토어에서 지원되지 않습니다.

    UDP 샌드박스 환경에서 서버 측 구현을 테스트할 수 있습니다.

    주문 쿼리

    게임은 HTTP GET 요청을 호출하여 주문에 대한 UDP를 쿼리할 수 ​​있습니다.


    주문에 대한 UDP 쿼리

    GET https://distribute.dashboard.unity.com/udp/developer/api/order?orderQueryToken=\&orderId=<orderId>&clientId=<clientId>&sign=<sign>

    API는 다음과 같은 이유로 "미확인" 상태를 반환할 수 있습니다.

    • 스토어에서 현재 주문 상태를 확인할 수 없습니다.
    • 스토어가 실시간 주문 상태 쿼리를 지원하지 않습니다.

    이 경우 일정 시간 간격을 두고 QueryOrder API를 다시 시도하십시오. 스토어는 거의 실시간으로 UDP에 콜백을 보내고 UDP는 게임에 상태를 반환할 수 있습니다.

    주문 쿼리 파라미터에 대해 자세히 알아보십시오.

    콜백 알림 수신

    구매 성공 후 콜백 URL을 지정하면 UDP 서버는 게임 서버에 결제 결과를 알립니다. HTTP POST 요청을 구현하고 다음과 같은 JSON 형식의 요청 본문을 수락합니다.

    속성 이름 포맷 필수/선택 사항 설명
    payload JSON 문자열 필수 구매 주문서의 콘텐츠입니다. JSON 페이로드에 대해 자세히 알아보십시오.
    signature String 필수 페이로드의 PKCS1 v1.5 서명입니다.

    인증서 사용

    인증서를 확인하려면 Unity 클라이언트 RSA 공용 키를 사용하십시오. 인증서가 확인을 통과하면 인증서에서 RSA 공개 키를 추출하고, 이 키를 사용하여 서명을 확인할 수 있습니다. 서명을 생성하려면 RSA-SHA1 알고리즘으로 페이로드를 암호화하십시오.

    다음은 그에 대한 예시입니다.

    공용 키:

    MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA4qxbtUqsrvwk2FZ+F2J0EkUDKLdZSVE3qPgxzKxOrgScGrCZULLav9CPzRP91HN9GccvmShH2bsegP3RVtMdwU1eV7C2JdOW1sylCyKIgylCT8tLdQeUMRaIlt7fOfl+k3bkUouWJx8WnrQYM6a7oDeCGklIlekvpQ2NcS1eg7Jp646vBzyu8FMBiuj5LZOhCJg/XXs0kRpvSOBAPndUu/HgqD9aFaXNZBxMN++efxq6PnAVRzRdTtRur+OZSBGjXxgaBKrdbXCkEM3fkMgXP9egq6vnzCiQhZ7UDFXtXQ3DPqviqrTY5WsR9t4X6JxCXo6yGlQAEK/ft9MWN13nrQIDAQAB
    

    요청 본문:

    {
        "signature": "swWWZpg0/Y26XBohvqqC/for4nyhS5zwzru5s8AJI7YYC+ECHOk7KQjOyFw7cWxM3QNpd7N7E7Umy3vYwDXjV2Y4BLnuJy5gGIpO5jKU4xBNQf793FmI0Fk93YrU31QyiIjXymg1O/H1nKSJXqMz6bycBugiStqsuGp1/CctTHE0Dpv4hC6fZoNWIHYpPJQuKh4DyP1lgE32omcuKUh7IAQduRPDa+qiYJRCA8bV17xK6T8ajS3RlhKue9hjE2a21t8p017ViaOS5OWdzptUwgnWaFi6gs1k0cjdn7o/0QJEgk5j6a8WYE/S8F7YfsYcAwUQV4KY3ex0ULsH3GQEGA==",
    
        "payload": "{\"ClientId\":\"Q_sX9CXfn-rTcWmpP9VEfw\",\"CpOrderId\":\"0bckmoqhel5yd13f\",\"ProductId\":\"com.mystudio.mygame.productid1\",\"ChannelType\":\"APTOIDE\",\"Currency\":\"APPC\",\"Amount\":\"1.01\",\"Country\":\"CHINA\",\"Quantity\":1,\"Rev\":\"0\",\"Status\":\"SUCCESS\",\"PaidTime\":\"2018-09-28T06:43:20Z\",\"Extension\":\"{\\\"key\\\":\\\"value\\\"}\"}"
    }
    

    Go에서 인증서를 확인하는 방법을 보여주는 코드 샘플:

    func verify(data []byte, publicKey string, sign string) bool {
        decodePublic, err := base64.StdEncoding.DecodeString(publicKey)
        if err != nil {
            panic(err)
        }
    
        pubInterface, err := x509.ParsePKIXPublicKey(decodePublic)
        if err != nil {
            panic(err)
        }
    
        pub := pubInterface.(*rsa.PublicKey)
        decodeSign, err := base64.StdEncoding.DecodeString(sign)
        if err != nil {
            return false
        }
    
        sh1 := sha1.New()
        sh1.Write(data)
        hashData := sh1.Sum(nil)
    
        err = rsa.VerifyPKCS1v15(pub, crypto.SHA1, hashData, decodeSign)
        if err != nil {
            return false
        }
        return true
    }
    

    IAP 카탈로그 작성

    Unity는 UDP 콘솔에서 IAP 상품을 추가할 것을 권장합니다. 이렇게 하면 IAP를 정의할 수 있는 더 많은 옵션이 제공됩니다. 하지만 Unity 에디터와 UDP 콘솔이 제대로 동기화되는지 테스트하기 위해 에디터에서 IAP를 하나 이상 생성하는 것이 좋습니다.

    참고: 게임 클라이언트에서 IAP 카탈로그를 사용하지 않는 경우(예: IAP 아이템이 게임 서버에서만 유지되는 경우)에는 여전히 UDP 콘솔에서 IAP 카탈로그를 생성해야 합니다.

    1. Unity 에디터 버전 2019.4 이하에서는 UDP Settings 인스펙터 창을 엽니다.
      Unity 에디터 버전 2020.1 이상에서는 IAP Catalog 창을 엽니다.
    2. IAP Catalog 섹션에서 각 IAP 상품에 대한 상품 정보를 입력합니다.
      1. 상품 ID에 대한 요구 사항에 따라 앱 스토어에서 유효한지 확인합니다.
      2. 게임에서 정의한 IAP 상품이 IAP 카탈로그에서 설정된 것과 동일한 Product ID를 사용하는지 확인합니다.
    3. 개별 IAP 상품을 UDP 콘솔에 저장하려면 상품 옆에 있는 드롭다운에서 Push를 선택합니다.
      1. 모든 IAP 상품을 UDP 콘솔에 저장하려면 상단의 Push 버튼을 선택합니다.
    4. 더 많은 상품을 추가하려면 Add new IAP를 선택합니다.

    IAP 카탈로그가 제대로 저장되었는지 확인하려면 추가한 아이템이 UDP 콘솔에 표시되는지 확인하십시오.

    UDP를 구현하고 구성했으면 게임 빌드 단계를 따르시기 바랍니다.

    문서 개요
    맨 위로
    Copyright © 2023 Unity Technologies — 상표 및 이용약관
    • 법률정보
    • 개인정보처리방침
    • 쿠키
    • 내 개인정보 판매 금지
    • Your Privacy Choices (Cookie Settings)