다음을 통해 공유


PlayFab(Legacy Economy), Unity IAP 및 Android 시작

Important

Economy v1 API는 유지 관리 모드에 있으며 새로운 기능은 제공되지 않으며 버그 수정만 제공됩니다. v1 API는 당분간 유지될 것입니다. PlayFab Economy의 다음 버전에 대해 자세히 알아보려면 Economy v2 개요를 참조하세요!

이 자습서는 PlayFab, Unity + IAP 서비스 및 Android 과금 API를 사용하여 앱내 구매(IAP)를 설정하는 방법을 보여줍니다.

시작하기 전에

IAP 설정은 특히 귀하가 여러 서비스들이 어떻게 통합되고 협력하도록 되어있는지 잘 모르는 경우에는 지루할 수 있습니다.

다음 이미지는 Android 과금 API와 PlayFab이 어떻게 협력하여 귀하의 고객을 위해 견실한 IAP 경험을 제공하는지를 보여줍니다.

Android 과금 - PlayFab - 통합 타임라인

PlayMarket을 통해 귀하의 제품 ID가격을 설정함으로써 시작하세요. 처음에는 모든 제품이 얼굴이 없습니다 - 플레이어가 구입할 수는 있지만 PlayFab 플레이어에게는 의미 없는 디지털 주체일 뿐입니다.

그러한 주체를 유용하게 만들려면 PlayFab 품목 카탈로그에서 미러링해야 합니다. 이는 얼굴 없는 엔터티를 번들, 컨테이너 및 개별 항목으로 변환합니다.

각각 다음과 같은 자신의 독특한 얼굴을 갖고있습니다.

  • 타이틀
  • 설명
  • 태그
  • 유형
  • 이미지
  • 특성

이 모두가 ID를 공유함으로써 시장 제품에 연계됩니다.

구입할 수 있는 진짜 돈 품목에 액세스하는 가장 좋은 방법은 GetCatalogItemsGetStoreItems를 사용하는 것입니다. 이는 자유 통화 스토어들이 사용하는 동일한 API 방법이므로 프로세스가 익숙할 것입니다.

품목의 ID가 PlayFab과 외부 IAP 시스템 사이의 링크입니다. 그러므로 우리는 품목 ID를 IAP 서비스로 전달합니다.

이 지점에서 구입 프로세스가 시작됩니다. 플레이어가 IAP 인터페이스와 상호 작용하여, 구입에 성공하면 귀하는 영수증을 받습니다.

그러면 PlayFab이 영수증을 검증하고 구입을 등록하여 PlayFab 플레이어에게 방금 구입한 품목을 부여합니다.

이것이 IAP 통합이 어떻게 기능하는지에 대한 대략적 설명이며 다음 예는 실제 작용의 대부분을 보여줍니다.

고객 애플리케이션 설정

이 섹션은 매우 기본적인 애플리케이션을 구성하여 PlayFab, UnityIAP 및 Android 과금 API를 사용하는 IAP를 테스트하는 방법을 보여줍니다.

필수 구성 요소:

  • Unity 프로젝트.
  • 귀하의 타이틀과 협력하도록 구성된 가져온 PlayFab SDK.

첫 번째 단계는 UnityIAP를 설정하는 것입니다:

  1. 서비스로 이동합니다.
  2. 서비스 탭이 선택되어 있는지 확인합니다.
  3. 귀하의 Unity 서비스 프로필 또는 조직을 선택합니다.
  4. 생성 버튼을 선택합니다.

UnityIAP 서비스 설정

  1. 다음, 앱내 구매(IAP) 서비스로 이동합니다.

UnityIAP 서비스로 이동

  1. 교차 플랫폼 IAP 간소화 토글을 설정하여 서비스를 활성화합니다.

  2. 이어서 계속 버튼을 선택합니다.

UnityIAP 서비스 활성화

플러그인 목록 페이지가 나타날 것입니다.

  1. 가져오기 버튼을 선택합니다.

