Google Play 결제 라이브러리 출시 노트

이 주제에는 Google Play 결제 라이브러리 출시 노트가 포함됩니다.

Google Play 결제 라이브러리 6.2.0 출시 (2024년 3월 6일)

이제 Google Play 결제 라이브러리 버전 6.2.0 및 Kotlin 확장 프로그램을 사용할 수 있습니다.

변경사항 요약

Google Play 결제 라이브러리 6.1.0 출시(2023년 11월 14일)

이제 Google Play 결제 라이브러리 버전 6.1.0 및 Kotlin 확장 프로그램을 사용할 수 있습니다.

변경사항 요약

Google Play 결제 라이브러리 6.0.1 출시(2023년 6월 22일)

이제 Google Play 결제 라이브러리 버전 6.0.1 및 Kotlin 확장 프로그램을 사용할 수 있습니다.

변경사항 요약

Android 14와 호환되도록 Play 결제 라이브러리를 업데이트합니다.

Google Play 결제 라이브러리 6.0 출시(2023년 5월 10일)

이제 Google Play 결제 라이브러리 버전 6.0.0 및 Kotlin 확장 프로그램을 사용할 수 있습니다.

변경사항 요약

  • ProrationMode를 대체하는 새로운 ReplacementMode를 추가했습니다.

    이전 버전과의 호환성을 위해, ProrationMode도 계속 사용할 수 있습니다.

  • PENDING 구매의 주문 ID를 삭제했습니다.

    이전에는 구매가 대기 중인 경우에도 항상 주문 ID가 생성되었습니다. 버전 6.0.0부터는 대기 중인 구매에 대해서는 주문 ID가 생성되지 않고, 구매가 PURCHASED 상태로 변경된 후에 주문 ID가 생성됩니다.

  • queryPurchaseslaunchPriceConfirmationFlow 메서드를 삭제했습니다.

    이전에 지원 중단됨으로 표시되었던 queryPurchaseslaunchPriceConfirmationFlow 메서드가 이제 Play 결제 라이브러리 6.0.0에서 삭제되었습니다. 개발자는 queryPurchases 대신 queryPurchasesAsync를 사용해야 합니다. launchPriceConfirmationFlow 대신 사용해야 할 메서드는 가격 변경을 참고하세요.

  • 새로운 네트워크 오류 응답 코드를 추가했습니다.

    PBL 버전 6.0.0부터 새로운 네트워크 오류 응답 코드 NETWORK_ERROR가 추가되었습니다. 이 코드는 네트워크 연결 문제로 인해 오류가 발생한 경우에 반환됩니다. 이전에는 이러한 네트워크 연결 오류가 SERVICE_UNAVAILABLE로 보고되었습니다.

  • SERVICE_UNAVAILABLESERVICE_TIMEOUT을 업데이트했습니다.

    PBL 버전 6.0.0부터 처리 시간 초과로 인한 오류가 기존의 SERVICE_TIMEOUT 대신 SERVICE_UNAVAILABLE로 반환됩니다.

    이전 버전의 PBL에서는 동작이 변경되지 않습니다.

  • SERVICE_TIMEOUT을 삭제했습니다.

    PBL 버전 6.0.0부터 더 이상 SERVICE_TIMEOUT이 반환되지 않습니다. 이전 버전의 PBL에서는 전과 동일하게 이 코드를 반환합니다.

  • 로깅을 추가했습니다.

    Play 결제 라이브러리 6 버전에는 API 사용(예: 성공 및 실패) 및 서비스 연결 문제에 관한 유용한 정보를 제공하는 추가 로깅이 포함되어 있습니다. 이 정보는 Play 결제 라이브러리의 성능을 개선하고 오류를 더 효과적으로 지원하는 용도로 사용됩니다.

Google Play 결제 라이브러리 5.2.1 출시(2023년 6월 22일)

이제 Google Play 결제 라이브러리 버전 5.2.1 및 Kotlin 확장 프로그램을 사용할 수 있습니다.

변경사항 요약

Android 14와 호환되도록 Play 결제 라이브러리를 업데이트합니다.

Google Play 결제 라이브러리 5.2 출시(2023년 4월 6일)

이제 Google Play 결제 라이브러리 버전 5.2.0 및 Kotlin 확장 프로그램을 사용할 수 있습니다.

변경사항 요약

Google Play 결제 라이브러리 5.1 출시(2022년 10월 31일)

이제 Google Play 결제 라이브러리 버전 5.1.0 및 Kotlin 확장 프로그램을 사용할 수 있습니다.

이 버전에 포함된 변경사항은 다음과 같습니다.

