Unity로 Google Play 결제 라이브러리 사용

Google Play 결제 플러그인은 Unity IAP라고 하는 Unity의 인앱 구매용 기본 서비스와 애셋을 확장하여 게임에 Google Play 결제 라이브러리의 최신 기능을 모두 제공합니다. 이 가이드에서는 프로젝트를 설정하여 플러그인을 사용하는 방법을 설명합니다. 또한 Unity에서 게임에 Google Play 결제 라이브러리 기능을 구현하는 방법도 설명합니다.

Google Play 결제 플러그인 설정

플러그인을 설정하려면 링크가 제공된 다음 섹션의 각 단계를 완료하세요.

  1. Unity IAP 추상화 레이어 사용 설정
  2. 플러그인 다운로드 및 가져오기
  3. 플러그인의 빌드 설정 구성
  4. 플러그인 사용 설정

Unity IAP 추상화 레이어 사용 설정

Google Play 결제 플러그인은 Unity IAP에 포함된 추상화 레이어에서 빌드되므로 플러그인을 다운로드 및 가져오기 전에 추상화 레이어를 사용 설정해야 합니다. Unity IAP 추상화 레이어를 사용 설정하려면 다음을 실행하세요.

  1. 다음 Unity 튜토리얼의 모든 단계를 완료합니다. Unity 서비스용 프로젝트 설정
  2. 다음 Unity 튜토리얼의 모든 단계를 완료합니다. Unity IAP 서비스 사용 설정

플러그인 다운로드 및 가져오기

플러그인은 .unitypackage 형식의 Unity 패키지로 제공됩니다. 플러그인을 다운로드하고 가져오려면 다음 단계를 따르세요.

  1. GitHub에 있는 저장소의 출시 페이지에서 Unity용 Google Play 플러그인의 최신 버전을 다운로드합니다.
  2. Unity 메뉴 바에서 Assets > Import Package > Custom Package를 클릭합니다.

  3. .unitypackage 파일을 다운로드한 위치를 찾아 파일을 선택합니다.

  4. Import Unity Package 대화상자에서 모든 애셋을 선택한 상태로 두고 Import를 클릭합니다.

패키지를 가져온 후에는 GooglePlayPlugins(Assets 폴더의 루트)라고 하는 새 폴더가 프로젝트의 애셋에 추가됩니다. 이 폴더에는 플러그인의 모든 Google Play 결제 라이브러리 애셋이 포함됩니다.

빌드 설정 구성

플러그인은 Unity IAP를 확장하기 때문에 빌드에서 이전에 중복된 Unity IAP 종속 항목이 제거되지 않았다면 Unity에서 충돌이 발생하고 Android APK 빌드에 실패합니다. 플러그인을 사용하면 충돌하는 라이브러리를 프로젝트에서 자동으로 삭제할 수 있습니다. 이러한 충돌을 해결하려면 다음 단계를 따르세요.

  1. Unity 메뉴 바에서 Google > Play Billing > Build Settings를 선택합니다.

  2. Play Billing Build Settings 창에서 Fix를 클릭합니다. 이렇게 하면 충돌을 해결하고 충돌하는 Unity IAP 파일을 백업 디렉터리로 이동합니다. Fix를 클릭하면 버튼이 Restore로 바뀌며 이 버튼을 클릭하여 원본 충돌 파일을 복원할 수 있습니다.

플러그인 사용 설정

플러그인을 사용 설정하려면 Unity IAP의 Google Play 구현을 Google Play 결제 플러그인으로 바꿉니다. 예를 들어 Unity IAP 구매자 스크립트를 사용한다면, Google.Play.Billing.GooglePlayStoreModule을 사용하기 위해 IAP 빌더에 전달된 StandardPurchaseModule을 변경합니다.

// Create a builder using the GooglePlayStoreModule.
var configurationBuilder =
    ConfigurationBuilder.Instance(Google.Play.Billing.GooglePlayStoreModule.Instance());

게임에서 여러 플랫폼에 동일한 구매자 스크립트를 사용한다면, Unity가 다른 플랫폼에서 자체 IAP 솔루션을 계속 사용할 수 있도록 다음과 같이 플랫폼 확인을 추가해야 합니다.