UnityIAP 서비스 - 플러그인 가져오기

Unity 설치 및 가져오기 절차를 모든 플러그인을 가져온 시점까지 계속하십시오.

  1. 플러그인이 설치되었는지 확인합니다.
  2. 그런 다음 AndroidIAPExample.cs라는 새 스크립트를 만듭니다.

UnityIAP 새 스크립트 만들기

AndroidIAPExample.cs에는 아래와 같은 코드가 포함됩니다(자세한 설명은 코드 주석 참조).

using PlayFab;
using PlayFab.ClientModels;
using PlayFab.Json;
using System;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Purchasing;

public class AndroidIAPExample : MonoBehaviour, IStoreListener {
    // Items list, configurable via inspector
    private List<CatalogItem> Catalog;

    // The Unity Purchasing system
    private static IStoreController m_StoreController;

    // Bootstrap the whole thing
    public void Start() {
        // Make PlayFab log in
        Login();
    }

    public void OnGUI() {
        // This line just scales the UI up for high-res devices
        // Comment it out if you find the UI too large.
        GUI.matrix = Matrix4x4.TRS(new Vector3(0, 0, 0), Quaternion.identity, new Vector3(3, 3, 3));

        // if we are not initialized, only draw a message
        if (!IsInitialized) {
            GUILayout.Label("Initializing IAP and logging in...");
            return;
        }

        // Draw menu to purchase items
        foreach (var item in Catalog) {
            if (GUILayout.Button("Buy " + item.DisplayName)) {
                // On button click buy a product
                BuyProductID(item.ItemId);
            }
        }
    }

    // This is invoked manually on Start to initiate login ops
    private void Login() {
        // Login with Android ID
        PlayFabClientAPI.LoginWithAndroidDeviceID(new LoginWithAndroidDeviceIDRequest() {
            CreateAccount = true,
            AndroidDeviceId = SystemInfo.deviceUniqueIdentifier
        }, result => {
            Debug.Log("Logged in");
            // Refresh available items
            RefreshIAPItems();
        }, error => Debug.LogError(error.GenerateErrorReport()));
    }

    private void RefreshIAPItems() {
        PlayFabClientAPI.GetCatalogItems(new GetCatalogItemsRequest(), result => {
            Catalog = result.Catalog;

            // Make UnityIAP initialize
            InitializePurchasing();
        }, error => Debug.LogError(error.GenerateErrorReport()));
    }

    // This is invoked manually on Start to initialize UnityIAP
    public void InitializePurchasing() {
        // If IAP is already initialized, return gently
        if (IsInitialized) return;

        // Create a builder for IAP service
        var builder = ConfigurationBuilder.Instance(StandardPurchasingModule.Instance(AppStore.GooglePlay));

        // Register each item from the catalog
        foreach (var item in Catalog) {
            builder.AddProduct(item.ItemId, ProductType.Consumable);
        }

        // Trigger IAP service initialization
        UnityPurchasing.Initialize(this, builder);
    }

    // We are initialized when StoreController and Extensions are set and we are logged in
    public bool IsInitialized {
        get {
            return m_StoreController != null && Catalog != null;
        }
    }

    // This is automatically invoked automatically when IAP service is initialized
    public void OnInitialized(IStoreController controller, IExtensionProvider extensions) {
        m_StoreController = controller;
    }

    // This is automatically invoked automatically when IAP service failed to initialized
    public void OnInitializeFailed(InitializationFailureReason error) {
        Debug.Log("OnInitializeFailed InitializationFailureReason:" + error);
    }

    // This is automatically invoked automatically when purchase failed
    public void OnPurchaseFailed(Product product, PurchaseFailureReason failureReason) {
        Debug.Log(string.Format("OnPurchaseFailed: FAIL. Product: '{0}', PurchaseFailureReason: {1}", product.definition.storeSpecificId, failureReason));
    }