변경사항 요약

Google Play 결제 라이브러리 5.0 출시(2022년 5월 11일)

이제 Google Play 결제 라이브러리 버전 5.0.0 및 Kotlin 확장 프로그램을 사용할 수 있습니다.

이 버전에 포함된 변경사항은 다음과 같습니다.

변경사항 요약

  • 단일 정기 결제 제품에 여러 혜택을 만들 수 있는 새로운 항목을 비롯하여 정기 결제의 새로운 모델을 도입했습니다. 자세한 내용은 이전 가이드를 참고하세요.
  • BillingClient.querySkuDetailsAsync()를 대체하기 위해 BillingClient.queryProductDetailsAsync()를 추가했습니다.
  • EU 맞춤 가격 공개 요건을 위한 setIsOfferPersonalized() 메서드를 추가했습니다. 이 메서드를 사용하는 방법에 관한 자세한 내용은 맞춤설정된 가격 표시를 참고하세요.
  • 이전에 지원 중단되어 Google Play 결제 라이브러리 4.0.0에서 도입된 queryPurchasesAsync로 대체된 queryPurchases()를 삭제했습니다.
  • launchPriceChangeFlow가 지원 중단되었으며 향후 출시에서 삭제될 예정입니다. 대안에 관한 자세한 내용은 가격 변경 확인 흐름 시작을 참고하세요.
  • 이전에 구매 흐름을 인스턴스화할 때 사용된 setVrPurchaseFlow()를 삭제했습니다. 이전 버전에서 이 메서드는 사용자를 Android 기기에서 구매를 완료하도록 리디렉션했습니다. 이 메서드를 삭제하면 사용자는 표준 구매 흐름을 통해 구매를 완료합니다.

Google Play 결제 라이브러리 4.1 출시(2022년 2월 23일)

이제 Google Play 결제 라이브러리 버전 4.1.0 및 Kotlin 확장 프로그램을 사용할 수 있습니다.

이 버전에 포함된 변경사항은 다음과 같습니다.

변경사항 요약

  • 정기 결제 지급 거부를 원만하게 처리하기 위한 BillingClient.showInAppMessages()가 추가되었습니다. 인앱 메시지를 사용하여 정기 결제 지급 거부를 처리하는 방법에 관한 자세한 내용은 결제 거부 처리를 참고하세요.

Google Play 결제 라이브러리 4.0 출시(2021년 5월 18일)

현재 Google Play 결제 라이브러리의 버전 4.0.0 및 Kotlin 확장 프로그램이 제공됩니다.

변경사항 요약

Google Play 결제 라이브러리 3.0.3 출시(2021년 3월 12일)

이제 Google Play 결제 라이브러리 버전 3.0.3, Kotlin 확장 프로그램 및 Unity 플러그인을 사용할 수 있습니다.

자바 및 Kotlin 버그 수정

  • endConnection()이 호출될 때 발생하는 메모리 누수 문제를 해결했습니다.
  • 단일 작업 시작 모드를 활용하는 앱에서 Google Play 결제 라이브러리를 사용할 때 발생하는 문제를 해결했습니다. 결제 대화상자가 표시된 후 앱이 Android 런처에서 정지되면 앱이 재개될 때 onPurchasesUpdated() 콜백이 트리거됩니다.

Unity 버그 수정

  • 자바 3.0.3 버전을 업데이트하여 메모리 누수 문제를 해결했으며, 결제 대화상자가 표시된 후 앱이 Android 런처에서 정지되고 재개될 때 구매가 차단되는 문제를 해결했습니다.

Google Play 결제 라이브러리 3.0.2 출시(2020년 11월 24일)

이제 Google Play 결제 라이브러리 버전 3.0.2 및 Kotlin 확장을 사용할 수 있습니다.

버그 수정

  • Kotlin 확장에서 '이미 재개됨' 오류와 함께 코루틴이 실패하는 버그가 수정되었습니다.
  • Kotlin 확장이 kotlinx.coroutines 라이브러리 버전 1.4 이상에서 사용될 때 해결되지 않는 참조 문제가 수정되었습니다.

Google Play 결제 라이브러리 3.0.1 출시(2020년 9월 30일)

이제 Google Play 결제 라이브러리 버전 3.0.1 및 Kotlin 확장을 사용할 수 있습니다.

버그 수정

  • 결제 흐름 과정에서 앱이 중단되고 복원되면 PurchasesUpdatedListener가 구매 결과와 함께 호출되지 않는 버그가 수정되었습니다.

Google Play 결제 라이브러리 3.0 출시(2020년 6월 8일)

