> ## Documentation Index
> Fetch the complete documentation index at: https://devdocs.xbox.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Google Marketplace 리뎀션

> Google Play 인앱 제품을 만들고, PlayFab Economy v2 번들에 매핑하고, 리뎀션 API를 사용하여 플레이어 인벤토리로 구매를 리뎀션합니다.

# Google Play Store에서 구매할 수 있는 PlayFab 번들 설정

이 자습서에서는 플레이어가 구매할 수 있도록 PlayFab 번들을 만들고 Google Marketplace의 게임에 추가하는 방법과 그 안에 포함된 아이템을 리뎀션하는 방법을 보여줍니다.

## 필수 구성 요소

1. PlayFab의 [Game Manager](https://developer.playfab.com/)의 타이틀.
2. 선택한 타이틀과 원하는 마켓플레이스 간의 기존 통합.
3. [Google Play](https://play.google.com/console/developers)에 이미 생성되고 사용 가능한 앱.
   1. 앱에 [Google Play Android Developer API](https://console.cloud.google.com/apis/library/androidpublisher.googleapis.com)가 활성화되어 있는지 확인하세요.

## 1단계: 번들 만들기

이 자습서에서는 **Google Play Console**에서 **번들**을 만드는 것부터 시작합니다.

### Google Play Console을 사용하여 번들 만들기

1. [Google Play Console](https://play.google.com/console/developers)에서 원하는 **앱**을 엽니다.

2. 왼쪽 탐색 모음에서 **Monetize** 섹션까지 아래로 스크롤하여 **In-app products**를 선택합니다.

   <img src="https://mintcdn.com/microsoft-4404708b/68AB2fedpk3M7e-n/images/playfab/economy-monetization/economy-v2/google-redemption/in-app-products-menu-option.png?fit=max&auto=format&n=68AB2fedpk3M7e-n&q=85&s=92b9e2190985623fa3dde381d41ba772" alt="In-app products menu option" width="268" height="174" data-path="images/playfab/economy-monetization/economy-v2/google-redemption/in-app-products-menu-option.png" />

3. 오른쪽 상단에서 **Create product**를 선택합니다.

   <img src="https://mintcdn.com/microsoft-4404708b/68AB2fedpk3M7e-n/images/playfab/economy-monetization/economy-v2/google-redemption/create-product-button.png?fit=max&auto=format&n=68AB2fedpk3M7e-n&q=85&s=b41920daf7ccfa83fa1dac7fe6c92079" alt="Create product button" width="167" height="49" data-path="images/playfab/economy-monetization/economy-v2/google-redemption/create-product-button.png" />

4. 원하는 **Product ID**와 번들 **Name**을 입력합니다. 이 자습서에서는 **Product ID**로 **warrior\_bundle**을 사용합니다. **Product ID**는 **Game Manager** 연결에 사용되므로 기억하세요.

   <img src="https://mintcdn.com/microsoft-4404708b/68AB2fedpk3M7e-n/images/playfab/economy-monetization/economy-v2/google-redemption/create-new-product-fields.png?fit=max&auto=format&n=68AB2fedpk3M7e-n&q=85&s=be23718de59d1064702dbbef9785639a" alt="Create new product fields" width="925" height="747" data-path="images/playfab/economy-monetization/economy-v2/google-redemption/create-new-product-fields.png" />

5. **Price** 섹션까지 아래로 스크롤하여 **Set price**를 선택합니다.

   <img src="https://mintcdn.com/microsoft-4404708b/68AB2fedpk3M7e-n/images/playfab/economy-monetization/economy-v2/google-redemption/set-price-option.png?fit=max&auto=format&n=68AB2fedpk3M7e-n&q=85&s=fb05ce5fabf21d5eab166866748c66f5" alt="Set price option" width="616" height="134" data-path="images/playfab/economy-monetization/economy-v2/google-redemption/set-price-option.png" />

6. 번들에 원하는 가격을 추가하세요(예: \$1.00). 오른쪽 하단에서 **Apply prices**를 선택합니다.

   <img src="https://mintcdn.com/microsoft-4404708b/68AB2fedpk3M7e-n/images/playfab/economy-monetization/economy-v2/google-redemption/set-price-screen.png?fit=max&auto=format&n=68AB2fedpk3M7e-n&q=85&s=5a568d7b4c64c2cd991194e08d4c917f" alt="Set price screen" width="369" height="263" data-path="images/playfab/economy-monetization/economy-v2/google-redemption/set-price-screen.png" />

7. **Save**를 선택하여 방금 번들에 만든 모든 변경 사항을 저장합니다. 저장하면 제품으로 활성화되지는 않습니다. 저장되면 활성화 옵션이 나타납니다. **Google Play Console**의 앱에서 번들을 활성화하려면 오른쪽 하단의 **Activate** 버튼을 선택합니다.

   <img src="https://mintcdn.com/microsoft-4404708b/68AB2fedpk3M7e-n/images/playfab/economy-monetization/economy-v2/google-redemption/activate-bundle-button.png?fit=max&auto=format&n=68AB2fedpk3M7e-n&q=85&s=c43485d79a2f0e4263d0bd45f8275f3a" alt="Activate bundle button" width="237" height="60" data-path="images/playfab/economy-monetization/economy-v2/google-redemption/activate-bundle-button.png" />

### Game Manager를 사용하여 번들 만들기

**Game Manager**에서 새 **번들**을 만들려면 다음 단계를 따르세요.

1. [Game Manager](https://developer.playfab.com/)로 이동하여 **Title**로 이동합니다.

2. 왼쪽 탐색 메뉴에서 **Engage** > **Economy**를 선택합니다.

   <img src="https://mintcdn.com/microsoft-4404708b/68AB2fedpk3M7e-n/images/playfab/economy-monetization/economy-v2/google-redemption/economy-menu-location.png?fit=max&auto=format&n=68AB2fedpk3M7e-n&q=85&s=8bf748433b2bf5b630a720f8875f54d8" alt="Economy menu location" width="146" height="29" data-path="images/playfab/economy-monetization/economy-v2/google-redemption/economy-menu-location.png" />

3. **Bundles** 탭을 선택합니다.

   <img src="https://mintcdn.com/microsoft-4404708b/68AB2fedpk3M7e-n/images/playfab/economy-monetization/economy-v2/google-redemption/bundles-tab.png?fit=max&auto=format&n=68AB2fedpk3M7e-n&q=85&s=171855d0a8a8d1f179c4a0a1ff099a79" alt="Bundles tab" width="513" height="46" data-path="images/playfab/economy-monetization/economy-v2/google-redemption/bundles-tab.png" />

4. **New bundle**을 선택합니다.

   <img src="https://mintcdn.com/microsoft-4404708b/68AB2fedpk3M7e-n/images/playfab/economy-monetization/economy-v2/google-redemption/new-bundle-button.png?fit=max&auto=format&n=68AB2fedpk3M7e-n&q=85&s=47c50c417bbaf9666116c4c57a6b8fc4" alt="New bundle button" width="658" height="161" data-path="images/playfab/economy-monetization/economy-v2/google-redemption/new-bundle-button.png" />

5. 아이템 및 가격 등 원하는 정보를 **번들**에 추가합니다. 이 자습서에서는 이름으로 **Warrior Bundle**을 사용합니다.

   <img src="https://mintcdn.com/microsoft-4404708b/68AB2fedpk3M7e-n/images/playfab/economy-monetization/economy-v2/google-redemption/bundle-options.png?fit=max&auto=format&n=68AB2fedpk3M7e-n&q=85&s=418ff8e0ea29852ceb78367fb3abda80" alt="bundle options" width="1563" height="781" data-path="images/playfab/economy-monetization/economy-v2/google-redemption/bundle-options.png" />

6. 페이지 끝까지 아래로 스크롤하여 즉시 게시하려면 **Save and publish**를 선택하거나, 저장하되 아직 사용할 수 없게 하려면 **Save as draft**를 선택합니다.

   <img src="https://mintcdn.com/microsoft-4404708b/68AB2fedpk3M7e-n/images/playfab/economy-monetization/economy-v2/google-redemption/save-options.png?fit=max&auto=format&n=68AB2fedpk3M7e-n&q=85&s=eeabd76a32bdcaf3b2047d248eb3d698" alt="Save option" width="302" height="42" data-path="images/playfab/economy-monetization/economy-v2/google-redemption/save-options.png" />

### 번들에 아이템 추가

번들 자체는 플레이어에게 아이템을 부여하지 않습니다. 먼저 아이템을 연결해야 하며 리뎀션되면 해당 특정 플레이어에게 해당 아이템을 부여합니다.

번들에 아이템을 추가하기 전에 카탈로그에 이미 아이템이 만들어지고 게시되었는지 확인하세요. 이미 **Fire Sword**라는 검과 **Ice Shield**라는 방패가 있습니다. 아이템 만드는 방법을 모르는 경우 [이 단계](/services/playfab/economy-monetization/economy-v2/tutorials/craftingGame/crafting-game-game-manager#step-4---create-your-first-item)를 참조하세요.

이제 번들에 추가해 봅시다! 이를 위해 아이템이 이미 만들어져 있다고 가정하고 처음 번들을 만드는 동안 추가하거나 나중에 번들 아이템을 편집하여 추가할 수 있습니다.

편집 모드에서 번들의 **Items** 섹션까지 아래로 스크롤하여 **Add** 버튼을 선택하면 카탈로그에서 사용 가능한 모든 아이템이 표시되는 창이 표시됩니다. 여기서 유형별로 필터링(Items 또는 User Generated Content (UGC) Items)하거나 특정 아이템을 검색할 수 있습니다. 추가하려는 각 아이템 옆의 **Add** 버튼을 선택하고 마지막으로 창 하단의 파란색 **Add** 버튼을 선택합니다.

<img src="https://mintcdn.com/microsoft-4404708b/68AB2fedpk3M7e-n/images/playfab/economy-monetization/economy-v2/google-redemption/add-bundle-items.png?fit=max&auto=format&n=68AB2fedpk3M7e-n&q=85&s=5555fac96752cb10974c4d251ab9a10d" alt="Add items to a bundle" width="1156" height="648" data-path="images/playfab/economy-monetization/economy-v2/google-redemption/add-bundle-items.png" />

#### Marketplace Mapping 활성화

플레이어가 앱에서 번들을 구매할 때 Game Manager에서 올바르게 구매되고 할당되도록 하려면 **Marketplace Mapping**을 구성해야 합니다. 이는 Game Manager에서 번들을 만드는 동안 수행하거나 번들이 만들어진 후 **편집 모드**에서 번들로 돌아가 수행할 수 있습니다.

1. 편집 모드에서 번들로 이동합니다.
2. **Marketplace Mapping** 섹션까지 아래로 스크롤합니다.
3. **Marketplace** 드롭다운에서 원하는 마켓플레이스를 선택합니다. (이 자습서의 경우 **GooglePlay**입니다.)
4. **Marketplace ID**의 경우 Google Play Console의 **Product ID**와 동일한지 확인하세요. 이 자습서에서는 **Warrior\_bundle**을 사용했습니다.
5. 마무리하려면 해당 행 오른쪽에서 **+** 를 선택합니다.

<img src="https://mintcdn.com/microsoft-4404708b/68AB2fedpk3M7e-n/images/playfab/economy-monetization/economy-v2/google-redemption/marketplace-mapping.png?fit=max&auto=format&n=68AB2fedpk3M7e-n&q=85&s=4c95bc354ae66871f9aa1d502063351a" alt="Marketplace Mapping" width="867" height="145" data-path="images/playfab/economy-monetization/economy-v2/google-redemption/marketplace-mapping.png" />

## 2단계: Purchase Token 생성

<Note>
  계속하기 전에 **필수 구성 요소 #3**을 완료했는지 확인하세요. 그렇지 않으면 **Purchase Token**을 생성하는 실용적인 방법이 없습니다.
</Note>

**Purchase Token**은 영수증 ID와 유사하게 각 구매에서 Google Play API에 의해 생성되는 토큰입니다. Google 문서에 따르면 "**Purchase Token**은 Google Play의 제품에 대한 구매자의 엔타이틀먼트를 나타내는 문자열입니다. Google 사용자가 특정 제품에 대해 지불했음을 나타냅니다."

구현에서는 Google Marketplace로 구매를 검증하기 위해 PlayFab API로 전송해야 하므로 해당 토큰을 저장해야 합니다. 이를 통해 PlayFab은 플레이어의 구매한 아이템을 리뎀션하고 플레이어의 인벤토리에서 부여할 수 있습니다.

토큰을 생성하려면 이미 Google Play와의 활성 통합이 있는 앱이 실행 중이어야 합니다. Google Play의 앱 등록에는 구매 가능한 아이템(또는 이 경우 번들)도 있어야 합니다. 구매를 하면 토큰이 반환되도록 코드 구현에서 Google Play의 청구 시스템을 사용해야 합니다.

요약하면 앱을 코딩할 때 청구 시스템을 사용해야 하며, 해당 청구 시스템을 통해 Google 측에서 번들을 구매할 수 있으며 **Purchase Token**을 반환합니다. 그런 다음 토큰을 PlayFab의 [Economy API](https://learn.microsoft.com/en-us/rest/api/playfab/economy/inventory/redeem-google-play-inventory-items)와 함께 사용하여 구매를 리뎀션하고 번들 아이템을 플레이어의 인벤토리에 추가해야 합니다.

<Tip>
  Google 시스템을 사용하는 유사한 프로젝트의 구현 예제는 이 [CodeLab](https://codelabs.developers.google.com/play-billing-codelab#0)을 참조하세요. 청구에 대한 자세한 내용은 [Google's Billing System documentation](https://developer.android.com/google/play/billing)을 참조하세요.
</Tip>

## 3단계: 번들 리뎀션

이제 **Game Manager**와 **Google Play Console** 모두에서 번들이 만들어졌으므로 플레이어 중 한 명에게 번들을 리뎀션할 수 있습니다. 이 예에서는 PlayFab의 **Economy API**의 일부인 **RedeemGooglePlayInventoryItems** 호출을 사용하여 PlayFab의 API를 사용하는 데 중점을 둡니다.

### AlternateID 확인

리뎀션 호출을 하기 전에 **Game Manager**에서 올바른 **AlternateId**가 있는지 확인하세요. **Google Play Console**의 것과 동일해야 합니다.

다음 스크린샷은 **Game Manager**의 번들 내부에서 가져온 것입니다. **Marketplace ID**는 우리가 **AlternateId**라고 부르는 것이며, 기본적으로 번들을 식별하는 또 다른 방법입니다.

<img src="https://mintcdn.com/microsoft-4404708b/68AB2fedpk3M7e-n/images/playfab/economy-monetization/economy-v2/google-redemption/marketplace-mapping.png?fit=max&auto=format&n=68AB2fedpk3M7e-n&q=85&s=4c95bc354ae66871f9aa1d502063351a" alt="Marketplace Mapping" width="867" height="145" data-path="images/playfab/economy-monetization/economy-v2/google-redemption/marketplace-mapping.png" />

**Google Play Console**에서 **Monetize** 섹션 아래의 **In-app products** 화면으로 이동합니다. 여기에서 **Warrior Bundle**을 포함한 모든 만들어진 제품을 볼 수 있습니다. **Product ID**는 두 번째 열에서 볼 수 있으며 **Game Manager**의 **AlternateId**와 동일한지 확인해야 합니다. 그렇지 않은 경우 **Game Manager**를 업데이트하세요.

<img src="https://mintcdn.com/microsoft-4404708b/68AB2fedpk3M7e-n/images/playfab/economy-monetization/economy-v2/google-redemption/google-product-id.png?fit=max&auto=format&n=68AB2fedpk3M7e-n&q=85&s=540fdae0f4ec818e566dcaff96fb82de" alt="Google Play Console Product Id" width="506" height="102" data-path="images/playfab/economy-monetization/economy-v2/google-redemption/google-product-id.png" />

### 플레이어 인증

아이템을 리뎀션하려면 [RedeemGooglePlayInventoryItems](https://learn.microsoft.com/en-us/rest/api/playfab/economy/inventory/redeem-google-play-inventory-items)를 사용합니다. 하지만 그 전에 아이템을 리뎀션하려는 플레이어가 앱에서 올바르게 인증되었는지 확인해야 하며, 이를 위해 [LoginWithGoogleAccount](https://learn.microsoft.com/en-us/rest/api/playfab/client/authentication/login-with-google-account)를 사용할 가능성이 높습니다.

<Note>
  자세한 예제는 [Unity에서 Google Play games 로그인을 사용하여 PlayFab 인증 설정](/services/playfab/identity/player-identity/platform-specific-authentication/google-sign-in-unity)을 참조하세요.
</Note>

**LoginWithGoogleAccount** 호출이 성공한 후 PlayFab의 API는 `X-EntityToken` 키가 있는 **RedeemGooglePlayInventoryItems** 헤더의 일부로 사용해야 하는 **EntityToken**을 반환합니다. API 플랫폼을 사용하여 테스트하는 경우 다음과 같이 표시됩니다.

<img src="https://mintcdn.com/microsoft-4404708b/68AB2fedpk3M7e-n/images/playfab/economy-monetization/economy-v2/google-redemption/header-keys.png?fit=max&auto=format&n=68AB2fedpk3M7e-n&q=85&s=f0198070ec5ca0f935b5aaf5b87c4da0" alt="API platform header keys" width="684" height="111" data-path="images/playfab/economy-monetization/economy-v2/google-redemption/header-keys.png" />

### 리뎀션 호출

플레이어가 인증되고 두 번들 인스턴스가 만들어지고 **Alternate ID**가 확인되었으며 **Purchase Token**이 있으면 리뎀션 호출을 할 준비가 되었습니다. 이를 위해 **RedeemGooglePlayInventoryItems** API 호출을 사용합니다.

```json theme={null}
{
    "Purchases": [
        {
            "ProductId": "warrior_bundle",
            "Token": "{Your Google Purchase Token}"
        }
    ]
}
```

호출은 간단합니다. `Product ID`(Google Play Console의 것과 일치해야 함)를 포함하는 `Purchases` 배열과 **Google Play Billing System**을 호출할 때 반환된 **Purchase Token**에 해당하는 `Token` 필드가 있습니다.

성공적인 응답에는 **timestamp**와 **MarketplaceTransactionId**와 같은 데이터와 함께 `200 status code`가 포함됩니다.

성공적인 리뎀션이 이루어진 후 플레이어의 인벤토리로 이동하면 이제 번들에 연결된 두 아이템을 모두 볼 수 있어야 합니다.

<img src="https://mintcdn.com/microsoft-4404708b/68AB2fedpk3M7e-n/images/playfab/economy-monetization/economy-v2/google-redemption/inventory-after-redemption.png?fit=max&auto=format&n=68AB2fedpk3M7e-n&q=85&s=e86cd91ff9c2e5da81f315ae071a3072" alt="Inventory after redemption" width="843" height="197" data-path="images/playfab/economy-monetization/economy-v2/google-redemption/inventory-after-redemption.png" />

각 리뎀션 작업은 지정된 플레이어의 개요 페이지 아래의 **Transaction History (V2)** 탭에서 검색할 수 있는 플레이어의 트랜잭션 이력에서 해당 이벤트 로그도 트리거하며 다음과 같이 표시됩니다.

<img src="https://mintcdn.com/microsoft-4404708b/68AB2fedpk3M7e-n/images/playfab/economy-monetization/economy-v2/google-redemption/transaction-history.png?fit=max&auto=format&n=68AB2fedpk3M7e-n&q=85&s=45757726c6c89bbd6c364effc9387162" alt="Transaction history" width="1423" height="521" data-path="images/playfab/economy-monetization/economy-v2/google-redemption/transaction-history.png" />

플레이어의 트랜잭션 이력에 있는 레코드와 함께 PlayStream 이벤트도 트리거되고 기록됩니다. **Game Manager**의 왼쪽 탐색 모음의 **Analyze** 섹션 아래에 있는 **Data** 페이지로 이동하여 타이틀의 이러한 로그에 액세스할 수 있습니다. 여기서 쿼리를 편집하여 특정 레코드를 검색하거나 기본 설정으로 실행하여 모든 것을 가져올 수 있습니다. 다음과 같이 **Event name**이 **items\_redeemed**인 레코드가 있어야 합니다.

<img src="https://mintcdn.com/microsoft-4404708b/68AB2fedpk3M7e-n/images/playfab/economy-monetization/economy-v2/google-redemption/playstream-event-log.png?fit=max&auto=format&n=68AB2fedpk3M7e-n&q=85&s=a510550be545cce753c637ea1bcdb842" alt="PlayStream event log" width="778" height="192" data-path="images/playfab/economy-monetization/economy-v2/google-redemption/playstream-event-log.png" />

두 개의 별개의 `items_redeemed` PlayStream 이벤트가 기록되어 있음을 알 수 있습니다. 이는 하나의 번들만 리뎀션했지만 번들에 두 개의 서로 다른 아이템이 포함되어 있기 때문입니다.

## 4단계: 소비

구매를 성공적으로 리뎀션한 후에는 마켓플레이스에서 제대로 **소비**되도록 해야 합니다. 이를 수행하는 방법은 다음과 같습니다.

* [Google Play Developer API](https://developers.google.com/android-publisher/api-ref/rest/v3/purchases.products/consume)의 일부인 **purchases.products.consume** 메서드 사용.
* [Google's Billing Client](https://developer.android.com/reference/com/android/billingclient/api/BillingClient#consumeAsync\(com.android.billingclient.api.ConsumeParams,%20com.android.billingclient.api.ConsumeResponseListener\))의 일부인 **BillingClient.consumeAsync** 메서드 사용.
* 또는 **Unity**와 **Unreal**에서 사용 가능한 것과 같은 기본 제공 플러그인 중 하나를 사용.

그럼에도 불구하고 소비 호출을 하기 전에(또는 Unity 또는 Unreal 플러그인에서 클라이언트가 구매 처리를 완료했음을 나타내기 전에) 리뎀션 프로세스 후 1개 이상의 성공과 **0 실패**로 `200` 응답을 받아야 합니다. `202` 응답이나 리뎀션 실패를 받은 경우 잠시 후 소비 호출을 다시 한 번 재시도할 것을 권장합니다.

## 참고 항목

* [Economy v2, Unity, Android 시작하기](/services/playfab/economy-monetization/economy-v2/tutorials/getting-started-with-unity-and-android)

* [Fraud prevention 빠른 시작](/services/playfab/economy-monetization/economy-v2/fraud-prevention/quickstart)


## Related topics

- [Marketplace 리뎀션 - 개요](/ko/services/playfab/economy-monetization/economy-v2/marketplace/marketplace-redemption/overview.md)
- [Steam Marketplace 리뎀션](/ko/services/playfab/economy-monetization/economy-v2/marketplace/marketplace-redemption/steam.md)
- [Microsoft Store Marketplace 리뎀션](/ko/services/playfab/economy-monetization/economy-v2/marketplace/marketplace-redemption/microsoft.md)
- [Marketplace 오류 처리](/ko/services/playfab/economy-monetization/economy-v2/marketplace/marketplace-error-handling.md)
- [Apple App Store 인앱 구매 리뎀션](/ko/services/playfab/economy-monetization/economy-v2/marketplace/marketplace-redemption/apple.md)