    // This is invoked automatically when successful purchase is ready to be processed
    public PurchaseProcessingResult ProcessPurchase(PurchaseEventArgs e) {
        // NOTE: this code does not account for purchases that were pending and are
        // delivered on application start.
        // Production code should account for such case:
        // More: https://docs.unity3d.com/ScriptReference/Purchasing.PurchaseProcessingResult.Pending.html

        if (!IsInitialized) {
            return PurchaseProcessingResult.Complete;
        }

        // Test edge case where product is unknown
        if (e.purchasedProduct == null) {
            Debug.LogWarning("Attempted to process purchase with unknown product. Ignoring");
            return PurchaseProcessingResult.Complete;
        }

        // Test edge case where purchase has no receipt
        if (string.IsNullOrEmpty(e.purchasedProduct.receipt)) {
            Debug.LogWarning("Attempted to process purchase with no receipt: ignoring");
            return PurchaseProcessingResult.Complete;
        }

        Debug.Log("Processing transaction: " + e.purchasedProduct.transactionID);

        // Deserialize receipt
        var googleReceipt = GooglePurchase.FromJson(e.purchasedProduct.receipt);

        // Invoke receipt validation
        // This will not only validate a receipt, but will also grant player corresponding items
        // only if receipt is valid.
        PlayFabClientAPI.ValidateGooglePlayPurchase(new ValidateGooglePlayPurchaseRequest() {
            // Pass in currency code in ISO format
            CurrencyCode = e.purchasedProduct.metadata.isoCurrencyCode,
            // Convert and set Purchase price
            PurchasePrice = (uint)(e.purchasedProduct.metadata.localizedPrice * 100),
            // Pass in the receipt
            ReceiptJson = googleReceipt.PayloadData.json,
            // Pass in the signature
            Signature = googleReceipt.PayloadData.signature
        }, result => Debug.Log("Validation successful!"),
           error => Debug.Log("Validation failed: " + error.GenerateErrorReport())
        );

        return PurchaseProcessingResult.Complete;
    }

    // This is invoked manually to initiate purchase
    void BuyProductID(string productId) {
        // If IAP service has not been initialized, fail hard
        if (!IsInitialized) throw new Exception("IAP Service is not initialized!");

        // Pass in the product id to initiate purchase
        m_StoreController.InitiatePurchase(productId);
    }
}

// The following classes are used to deserialize JSON results provided by IAP Service
// Please, note that JSON fields are case-sensitive and should remain fields to support Unity Deserialization via JsonUtilities
public class JsonData {
    // JSON Fields, ! Case-sensitive

    public string orderId;
    public string packageName;
    public string productId;
    public long purchaseTime;
    public int purchaseState;
    public string purchaseToken;
}

public class PayloadData {
    public JsonData JsonData;

    // JSON Fields, ! Case-sensitive
    public string signature;
    public string json;

    public static PayloadData FromJson(string json) {
        var payload = JsonUtility.FromJson<PayloadData>(json);
        payload.JsonData = JsonUtility.FromJson<JsonData>(payload.json);
        return payload;
    }
}

public class GooglePurchase {
    public PayloadData PayloadData;

    // JSON Fields, ! Case-sensitive
    public string Store;
    public string TransactionID;
    public string Payload;

    public static GooglePurchase FromJson(string json) {
        var purchase = JsonUtility.FromJson<GooglePurchase>(json);
        purchase.PayloadData = PayloadData.FromJson(purchase.Payload);
        return purchase;
    }
}
  1. 코드로 불리는 새 게임 개체를 만듭니다.
  2. AndroidIAPExample 구성 요소를 추가합니다(2단계 프로세스).
  3. AndroidIAPExample 구성 요소를 추가합니다.
  4. 장면을 저장합니다.

UnityIAP 예 게임 개체 만들기