이제 Google Play 결제 라이브러리 버전 3.0.0, Kotlin 확장 및 Unity 플러그인을 사용할 수 있습니다.

변경사항 요약

  • 리워드 SKU 지원이 삭제되었습니다.
  • ChildDirectedUnderAgeOfConsent 매개변수가 삭제되었습니다.
  • 지원 중단된 개발자 페이로드 메서드가 삭제되었습니다.
  • 지원 중단된 메서드 BillingFlowParams.setAccountId()BillingFlowParams.setDeveloperId()가 삭제되었습니다.
  • 지원 중단된 메서드 BillingFlowParams.setOldSkus(String oldSku)BillingFlowParams.addOldSku(String oldSku)가 삭제되었습니다.
  • null 허용 여부 주석이 추가되었습니다.

버그 수정

  • 이제 SkuDetails.getIntroductoryPriceCycles()String 대신 int를 반환합니다.
  • 추가 매개변수가 설정되지 않았더라도 결제 흐름이 추가 매개변수가 있는 것으로 처리되는 버그가 수정되었습니다.

Google Play 결제 라이브러리 2.2.1 출시(2020년 5월 20일)

이제 Google Play 결제 라이브러리 버전 2.2.1을 사용할 수 있습니다.

버그 수정

  • Kotlin 확장 프로그램이 사용하는 자바 Play 결제 라이브러리의 기본 버전이 업데이트되었습니다.

Google Play 결제 라이브러리 2.2.0 출시 및 Unity 지원(2020년 3월 23일)

Google Play 결제 버전 2.2.0에서는 개발자가 구매한 항목이 사용자와 올바르게 연결되는지 확인하도록 돕는 기능을 제공합니다. 이러한 변경사항은 개발자의 페이로드에 따라 맞춤 솔루션을 개발해야 하는 필요를 줄여줍니다. 이 업데이트의 일부로 개발자 페이로드 기능은 지원이 중단되었으며 향후 출시되는 버전에서 삭제될 예정입니다. 대체 방법 권장사항 등 자세한 내용은 개발자 페이로드를 참조하세요.

Unity용 Google Play 결제의 결제 라이브러리 2

Google Play 결제 라이브러리 2의 현재 자바 및 Kotlin 버전과 더불어 Unity와 함께 사용할 수 있는 버전의 라이브러리를 출시했습니다. Unity 인앱 구매 API를 사용하는 게임 개발자는 이제 업그레이드를 통해 모든 Google Play 결제 라이브러리 2의 기능을 활용하고 향후 Google Play 결제 라이브러리의 새로운 버전이 출시되면 추가적인 업그레이드를 보다 손쉽게 할 수 있습니다.

자세한 내용은 Unity에서 Google Play 결제 사용을 참조하세요.

변경사항 요약

Google Play 결제 라이브러리 2.1.0 출시 및 Kotlin 확장 프로그램 2.1.0 출시(2019년 12월 10일)

Google Play 결제 라이브러리와 새로운 Kotlin 확장 프로그램 버전 2.1.0이 출시되었습니다. Play 결제 라이브러리 Kotlin 확장 프로그램은 개선된 Null 안전과 코루틴이 특징으로, Kotlin 사용을 위한 직관적인 API 대안을 제공합니다. 코드 예는 Google Play 결제 라이브러리 사용을 참고하세요.

이 버전에 포함된 변경사항은 다음과 같습니다.

변경사항 요약

  • BillingFlowParams에서, 기기의 여러 계정이 같은 SKU를 소유하고 있을 때 식별을 위해 setOldSku(String oldSku)가 지원 중단되고 setOldSku(String oldSku, String purchaseToken)으로 대체되었습니다.

Google Play 결제 라이브러리 2.0.3 출시(2019년 8월 5일)

이제 Google Play 결제 라이브러리 버전 2.0.3을 사용할 수 있습니다.

버그 수정

  • querySkuDetailsAsync()가 완료 결과를 반환하는 대신 DEVELOPER_ERROR 코드를 표시하며 실패하는 버그가 수정되었습니다.

Google Play 결제 라이브러리 2.0.2 출시(2019년 7월 8일)

이제 Google Play 결제 라이브러리 버전 2.0.2를 사용할 수 있습니다. 이 버전은 참조 문서 업데이트를 포함하고 있으며 라이브러리 기능을 변경하지 않습니다.

Google Play 결제 라이브러리 2.0.1 출시(2019년 6월 6일)

이제 Google Play 결제 라이브러리 버전 2.0.1을 사용할 수 있습니다. 이 버전에 포함된 변경사항은 다음과 같습니다.