ConfigurationBuilder builder;
if (Application.platform == RuntimePlatform.Android)
{
  builder = ConfigurationBuilder.Instance(
      Google.Play.Billing.GooglePlayStoreModule.Instance());
}
else
{
  builder = ConfigurationBuilder.Instance(StandardPurchasingModule.Instance());
}

Google Play 스토어 외에 다른 Android 앱 스토어에도 게임을 게시하는 경우 Google Play 스토어를 선택할 때만 기본 Unity IAP 구현을 대체해야 합니다.

ConfigurationBuilder builder;
if (Application.platform == RuntimePlatform.Android
       && SelectedAndoidAppStore == AppStore.GooglePlay)
{
  builder = ConfigurationBuilder.Instance(
      Google.Play.Billing.GooglePlayStoreModule.Instance());
}
else
{
  builder = ConfigurationBuilder.Instance(StandardPurchasingModule.Instance());
}

게임에 Google Play 결제 라이브러리 기능 구현

Google Play 결제 플러그인은 Unity IAP 서비스를 확장하므로 동일한 Unity API를 사용하여 일반적인 구매 워크플로를 관리할 수 있습니다. 다른 앱 스토어에서는 Google Play 결제 라이브러리와 Unity 표준 IAP 구현 간의 차이로 인해 API 동작에 약간의 변경사항이 있습니다. Unity IAP API를 처음 사용한다면 Unity IAP 튜토리얼의 '구매 스크립트 만들기' 섹션에서 기본 구매 흐름의 구현 방법 예를 참고하세요.

또한 Google Play 결제 라이브러리에는 Google Play 스토어에 고유한 기능이 일부 포함되어 있습니다. 확장된 인터페이스를 통해 이러한 기능에 액세스할 수 있습니다. 이 섹션의 나머지 부분에서는 게임에서 Google Play 결제 라이브러리의 고유한 기능을 구현하는 방법을 설명합니다.

지연된 구매 사용 설정

Google Play는 대기 중인 거래 또는 대기 중인 구매라는 지연된 구매를 지원하며 사용자는 구매를 생성하고 나중에 스토어에서 현금을 사용하여 완료할 수 있습니다.

지연된 구매를 사용 설정하려면 IAP 빌더에서 EnableDeferredPurchase() 메서드를 호출하여 모듈 구성을 수정하면 됩니다.

// Create a builder using a GooglePlayStoreModule.
var configurationBuilder =
    ConfigurationBuilder.Instance(Google.Play.Billing.GooglePlayStoreModule.Instance());
// Enable deferred purchases
configurationBuilder.Configure<Google.Play.Billing.IGooglePlayConfiguration>()
    .EnableDeferredPurchase();

그런 다음 Play 스토어 확장 프로그램을 사용하여 지연된 구매 콜백을 구현합니다.

// Get the plugin extensions for the Google Play Store.
_playStoreExtensions =
    extensions.GetExtension<Google.Play.Billing.IGooglePlayStoreExtensions>();

// Set the deferred purchases callback.
_playStoreExtensions.SetDeferredPurchaseListener(
    delegate(Product product)
    {
        // Do not grant the item here. Instead, record the purchase and remind
        // the user to complete the transaction in the Play Store.
    });

난독화된 계정 ID를 Google Play에 전달

Google Play에 난독화된 사용자 계정 ID를 전달하여 단기간에 여러 기기에서 같은 계정으로 구매를 진행하는 등의 악용 사례를 쉽게 감지할 수 있습니다.

난독화된 계정 ID를 전달하려면 확장 프로그램 API에서 SetObfuscatedAccountId() 메서드를 호출합니다.

// Get the plugin extensions for the Google Play Store.
_playStoreExtensions =
    extensions.GetExtension<Google.Play.Billing.IGooglePlayStoreExtensions>();

// Pass an obfuscated account ID.
_playStoreExtensions.SetObfuscatedAccountId(obfuscatedAccountId);

난독화된 프로필 ID를 Google Play에 전달

난독화된 프로필 ID를 Google Play에 전달하여 단기간에 여러 기기에서 같은 계정으로 구매를 진행하는 등의 사기 사례를 쉽게 감지할 수 있습니다. 이는 난독화된 사용자 계정 ID를 전달하는 것과 유사합니다. 두 경우 모두 ID가 단일 사용자를 나타내지만, 프로필 ID를 사용하면 단일 앱 내에 있는 여러 프로필에서 고유하게 단일 사용자를 식별할 수 있습니다. Google Play에 난독화된 프로필 ID를 전송한 후에는 나중에 구매 영수증에서 ID를 검색할 수 있습니다.