마지막으로 빌드 설정으로 이동합니다.

  1. 장면이 빌드의 장면 영역에 추가되었는지 확인합니다.
  2. Android 플랫폼을 선택합니다.
  3. 플레이어 설정 영역으로 이동합니다.
  4. 패키지 이름을 지정합니다.

참고 항목

PlayMarket 충돌을 피하기 위해 고유한 패키지 이름을 지으십시오.

UnityIAP 예 게임 개체 추가

마지막으로, 애플리케이션을 평소 대로 빌드하고, APK가 안전하고 전전한지 확인합니다.

아직은 테스트하는 방법이 없습니다. 먼저 PlayMarket과 PlayFab을 구성해야 하는 데, 다음 섹션에 설명되어 있습니다.

IAP용 PlayMarket 애플리케이션 설정

이 섹션은 PlayMarket 애플리케이션을 위한 IAP를 활성화하는 방법에 대해 설명합니다.

참고 항목

애플리케이션 자체를 설정하는 것은 이 자습서의 범위 밖입니다. 우리는 귀하가 어떤 애플리케이션을 이미 갖고 있고 그것이 적어도 알파 릴리스를 게시하도록 구성되어 있다고 간주합니다.

PlayMarket 애플리케이션 활성화

유용한 사항:

  • 그 지점에 도달하려면 APK가 업로드되어 있어야 합니다. 이전 섹션에서 구축한 APK를 사용하세요.
  • APK를 업로드하라는 메시지가 표시되면 그것을 알파 또는 베타 애플리케이션으로 업로드하여 IAP 샌드박스를 활성화할 수 있습니다.
  • 콘텐츠 등급 구성에는 애플리케이션에서 IAP가 어떻게 활성화되는지에 대한 질문이 포함될 것입니다.
  • PlayMarket은 게시자가 IAP를 사용 또는 테스트하는 것을 허용하지 않으므로 - 테스트 목적을 위해서는 다른 Google 계정을 선택하여 그것을 귀하의 알파/베타 빌드를 위한 테스터로 추가하십시오.

애플리케이션 빌드가 게시되면:

  1. 메뉴에서 앱내 제품을 선택합니다.
    • 판매자 계정을 요청 받으면, 계정을 링크하거나 생성하십시오.
  2. 새 제품 추가 버튼을 선택합니다.

PlayMarket 새 제품 추가

  1. 이 화면에서 관리 대상 제품을 선택합니다.
  2. 설명적 제품 ID를 붙입니다.
  3. 계속을 선택합니다.

PlayMarket 제품 ID 추가

PlayMarket은 타이틀 (1)설명 (2)의 작성을 요구합니다. 그러나, 우리 경우에는 거의 사용되지 않습니다.

우리는 PlayFab 서비스로부터만 데이터 항목 데이터를 가져오며, 맞는 ID만 요구합니다.

PlayMarket 제품 타이틀 설명 추가

  1. 더 멀리 스크롤하여 가격 추가 버튼을 선택합니다.

PlayMarket 제품 가격 추가

  1. 유효한 가격을 입력하십시오(가격이 각 국가/지역을 위해 어떻게 독립적으로 변환되는지 주목하세요).
  2. 적용 버튼을 선택합니다.

PlayMarket 제품 추가 현지 가격 적용

  1. 마지막으로 화면의 맨위로 되돌아가 품목의 상태를 활성으로 변경합니다.

PlayMarket 제품을 활성으로 만들기