버그 수정

  • 경우에 따라 디버그 메시지가 null로 반환되는 버그가 수정되었습니다.
  • 잠재적인 메모리 누수 문제가 해결되었습니다.

Google Play 결제 라이브러리 2.0 출시(2019년 5월 7일)

이제 Google Play 결제 라이브러리 버전 2.0을 사용할 수 있습니다. 이 버전에 포함된 변경사항은 다음과 같습니다.

3일 이내 구매 확인

Google Play에서는 앱 내부(인앱)나 앱 외부에서의 제품 구매를 지원합니다. 사용자가 제품을 구매하는 위치와 상관없이 Google Play에서 일관된 구매 환경을 보장하려면 사용자에게 자격을 부여한 후 최대한 빨리 Google Play 결제 라이브러리를 통해 수신된 모든 구매를 확인해야 합니다. 3일 이내에 구매를 확인하지 않으면 사용자에게 자동으로 환불되고 Google Play에서 구매를 취소합니다. 대기 중인 거래(버전 2.0의 새 기능)의 경우 3일간의 구매 확인 기간은 구매가 PURCHASED 상태가 되었을 때 시작되며 PENDING 상태로 있는 동안에는 적용되지 않습니다.

정기 결제의 경우 새 구매 토큰이 있는 모든 구매를 확인해야 합니다. 즉, 모든 초기 구매, 요금제 변경, 재가입은 확인을 받아야 하지만 이후 갱신은 확인할 필요가 없습니다. 구매의 확인 필드를 확인하면 구매에 확인이 필요한지 파악할 수 있습니다.

Purchase 객체에는 구매가 확인되었는지 나타내는 isAcknowledged() 메서드가 포함되어 있습니다. 또한 Google Play Developer API에는 Purchases.productsPurchases.subscriptions의 확인 부울 값이 포함됩니다. 구매를 확인하기 전에 이러한 메서드를 사용하여 구매가 이미 확인되었는지 파악하세요.

다음 메서드 중 하나를 사용해 구매를 확인할 수 있습니다.

  • 소모성 제품인 경우 클라이언트 API에 있는 consumeAsync()를 사용합니다.
  • 소모성 제품이 아니라면 클라이언트 API에 있는 acknowledgePurchase()를 사용합니다.
  • 서버 API에서 새로운 acknowledge() 메서드를 사용할 수도 있습니다.

BillingFlowParams.setSku()가 삭제됨

이전에 지원 중단된 BillingFlowParams#setSku() 메서드가 이번 출시에서 삭제되었습니다. 이제 구매 절차에서 제품을 렌더링하기 전에 결과 SkuDetails 객체를 BillingFlowParams.Builder.setSkuDetails()로 전달하는 BillingClient.querySkuDetailsAsync()를 호출해야 합니다.

코드 예는 Google Play 결제 라이브러리 사용을 참고하세요.

개발자 페이로드 지원됨

Google Play 결제 라이브러리 버전 2.0에는 구매에 첨부될 수 있는 임의의 문자열인 개발자 페이로드 지원이 추가됩니다. 구매에 개발자 페이로드 매개변수를 첨부할 수 있지만 구매가 확인되거나 소비된 경우에만 첨부할 수 있습니다. 이는 구매 흐름을 시작할 때 페이로드를 지정할 수 있는 AIDL의 개발자 페이로드와 다른 요소입니다. 이제 앱 외부에서 구매를 시작할 수 있으므로, 이러한 변경으로 인해 언제든지 구매에 페이로드를 추가할 수 있습니다.

새 라이브러리의 페이로드에 액세스하기 위해 Purchase 객체에 이제 getDeveloperPayload() 메서드가 포함됩니다.

일관된 혜택

할인된 SKU를 제공할 때 Google Play에서는 이제 SKU의 원래 가격을 반환하므로 사용자에게 할인을 받고 있음을 보여줄 수 있습니다.

SkuDetails에는 원래 SKU 가격을 가져오는 다음 2개의 새로운 메서드가 포함되어 있습니다.

대기 중인 거래

Google Play 결제 라이브러리 버전 2.0을 사용하면 자격을 부여하기 전에 추가 작업이 필요한 구매를 지원해야 합니다. 예를 들어 사용자가 오프라인 상점에서 현금으로 인앱 상품을 구매할 수도 있습니다. 이는 앱 외부에서 완료된 거래입니다. 이 시나리오에서는 사용자가 거래를 완료한 후에만 자격을 부여해야 합니다.

대기 중인 구매를 사용 설정하려면 앱 초기화의 일부인 enablePendingPurchases()를 호출하세요.

