> ## 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.

# Apple App Store 인앱 구매 리뎀션

> Apple App Store IAP를 만들고 PlayFab 카탈로그 번들에 매핑한 다음 Economy v2 리뎀션 API를 사용하여 플레이어가 리뎀션 과정을 진행하도록 안내합니다.

# PlayFab과 Apple App Store를 사용하여 인앱 구매 설정

이 자습서에서는 Apple App Store 인앱 구매(IAP) 아이템을 만들고, Game Manager의 카탈로그에 추가하며, 플레이어를 리뎀션 프로세스로 안내하는 방법에 대한 단계별 지침을 제공합니다.

## 필수 구성 요소

1. PlayFab [Game Manager](https://developer.playfab.com/)의 타이틀.
2. [PlayFab에서 선택한 타이틀과 Apple App Store 간의 기존 통합](/services/playfab/economy-monetization/economy-v2/marketplace/marketplace-integrations/apple).
3. [App Store Connect](https://appstoreconnect.apple.com/)에 대한 액세스.
4. **App Store Connect**에서 이미 [생성된](https://developer.apple.com/help/app-store-connect/create-an-app-record/add-a-new-app) 앱.
5. **App Store Connect**의 앱 내에 만들어진 [인앱 구매](https://developer.apple.com/help/app-store-connect/manage-in-app-purchases/create-consumable-or-non-consumable-in-app-purchases/). **인앱 구매**에는 [가격 책정](https://developer.apple.com/help/app-store-connect/manage-in-app-purchases/set-a-price-for-an-in-app-purchase)과 [지역화](https://developer.apple.com/documentation/appstoreconnectapi/app_store/in-app_purchase/in-app_purchase_localizations)가 포함되어 있어야 합니다.
6. 이미 앱의 일부인 해당 [Transaction Observer](https://developer.apple.com/documentation/storekit/in-app_purchase/original_api_for_in-app_purchase/setting_up_the_transaction_observer_for_the_payment_queue)가 있는 [Payment Queue](https://developer.apple.com/documentation/storekit/skpaymentqueue).

## 1단계: 테스트 사용자 만들기

실물 결제 없이 구매를 제대로 테스트하려면 앱의 테스트 사용자를 만드는 것부터 시작하세요.

1. [App Store Connect](https://appstoreconnect.apple.com/) > **Users and Access**로 이동합니다.

2. **Sandbox**를 선택합니다.

   <img src="https://mintcdn.com/microsoft-4404708b/68AB2fedpk3M7e-n/images/playfab/economy-monetization/economy-v2/apple-redemption/sandbox-tab-option.png?fit=max&auto=format&n=68AB2fedpk3M7e-n&q=85&s=3d00d1425e1b9adbaa9e7eefa6773510" alt="Sandbox tab option" width="804" height="76" data-path="images/playfab/economy-monetization/economy-v2/apple-redemption/sandbox-tab-option.png" />

3. **Test Accounts** 옆의 더하기 기호(**+**) 버튼을 선택합니다.

4. 양식을 채우고 **Create**를 선택합니다.

   <img src="https://mintcdn.com/microsoft-4404708b/68AB2fedpk3M7e-n/images/playfab/economy-monetization/economy-v2/apple-redemption/new-test-user-form.png?fit=max&auto=format&n=68AB2fedpk3M7e-n&q=85&s=d8a84e3ec992c3a706d09bcb7c9221cb" alt="New test user form" width="465" height="354" data-path="images/playfab/economy-monetization/economy-v2/apple-redemption/new-test-user-form.png" />

## 2단계: Game Manager에서 번들 만들기

<Note>
  **Game Manager**에서 번들을 만들기 전에 카탈로그에서 번들에 추가하려는 아이템을 이미 만들고 게시했는지 확인하세요. 이 자습서에서는 **Super Awesome Sword**라는 검을 이미 만들었다고 가정합니다. 아이템 만드는 방법에 대한 안내가 필요하면 [이 단계](/services/playfab/economy-monetization/economy-v2/tutorials/craftingGame/crafting-game-game-manager#step-4---create-your-first-item)를 참조하세요.
</Note>

**Game Manager**와 **App Store Connect** 간에 마켓플레이스 매핑을 활성화하려면 Game Manager에서 **번들**을 만들어야 합니다. 번들은 다양한 수량의 여러 아이템을 포함할 수 있으며, PlayFab은 리뎀션되면 이를 플레이어의 인벤토리에 추가합니다. **Game Manager**에서 새 **번들**을 만들려면 다음 단계를 따르세요.

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

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

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

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

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

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

   <img src="https://mintcdn.com/microsoft-4404708b/68AB2fedpk3M7e-n/images/playfab/economy-monetization/economy-v2/apple-redemption/bundle-fields.png?fit=max&auto=format&n=68AB2fedpk3M7e-n&q=85&s=186122634a38f2bb84d8eb1e59c8275f" alt="Bundle options" width="1270" height="662" data-path="images/playfab/economy-monetization/economy-v2/apple-redemption/bundle-fields.png" />

6. 페이지 끝까지 아래로 스크롤하여 플레이어가 즉시 리뎀션할 수 있도록 하려면 **Save and publish**를 선택합니다. 나중에 게시하려면 "Save as draft"를 선택합니다.

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

### 번들에 아이템 추가

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

번들에 아이템을 추가하려면 다음 단계를 따르세요.

1. 편집 모드에서 **Items** 섹션으로 이동합니다.
2. **Add**를 선택합니다. 모든 카탈로그 아이템을 표시하는 창이 나타납니다.
3. 유형별로 필터링하거나 특정 아이템을 검색할 수 있습니다.
4. **Super Awesome Sword**를 찾아 옆에 있는 **Add**를 선택합니다.
5. 마지막으로 하단의 **Add** 버튼을 선택합니다.

이렇게 하면 아이템이 번들에 추가됩니다.

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

## 3단계: 마켓플레이스 매핑 활성화

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

1. 편집 모드에서 번들로 이동합니다.
2. **Marketplace Mapping** 섹션까지 아래로 스크롤합니다.
3. **Marketplace** 드롭다운에서 원하는 마켓플레이스를 선택합니다. (이 자습서의 경우 **AppleAppStore**입니다.)
4. **Marketplace ID**의 경우 **App Store Connect**의 **Product ID**와 동일한지 확인하세요. 이 자습서에서는 **pf.commerce.ios.sas1**을 사용했습니다.
5. 마무리하려면 해당 행 오른쪽에서 **+** 를 선택하고 변경 사항을 **저장**합니다.

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

## 4단계: 구매하기

<Tip>
  이 주제에 대해 자세히 알아보려면 [In-App Purchases](https://developer.apple.com/design/human-interface-guidelines/in-app-purchase)를 참조하세요. 인앱 구매 구성 방법에 대한 개요는 [Apple's Developer Documentation](https://developer.apple.com/help/app-store-connect/configure-in-app-purchase-settings/overview-for-configuring-in-app-purchases/)을 참조하세요.
</Tip>

이제 **App Store Connect**에 **IAP**가 만들어졌고 **Game Manager**에서 **아이템**과 함께 **번들**이 구성되었으며 **번들**의 **Marketplace Mapping**이 설정되었습니다. 이제 **앱**에서 IAP를 구매하는 것으로 넘어갑니다.

앱에서 IAP 아이템이 노출되고 구매 가능해지면 [1단계](#step-1-create-test-users)에서 만든 **테스트 사용자**를 사용하여 앱에서 IAP를 구매할 수 있습니다. 이것이 완료되면 Apple의 API가 **영수증**을 반환해야 하며, 이 영수증은 PlayFab의 리뎀션 API와 함께 사용하여 구매를 검증하고 **번들**의 아이템을 플레이어에게 부여해야 합니다.

## 5단계: 인앱 구매 리뎀션

Apple의 API에서 **영수증**을 받으면 PlayFab의 **RedeemAppleAppStoreInventoryItems** API 호출을 사용하여 IAP를 성공적으로 리뎀션해야 합니다. 이 경우 인증된 플레이어에게 **Super Awesome Sword**를 부여해야 합니다.

### 두 ID가 일치하는지 확인

리뎀션 호출을 하기 전에 마켓플레이스 매핑에 **Game Manager**에서 사용한 **Alternate ID**가 **App Store Connect**의 **Product ID**와 일치하는지 확인해야 합니다.

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

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

[App Store Connect](https://appstoreconnect.apple.com/)에서 **My Apps**로 이동하여 원하는 앱을 선택한 다음 왼쪽 탐색 메뉴에서 **Features** > **In-App Purchases**로 이동하고, 마지막으로 IAP를 선택하면 IAP 메타데이터에서 **Product ID**를 볼 수 있습니다.

<img src="https://mintcdn.com/microsoft-4404708b/68AB2fedpk3M7e-n/images/playfab/economy-monetization/economy-v2/apple-redemption/app-store-connect-product-id.png?fit=max&auto=format&n=68AB2fedpk3M7e-n&q=85&s=975ebfa25d33ee63a869c1d0c485d18f" alt="App Store Connect Product ID" width="383" height="178" data-path="images/playfab/economy-monetization/economy-v2/apple-redemption/app-store-connect-product-id.png" />

### 플레이어 인증

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

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

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

### 리뎀션 호출

플레이어가 인증되고 두 ID가 모두 확인되고 일치하며 플레이어가 앱에서 구매한 **영수증**이 있으면 리뎀션 호출을 할 준비가 되었습니다. 이를 위해 **RedeemAppleAppStoreInventoryItems** API 호출을 사용합니다.

```json theme={null}
{
    "Receipt": "{Your receipt}"
}
```

리뎀션 호출은 IAP의 성공적인 구매 후 Apple이 반환한 **영수증**이라는 단일 값만 있습니다.

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

성공적인 리뎀션 호출이 실행된 후 인증된 플레이어의 인벤토리에서 **Super Awesome Sword**를 볼 수 있어야 합니다. 이는 플레이어의 트랜잭션 이력에서 해당 이벤트를 트리거합니다. 이는 [Game Manager](https://developer.playfab.com/)의 플레이어 개요 페이지 아래의 **Transaction History (V2)** 탭에서 검색할 수 있습니다.

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

## 6단계: 트랜잭션 마무리

구매한 아이템을 성공적으로 리뎀션한 후에는 트랜잭션이 구매 대기열에 무기한 남아 있지 않도록 트랜잭션을 제대로 마무리해야 합니다. 성공했거나 실패했는지에 관계없이 트랜잭션을 마무리해야 함에 유의하세요.

트랜잭션을 제대로 마무리하려면 **Apple's** [`finishTransaction(_:)`](https://developer.apple.com/documentation/storekit/skpaymentqueue/1506003-finishtransaction) 메서드를 사용해야 합니다.

<Note>
  **Apple's** [documentation](https://developer.apple.com/documentation/storekit/in-app_purchase/original_api_for_in-app_purchase/finishing_a_transaction/)을 통해 `finishTransaction(_:)`에 대한 자세한 정보를 찾을 수 있습니다.
</Note>

## 참고 항목

* [Apple 앱을 Game Manager에 성공적으로 통합하는 방법](/services/playfab/economy-monetization/economy-v2/marketplace/marketplace-integrations/apple)
* [Google 앱을 Game Manager에 성공적으로 통합하는 방법](/services/playfab/economy-monetization/economy-v2/marketplace/marketplace-integrations/google)
* [Google Play Store에서 구매할 수 있는 PlayFab 번들 설정](/services/playfab/economy-monetization/economy-v2/marketplace/marketplace-redemption/google)