이것으로 앱 구성이 종결되지만 몇 가지 추가 조정이 필요합니다: 먼저, 라이선스 키 저장입니다(그러면 PlayFab과 PlayMarket을 연계하는 데 매우 편리합니다.

  1. 메뉴에서 서비스 & API로 이동합니다.
  2. 그 다음 Base64 버전의 를 찾아 저장합니다.

PlayMarket 제품 라이선스 키 저장.

그 다음 단계는 IAP 테스트를 활성화하는 것입니다. 알파 및 베타 빌드를 위해 샌드박스가 자동으로 활성화되지만, 우리는 앱을 테스트할 권한이 있는 계정을 설정할 필요가 있습니다:

  1. 으로 이동합니다.
  2. 왼쪽 메뉴에서 계정 세부 정보를 찾아 선택합니다.
  3. 라이선스 테스트 영역을 찾습니다.
  4. 테스트 계정이 목록에 있는지 확인합니다.
  5. 라이선스 테스트 응답RESPOND_NORMALLY로 설정되어 있는지 확인합니다.

설정값 적용을 잊지 마세요!

PlayMarket IAP 테스트 활성화

이 시점에서 Play Market 쪽 통합을 확립해야 합니다.

PlayFab 타이틀 설정

마지막 단계는 우리 제품을 반영하는 PlayFab 타이틀을 구성하고, Google 과금 API와 통합하는 것입니다.

  1. 추가 기능을 선택합니다.
  2. 이어서 Google 추가 기능을 선택합니다.

PlayFab Google 추가 기능 열기

  1. 패키지 ID를 입력합니다.
  2. 이전 섹션에서 얻은 Google 앱 라이선스 키를 입력합니다.
  3. Google 설치 버튼을 선택하여 변경 사항을 적용합니다.

PlayFab Google 추가 기능 설치

다음 단계는 PlayFab에 우리의 황금칼 품목을 반영하는 것입니다:

  1. 경제성을 선택합니다.
  2. 하위 탭 카탈로그를 선택합니다.
  3. 새 카탈로그를 선택합니다.
  4. 카탈로그 버전 이름을 입력합니다.
  5. 카탈로그 저장을 선택합니다.

PlayFab 카탈로그 저장

카탈로그에 품목이 없는 경우, 자동으로 제거됩니다. 그렇기 때문에 새 카탈로그는 One이라는 사전 추가 품목과 함께 옵니다.

우리는 언제나 품목을 만들 수 있지만, 깔끔한 일처리를 위해 기존 One 품목을 수정합시다.

  1. PlayMarket의 ID와 일치하도록 항목 ID을 편집할 항목을 선택합니다.
  2. 이제 표시 이름을 편집하고 설명을 추가합니다.

참고 항목

이 데이터는 Play Market 품목 타이틀설명과는 무관함을 기억하십시오 - 완전히 독립적입니다.

  1. 품목가격을 지정합니다.
  2. 항목 저장을 선택하여 변경 내용을 커밋합니다.

PlayFab 카탈로그 품목 편집 및 저장

참고 항목

이 자습서에서 IAP는 주로 진짜 돈 구입을 가리킵니다. 이 때문에 우리는 특별한 진짜 돈 통화 RM을 사용합니다. PlayFab 금액은 미국 센트 단위로 정의됩니다.

  1. 품목 ID 목록의 품목을 준수합니다.

PlayFab 카탈로그 품목 목록

이로써 PlayFab 타이틀 설정이 끝납니다.

테스트

테스트 목적으로 알파/베타 버전을 사용하여 앱을 다운로드하십시오.

  • 테스트 계정과 진짜 Android 기기를 사용하십시오.
  • 앱을 시작하면 IAP가 초기화되고, 품목을 나타내는 한 버튼이 보여야 합니다.
  • 그 버튼을 선택합니다.

앱 테스트 - 황금칼 구매 버튼

IAP 구매가 시작됩니다. 구매에 성공하는 시점까지 Google Play 지침을 따릅니다.

앱 테스트 - Google Play - 결제 성공

마지막으로, PlayFab 게임 관리자 대시보드에서 귀하의 타이틀로 가서 새 이벤트를 찾습니다.

게임 관리자 대시보드 새 이벤트

이는 성공적으로 구매가 제공 및 검증되고 PlayFab 생태계에 연결되었음을 의미합니다.

이 시점에서 귀하는 UnityIAP 및 Android 과금 API를 PlayFab 애플리케이션에 성공적으로 통합했습니다.