Purchase.getPurchaseState()를 사용하면 구매 상태가 PURCHASED인지 또는 PENDING인지 확인할 수 있습니다. 상태가 PURCHASED인 경우에만 자격을 부여해야 합니다. 다음과 같이 Purchase 상태 업데이트를 확인해야 합니다.

  1. 앱을 시작할 때 BillingClient.queryPurchases()를 호출하여 사용자와 연관된 소비되지 않은 제품의 목록을 가져옵니다.
  2. 반환된 각 Purchase 객체에서 Purchase.getPurchaseState()를 호출합니다.
  3. onPurchasesUpdated() 메서드를 구현하여 Purchase 객체의 변경에 응답합니다.

또한 Google Play Developer API에는 PENDING Purchases.products의 상태가 포함됩니다. 정기 결제에서는 대기 중인 거래가 지원되지 않습니다.

또한 이번 출시에 새로운 실시간 개발자 알림 유형인 OneTimeProductNotification이 도입됩니다. 이 알림 유형은 값이 ONE_TIME_PRODUCT_PURCHASED 또는 ONE_TIME_PRODUCT_CANCELED인 메시지 1개를 포함합니다. 이 알림 유형은 현금과 같이 지연된 결제 방법과 관련된 구매인 경우에만 전송됩니다.

대기 중인 구매는 해당 구매가 PENDING 상태가 아닌 PURCHASED 상태인 경우에만 확인해야 합니다.

API 변경사항

Google Play 결제 라이브러리 버전 2.0에는 새로운 기능을 지원하고 기존 기능을 명확히 하기 위한 여러 API 변경사항이 포함되어 있습니다.

consumeAsync

이제 consumeAsync()purchaseToken 대신 ConsumeParams 객체를 가져옵니다. ConsumeParams에는 purchaseToken 및 개발자 페이로드 옵션이 포함됩니다.

이전 버전의 consumeAsync()는 이번 출시에서 삭제되었습니다.

queryPurchaseHistoryAsync

혼동을 최소화하기 위해 queryPurchaseHistoryAsync() 메서드는 이제 Purchase 객체 대신 PurchaseHistoryRecord 객체를 반환합니다. PurchaseHistoryRecord 객체는 queryPurchaseHistoryAsync()에서 반환된 값만 반영하며 autoRenewing, orderId, packageName 필드를 포함하지 않는다는 점을 제외하면 Purchase 객체와 동일합니다. 반환되는 데이터는 변경되지 않았습니다. 즉, queryPurchaseHistoryAsync()에서 이전과 같은 데이터를 반환합니다.

BillingResult 반환 값

이전에 BillingResponse 정숫값을 반환한 API에서 이제 BillingResult 객체를 반환합니다. BillingResult에는 BillingResponse 정수 및 오류를 진단하는 데 사용할 수 있는 디버그 문자열이 포함됩니다. 디버그 문자열은 en-US 언어를 사용하며 최종 사용자에게 표시되지 않습니다.

버그 수정

Google Play 결제 라이브러리 1.2.2 출시(2019년 3월 7일)

이제 Google Play 결제 라이브러리 버전 1.2.2를 사용할 수 있습니다. 이 버전에 포함된 변경사항은 다음과 같습니다.

버그 수정

  • v1.2.1에서 발생한 스레드 문제가 해결되었습니다. 백그라운드 호출에서 더 이상 기본 스레드를 차단하지 않습니다.

기타 변경사항

  • 기본 스레드를 계속 사용하는 것이 좋지만, 이제 백그라운드 스레드에서 Google Play 결제 라이브러리를 인스턴스화할 수 있습니다.
  • 인스턴스화가 백그라운드 스레드로 완전히 이전되어 ANR이 발생할 가능성이 줄어들었습니다.

Play 결제 라이브러리 1.2.1 출시(2019년 3월 4일)

이제 Google Play 결제 라이브러리 버전 1.2.1을 사용할 수 있습니다. 이 버전에 포함된 변경사항은 다음과 같습니다.

주요 변경사항

기타 변경사항

  • 더 쉽게 테스트할 수 있도록 PurchasesResultSkuDetailsResult의 공개 생성자가 추가되었습니다.
  • SkuDetails 객체는 새로운 getOriginalJson() 메서드를 사용할 수 있습니다.
  • 이제 백그라운드 스레드에서 모든 AIDL 서비스 호출을 처리합니다.

버그 수정

  • Null 콜백 리스너가 이제 더 이상 공개 API로 전달되지 않습니다.

Google Play 결제 라이브러리 1.2 출시(2018년 10월 18일)

이제 Google Play 결제 라이브러리 버전 1.2를 사용할 수 있습니다. 이 버전에 포함된 변경사항은 다음과 같습니다.