난독화된 프로필 ID를 전달하려면 SetObfuscatedProfileId() 메서드를 호출하여 모듈의 구성을 수정하도록 IAP 빌더를 사용합니다.

// Get the plugin extensions for the Google Play Store.
_playStoreExtensions =
    extensions.GetExtension<Google.Play.Billing.IGooglePlayStoreExtensions>();

// Pass an obfuscated profile ID.
_playStoreExtensions.SetObfuscatedProfileId(obfuscatedProfileId);

정기 결제 가격 변경 확인

Google Play에서는 활성 상태인 정기 결제의 가격을 변경할 수 있습니다. 가격 변경이 적용되기 전에 게임 사용자가 변경사항을 확인해야 합니다. 사용자에게 정기 결제에 관한 가격 변경을 확인하라는 메시지를 표시하려면 ConfirmSubscriptionPriceChange() 메서드를 호출합니다.

// Get the plugin extensions for the Google Play Store.
_playStoreExtensions =
    extensions.GetExtension<Google.Play.Billing.IGooglePlayStoreExtensions>();

_playStoreExtensions.ConfirmSubscriptionPriceChange(productId,
    delegate (bool success)
    {
        // Returns whether the user has accepted the new price or not.
    });

Unity API 동작 변경사항

Google Play 결제 플러그인을 사용하고 있다면 대부분의 API는 다른 앱 스토어에서의 Unity 표준 IAP 구현과 동일한 방식으로 작동합니다. 하지만 API가 다르게 작동하는 경우도 있습니다. 이 섹션에서는 이러한 동작의 차이를 설명합니다.

개발자 페이로드는 지원되지 않음

Google Play는 개발자 페이로드의 지원을 중단하고 더 의미 있고 상황에 맞는 대안으로 대체하고 있습니다. 따라서, 개발자 페이로드는 지원되지 않습니다. 개발자 페이로드의 대안에 관한 자세한 내용은 개발자 페이로드 페이지를 참조하세요.

다른 앱 스토어를 위한 Unity 표준 IAP 구현에서 정의한 것과 동일한 인터페이스(IStoreController 포함)를 계속 사용할 수 있습니다. 구매를 초기화할 때 계속 IStoreController를 사용하고 InitiatePurchase() 메서드를 호출할 수 있습니다.

public void InitiatePurchase(Purchasing.Product product, string payload);

하지만 전달된 페이로드는 적용되지 않습니다(최종 영수증에 표시되지 않음).

SubscriptionManager는 지원되지 않음

Unity IAP는 정기 결제를 관리하는 SubscriptionManager 클래스를 제공합니다. 이 클래스의 Unity 표준 IAP 구현은 개발자 페이로드를 사용하므로 이 클래스는 지원되지 않습니다. 이 클래스를 만들 수는 있지만, 클래스의 getter 메서드를 사용할 때 신뢰할 수 없는 데이터를 수신할 수 있습니다.

UpdateSubscription에 소규모 API 변경사항이 있음

Google Play 결제 플러그인은 SubscriptionManager.UpdateSubscription()SubscriptionManager.UpdateSubscriptionInGooglePlayStore() 메서드를 사용하여 정기 결제를 업그레이드하거나 다운그레이드하는 것을 지원하지 않습니다. 게임에서 이러한 메서드를 호출하면 GooglePlayStoreUnsupportedException이 발생합니다.

Google Play 결제 라이브러리는 이러한 메서드 대신 사용할 대체 API를 제공합니다. 정기 결제를 업그레이드하거나 다운그레이드하려면 비례 배분 모드를 사용하여 UpdateSubscription() 메서드를 호출합니다.

void UpdateSubscription(Product oldProduct, Product newProduct,
           GooglePlayStoreProrationMode prorationMode = GooglePlayStoreProrationMode.Unknown);

플랫폼 확인을 사용하여, 또는 GooglePlayStoreUnsupportedException이 캐치될 때 캐치 블록에서 이 메서드 호출을 래핑할 수 있습니다.

비례 배분 모드를 사용하는 방법에 관한 자세한 내용 및 예는 비례 배분 모드 설정을 참조하세요.