변경사항 요약

  • 이제 Android 소프트웨어 개발 키트 라이선스 계약에 따라 Google Play 결제 라이브러리에 라이선스가 부여됩니다.
  • 사용자에게 정기 결제 가격에 관한 대기 중인 변경사항을 검토하라는 메시지를 표시하는 launchPriceChangeConfirmationFlow API가 추가되었습니다.
  • 새로운 비례 배분 모드인 DEFERRED가 지원됩니다. 사용자의 정기 결제를 업그레이드하거나 다운그레이드할 때 사용할 수 있습니다.
  • BillingFlowParams클래스에서 setSku()setSkuDetails()로 교체되었습니다.
  • 일부 버그 수정 및 코드 최적화

가격 변경 확인

이제 Google Play Console에서 정기 결제 가격을 변경하고, 사용자가 앱을 시작할 때 새 가격을 검토하고 수락하라는 메시지를 사용자에게 표시할 수 있습니다.

이 API를 사용하려면 정기 결제 제품의 skuDetails를 사용하여 PriceChangeFlowParams 객체를 만든 다음 launchPriceChangeConfirmationFlow()를 호출합니다. 다음 코드 스니펫에서와 같이 PriceChangeConfirmationListener를 구현하여 가격 변경 확인 절차가 완료된 후 결과를 처리하세요.

Kotlin

val priceChangeFlowParams = PriceChangeFlowParams.newBuilder()
    .setSkuDetails(skuDetailsOfThePriceChangedSubscription)
    .build()

billingClient.launchPriceChangeConfirmationFlow(activity,
        priceChangeFlowParams,
        object : PriceChangeConfirmationListener() {
            override fun onPriceChangeConfirmationResult(responseCode: Int) {
                // Handle the result.
            }
        })

Java

PriceChangeFlowParams priceChangeFlowParams =
        PriceChangeFlowParams.newBuilder()
    .setSkuDetails(skuDetailsOfThePriceChangedSubscription)
    .build();

billingClient.launchPriceChangeConfirmationFlow(activity,
        priceChangeFlowParams,
        new PriceChangeConfirmationListener() {
            @Override
            public void onPriceChangeConfirmationResult(int responseCode) {
                // Handle the result.
            }
        });

가격 변경 확인 절차에서 새 가격 정보가 포함된 대화상자를 표시하여 사용자에게 새 가격을 수락할지 묻습니다. 이 절차를 통해 BillingClient.BillingResponse 유형의 응답 코드가 반환됩니다.

새 비례 배분 모드

사용자 구독을 업그레이드하거나 다운그레이드할 때 새로운 비례배분 모드인 DEFERRED를 사용할 수 있습니다. 이 모드는 다음에 사용자 정기 결제가 갱신될 때 정기 결제를 업데이트합니다. 비례 배분 모드를 설정하는 방법에 관한 자세한 내용은 비례 배분 모드 설정을 참조하세요.

SKU 세부정보 설정을 위한 새로운 메서드

BillingFlowParams 클래스에서 setSku() 메서드는 지원이 중단되었습니다. 이러한 변경을 통해 Google Play 결제 절차가 최적화됩니다.

인앱 결제 클라이언트에서 BillingFlowParams의 새 인스턴스를 생성할 때는 다음 코드 스니펫에서와 같이 setSkuDetails()를 사용해 JSON 객체를 직접 사용하는 것이 좋습니다.

BillingFlowParams 빌더 클래스의 setSku() 메서드는 지원이 중단되었습니다. 대신 다음 코드 스니펫에 표시된 대로 setSkuDetails() 메서드를 사용합니다. setSkuDetails() 객체로 전달된 객체는 querySkuDetailsAsync() 메서드에서 제공됩니다.

Kotlin

private lateinit var mBillingClient: BillingClient
private val mSkuDetailsMap = HashMap<String, SkuDetails>()

private fun querySkuDetails() {
    val skuDetailsParamsBuilder = SkuDetailsParams.newBuilder()
    mBillingClient.querySkuDetailsAsync(skuDetailsParamsBuilder.build()
    ) { responseCode, skuDetailsList ->
        if (responseCode == 0) {
            for (skuDetails in skuDetailsList) {
                mSkuDetailsMap[skuDetails.sku] = skuDetails
            }
        }
    }
}

private fun startPurchase(skuId: String) {
    val billingFlowParams = BillingFlowParams.newBuilder()
    .setSkuDetails(mSkuDetailsMap[skuId])
    .build()
}

Java

private BillingClient mBillingClient;
private Map<String, SkuDetails> mSkuDetailsMap = new HashMap<>();

private void querySkuDetails() {
    SkuDetailsParams.Builder skuDetailsParamsBuilder
            = SkuDetailsParams.newBuilder();
    mBillingClient.querySkuDetailsAsync(skuDetailsParamsBuilder.build(),
            new SkuDetailsResponseListener() {
                @Override
                public void onSkuDetailsResponse(int responseCode,
                        List<SkuDetails> skuDetailsList) {
                    if (responseCode == 0) {
                        for (SkuDetails skuDetails : skuDetailsList) {
                            mSkuDetailsMap.put(skuDetails.getSku(), skuDetails);
                        }
                    }
                }
            });
}

private void startPurchase(String skuId) {
    BillingFlowParams billingFlowParams = BillingFlowParams.newBuilder()
            .setSkuDetails(mSkuDetailsMap.get(skuId))
            .build();
}

Play 결제 라이브러리 1.1 출시(2018년 5월 7일)

이제 Google Play 결제 라이브러리 버전 1.1을 사용할 수 있습니다. 이 버전에 포함된 변경사항은 다음과 같습니다.

변경사항 요약

  • 기존 정기 결제를 업그레이드/다운그레이드할 때 BillingFlowParams에 비례 배분 모드를 지정하는 기능이 추가되었습니다.
  • BillingFlowParamsreplaceSkusProration 부울 플래그는 더 이상 지원되지 않으며 대신 replaceSkusProrationMode를 사용합니다.
  • launchBillingFlow()에서 이제 실패한 응답을 위한 콜백을 트리거합니다.

동작 변경사항

Google Play 결제 라이브러리 버전 1.1에는 다음과 같은 동작 변경사항이 포함되어 있습니다.

개발자는 BillingFlowParams 클래스에 replaceSkusProrationMode를 설정할 수 있음

ProrationMode는 사용자의 정기 결제를 업그레이드하거나 다운그레이드할 때 비례 배분 유형에 관한 추가 세부정보를 제공합니다.

Kotlin

BillingFlowParams.newBuilder()
    .setSku(skuId)
    .setType(billingType)
    .setOldSku(oldSku)
    .setReplaceSkusProrationMode(replaceSkusProrationMode)
    .build()

Java

BillingFlowParams.newBuilder()
    .setSku(skuId)
    .setType(billingType)
    .setOldSku(oldSku)
    .setReplaceSkusProrationMode(replaceSkusProrationMode)
    .build();

현재 Google Play에서는 다음 비례 배분 모드를 지원합니다.

IMMEDIATE_WITH_TIME_PRORATION 교체가 즉시 적용되며, 새로운 만료 시간은 비례 배분되어 사용자에게 입금되거나 청구됩니다. 이는 현재 기본 동작입니다.
IMMEDIATE_AND_CHARGE_PRORATED_PRICE 교체가 즉시 적용되며, 결제 주기는 동일하게 유지됩니다. 남은 기간에 대한 가격이 청구됩니다.

참고: 이 옵션은 정기 결제 업그레이드에만 사용할 수 있습니다.

IMMEDIATE_WITHOUT_PRORATION 교체가 즉시 적용되며, 다음번 반복에 새 가격이 부과됩니다. 결제 주기는 동일하게 유지됩니다.

replaceSkusProrationBillingFlowParams 클래스에서 더 이상 지원되지 않음

이전에는 개발자는 불리언 플래그를 설정하여 정기 결제 업그레이드 요청의 일할 계산된 금액을 청구할 수 있었습니다. 더 자세한 비례 배분 명령이 포함된 ProrationMode를 지원함에 따라 이 불리언 플래그는 더 이상 지원되지 않습니다.

launchBillingFlow()에서 이제 실패한 응답을 위한 콜백을 트리거함

결제 라이브러리는 항상 PurhcasesUpdatedListener 콜백을 트리거하고 BillingResponse를 비동기식으로 반환합니다. BillingResponse의 동기 반환 값도 유지됩니다.

버그 수정

  • 서비스 연결이 끊어지면 비동기 메서드가 초기에 제대로 종료됩니다.
  • Builder 매개변수 객체에서 더 이상 빌드된 객체를 변형시키지 않습니다.
  • 문제 68087141: launchBillingFlow()에서 이제 실패한 응답을 위한 콜백을 트리거합니다.

Google Play 결제 라이브러리 1.0 출시(2017년 9월 19일, 공지)

이제 Google Play 결제 라이브러리 버전 1.0을 사용할 수 있습니다. 이 버전에 포함된 변경사항은 다음과 같습니다.

중요 변경사항

  • 라이브러리의 manifest 내부에 결제 권한이 삽입되었습니다. 더 이상 Android 매니페스트에 com.android.vending.BILLING 권한을 추가하지 않아도 됩니다.
  • BillingClient.Builder 클래스에 새로운 빌더가 추가되었습니다.
  • SKU를 쿼리하는 메서드에 사용될 SkuDetailsParams 클래스용 빌더 패턴이 도입되었습니다.
  • 일관성(동일한 반환 인수 이름 및 순서)을 위해 여러 API 메서드가 업데이트되었습니다.

동작 변경사항

Google Play 결제 라이브러리 버전 1.0에는 다음과 같은 동작 변경사항이 포함되어 있습니다.

BillingClient.Builder 클래스

BillingClient.Builder는 이제 newBuilder 패턴을 통해 초기화됩니다.

Kotlin

billingClient = BillingClient.newBuilder(context).setListener(this).build()

Java

billingClient = BillingClient.newBuilder(context).setListener(this).build();

launchBillingFlow 메서드가 이제 BillingFlowParams 클래스를 사용해 호출됨

구매 또는 정기 결제의 결제 절차를 시작하기 위해 launchBillingFlow() 메서드에서 요청 관련 매개변수로 초기화된 BillingFlowParams 인스턴스를 받습니다.

Kotlin

BillingFlowParams.newBuilder().setSku(skuId)
        .setType(billingType)
        .setOldSku(oldSku)
        .build()

// Then, use the BillingFlowParams to start the purchase flow
val responseCode = billingClient.launchBillingFlow(builder.build())

Java

BillingFlowParams.newBuilder().setSku(skuId)
                              .setType(billingType)
                              .setOldSku(oldSku)
                              .build();

// Then, use the BillingFlowParams to start the purchase flow
int responseCode = billingClient.launchBillingFlow(builder.build());

구매할 수 있는 제품을 쿼리하는 새로운 방법

queryPurchaseHistoryAsync()querySkuDetailsAsync() 메서드의 인수는 빌더 패턴으로 래핑되었습니다.

Kotlin

val params = SkuDetailsParams.newBuilder()
params.setSkusList(skuList)
        .setType(itemType)
billingClient.querySkuDetailsAsync(params.build(), object : SkuDetailsResponseListener() {
    ...
})

Java

SkuDetailsParams.Builder params = SkuDetailsParams.newBuilder();
params.setSkusList(skuList)
        .setType(itemType);
billingClient.querySkuDetailsAsync(params.build(), new SkuDetailsResponseListener() {...})

이제 API 전체에서 일관성을 유지하고 개발자의 편의를 위해 이전 래퍼 클래스 대신 결과 코드와 SkuDetails 객체의 목록을 통해 결과가 반환됩니다.

Kotlin

fun onSkuDetailsResponse(@BillingResponse responseCode: Int, skuDetailsList: List<SkuDetails>)

Java

public void onSkuDetailsResponse(@BillingResponse int responseCode, List<SkuDetails> skuDetailsList)

onConsumeResponse() 메서드의 매개변수 순서가 변경됨

ConsumeResponseListener 인터페이스의 onConsumeResponse 인수 순서가 Google API 전반에서 일관되게 변경되었습니다.

Kotlin

fun onConsumeResponse(@BillingResponse responseCode: Int, outToken: String)

Java

public void onConsumeResponse(@BillingResponse int responseCode, String outToken)

PurchaseResult 객체의 래핑이 해제됨

API 전체에서 일관성을 유지하기 위해PurchaseResult의 래핑이 해제되었습니다.

Kotlin

fun onPurchaseHistoryResponse(@BillingResponse responseCode: Int, purchasesList: List<Purchase>)

Java

void onPurchaseHistoryResponse(@BillingResponse int responseCode, List<Purchase> purchasesList)

버그 수정

개발자 프리뷰 1 출시(2017년 6월 12일, 공지)

결제와 관련된 개발 프로세스를 단순화하고 개발자가 애플리케이션 아키텍처 및 탐색 구조와 같은 Android 앱 관련 로직을 구현하는 데 집중할 수 있도록 개발자 미리보기가 출시되었습니다.

라이브러리에는 Android 앱을 Google Play Billing API와 통합할 때 사용할 수 있는 몇 가지 편리한 클래스와 기능이 포함되어 있습니다. 또한 라이브러리는 Android 인터페이스 정의 언어 (AIDL) 서비스 외에 추상화 계층을 제공하므로 개발자는 앱과 Google Play Billing API 간의 인터페이스를 더 쉽게 정의할 수 있습니다.