이 주제에는 Google Play 결제 라이브러리 출시 노트가 포함됩니다.
Google Play 결제 라이브러리 7.0.0 출시 (2024년 5월 14일)
Google Play 결제 라이브러리 버전 7.0.0 및 Kotlin 확장 프로그램이 이제 출시되었습니다. 있습니다.
변경사항 요약
할부 구독을 지원하는 API를 추가했습니다.
ProductDetails.InstallmentPlanDetails
추가됨 사용자가 구매할 수 있는 할부 기본 요금제인 경우 이 API 앱에서 할부 요금제와 약정 설정을 식별하는 데 도움이 됩니다. 사용자에게 관련 정보를 제공합니다. 자세한 내용은 정기 결제 분할 가이드를 참조하세요.
PendingPurchasesParams
추가됨 및BillingClient.Builder.enablePendingPurchases(PendingPurchaseParams)
다음으로 대체:BillingClient.Builder.enablePendingPurchases()
, 이 출시에서 지원 중단되었습니다.- 지원 중단된
enablePendingPurchases()
는 기능적으로 다음과 동일합니다.enablePendingPurchases(PendingPurchasesParams.newBuilder().enableOneTimeProducts().build())
입니다.
- 지원 중단된
정기 결제 선불 요금제의 대기 중인 거래를 지원하는 API를 추가했습니다.
PendingPurchasesParams.Builder.enablePrepaidPlans()
사용BillingClient.Builder.enablePendingPurchases(PendingPurchaseParams)
포함 구독 선불 요금제에 대기 중인 거래를 사용 설정합니다. 추가 시 앱에서 정기 결제를 올바르게 관리하는지 확인해야 합니다. 수명 주기 동안 사용됩니다 자세한 내용은 구매 대기 중 가이드를 참고하세요.Purchase.PendingPurchaseUpdate
추가됨 및Purchase.getPendingPurchaseUpdate()
대기 중인 충전 또는 기존 계정으로 업그레이드 또는 다운그레이드 구독하세요.
BillingClient.Builder.enableAlternativeBilling()
삭제됨,AlternativeBillingListener
, 및AlternativeChoiceDetails
.- 개발자는
BillingClient.Builder.enableUserChoiceBilling()
드림 대상:UserChoiceBillingListener
및UserChoiceDetails
를 대신 리스너 콜백에서 호출할 수 있습니다.
- 개발자는
BillingFlowParams.ProrationMode
삭제됨,BillingFlowParams.SubscriptionUpdateParams.Builder.setReplaceProrationMode()
, 및BillingFlowParams.SubscriptionUpdateParams.Builder.setReplaceSkusProrationMode()
.- 개발자는
BillingFlowParams.SubscriptionUpdateParams.ReplacementMode
드림 대상:BillingFlowParams.SubscriptionUpdateParams.Builder#setSubscriptionReplacementMode(int)
하세요. BillingFlowParams.SubscriptionUpdateParams.Builder.setReplaceProrationMode()
.BillingFlowParams.SubscriptionUpdateParams.Builder.setReplaceSkusProrationMode()
.
- 개발자는
BillingFlowParams.SubscriptionUpdateParams.Builder#setOldSkuPurchaseToken()
을(를) 삭제했습니다.BillingClient.queryPurchaseHistoryAsync()
드림 지원 중단되었으며 향후 버전에서 삭제될 예정입니다. 개발자는 대신 다음 대안을 사용하세요.- 확인된 구매 및 대기 중인 구매:
BillingClient.queryPurchasesAsync()
드림 활성 구매를 가져옵니다 - 소비된 구매: 개발자는 소비된 구매를 추적해야 합니다. 배포할 수 있습니다
- 취소된 구매: 무효화된 구매 Developer API를 사용합니다.
- 자세한 내용은 구매 내역 쿼리
- 확인된 구매 및 대기 중인 구매:
BillingFlowParams.ProductDetailsParams.setOfferToken()
드림 이제 개발자가 빈offerToken
를 지정하면 예외가 발생합니다.minSdkVersion
이 21로,targetSdkVersion
가 34로 업데이트되었습니다.
Google Play 결제 라이브러리 6.2.1 출시 (2024년 4월 16일)
Google Play 결제 라이브러리 버전 6.2.1 및 Kotlin 확장 프로그램이 이제 출시되었습니다. 있습니다.
변경사항 요약
- 대화상자가 완료될 때 특정 경우에
AlternativeBillingOnlyInformationDialogListener
가 호출되지 않을 수 있는BillingClient.showAlternativeBillingOnlyInformationDialog()
의 버그를 수정했습니다.
Google Play 결제 라이브러리 6.2.0 출시 (2024년 3월 6일)
Google Play 결제 라이브러리 버전 6.2.0 및 Kotlin 확장 프로그램이 이제 출시되었습니다. 있습니다.
변경사항 요약
- 외부 제안을 지원하는 API를 추가했습니다.
<ph type="x-smartling-placeholder">
- </ph>
BillingClient.Builder.enableExternalOffer()
추가됨 외부 제공 결제 시스템을 제공할 수 있습니다BillingClient.isExternalOfferAvailableAsync()
추가됨 외부 제공 결제 기능 제공 가능 여부를 확인하세요.BillingClient.showExternalOfferInformationDialog()
추가됨 사용자를 앱 외부로 안내하기 전에 사용자에게 정보 대화상자를 표시합니다.- 외부 제안을 통해 이루어진 거래를 보고하는 데 필요한 페이로드를 만드는
BillingClient.createExternalOfferReportingDetailsAsync()
를 추가했습니다.
Google Play 결제 라이브러리 6.1.0 출시(2023년 11월 14일)
이제 Google Play 결제 라이브러리 버전 6.1.0 및 Kotlin 확장 프로그램을 사용할 수 있습니다.
변경사항 요약
- 개발자 제공 결제 전용(즉, 사용자 선택권 없음)을 지원하는 API를 추가했습니다.
- 개발자 제공 결제 전용을 제공하는 기능을 기능적으로 사용 설정하도록
BillingClient.Builder.enableAlternativeBillingOnly()
를 추가했습니다. - 개발자 제공 결제 전용을 제공할 수 있는지 확인하는
BillingClient.isAlternativeBillingOnlyAvailableAsync()
를 추가했습니다. - 개발자 제공 결제 전용을 사용 중일 때 사용자에게 알리는 정보 대화상자를 표시하는
BillingClient.showAlternativeBillingOnlyInformationDialog()
를 추가했습니다. - 개발자 제공 결제 전용을 통해 이루어진 거래를 보고하는 데 필요한 페이로드를 만드는
BillingClient.createAlternativeBillingOnlyReportingDetailsAsync()
를 추가했습니다.
- 개발자 제공 결제 전용을 제공하는 기능을 기능적으로 사용 설정하도록
- 사용자 선택 결제 API를 업데이트했습니다.
- 지원 중단된 것으로 표시된 AlternativeBillingListener를 대체하는
UserChoiceBillingListener
를 추가했습니다. - 지원 중단된 것으로 표시된
AlternativeChoiceDetails
를 대체하는UserChoiceDetails
를 추가했습니다. - 지원 중단된 것으로 표시된
BillingClient.Builder.enableAlternativeBilling()
을 대체하는BillingClient.Builder.enableUserChoiceBilling()
을 추가했습니다.
- 지원 중단된 것으로 표시된 AlternativeBillingListener를 대체하는
- Google Play 국가를 가져오는
BillingClient.getBillingConfigAsync()
를 추가했습니다.
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가 생성됩니다.queryPurchases
및launchPriceConfirmationFlow
메서드를 삭제했습니다.이전에 지원 중단됨으로 표시되었던
queryPurchases
및launchPriceConfirmationFlow
메서드가 이제 Play 결제 라이브러리 6.0.0에서 삭제되었습니다. 개발자는queryPurchases
대신queryPurchasesAsync
를 사용해야 합니다.launchPriceConfirmationFlow
대신 사용해야 할 메서드는 가격 변경을 참고하세요.새로운 네트워크 오류 응답 코드를 추가했습니다.
PBL 버전 6.0.0부터 새로운 네트워크 오류 응답 코드
NETWORK_ERROR
가 추가되었습니다. 이 코드는 네트워크 연결 문제로 인해 오류가 발생한 경우에 반환됩니다. 이전에는 이러한 네트워크 연결 오류가SERVICE_UNAVAILABLE
로 보고되었습니다.SERVICE_UNAVAILABLE
및SERVICE_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 확장 프로그램을 사용할 수 있습니다.
변경사항 요약
- 대한민국 사용자의 모바일/태블릿용 개발자 제공 결제 흐름을 지원하는 클래스가 추가되었습니다.
- 원래 정기 결제의 외부 거래 ID를 지정하는
BillingFlowParams.SubscriptionUpdateParams.Builder.setOriginalExternalTransactionId()
메서드를 추가했습니다. - 대한민국 사용자가 개발자 제공 결제 옵션을 선택할 수 있도록
BillingClient.Builder.enableAlternativeBilling()
메서드를 추가했습니다.
Google Play 결제 라이브러리 5.1 출시(2022년 10월 31일)
이제 Google Play 결제 라이브러리 버전 5.1.0 및 Kotlin 확장 프로그램을 사용할 수 있습니다.
이 버전에 포함된 변경사항은 다음과 같습니다.
변경사항 요약
- 혜택 ID를 검색하는
ProductDetails.SubscriptionOfferDetails.getOfferId()
메서드를 추가했습니다. - 기본 요금제 ID를 검색하는
ProductDetails.SubscriptionOfferDetails.getBasePlanId()
메서드를 추가했습니다. targetSdkVersion
을 31로 업데이트했습니다.
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 확장 프로그램이 제공됩니다.
변경사항 요약
향후 출시에서 삭제될
BillingClient.queryPurchases()
를 대체하기 위해BillingClient.queryPurchasesAsync()
를 추가했습니다.새로운 정기 결제 대체 모드
IMMEDIATE_AND_CHARGE_FULL_PRICE
를 추가했습니다.Play 결제 라이브러리의 연결 상태를 가져오기 위한
BillingClient.getConnectionState()
메서드를 추가했습니다.메서드를 호출할 수 있는 스레드와 게시될 스레드 결과를 나타내도록 Javadoc 및 구현을 업데이트했습니다.
정기 결제 업데이트를 시작하는 새로운 방법으로
BillingFlowParams.Builder.setSubscriptionUpdateParams()
를 추가했습니다. 이는 삭제된BillingFlowParams#getReplaceSkusProrationMode
,BillingFlowParams#getOldSkuPurchaseToken
,BillingFlowParams#getOldSku
,BillingFlowParams.Builder#setReplaceSkusProrationMode
,BillingFlowParams.Builder#setOldSku
를 대체합니다.Purchase.getQuantity()
및PurchaseHistoryRecord.getQuantity()
를 추가했습니다.Purchase#getSkus()
및PurchaseHistoryRecord#getSkus()
를 추가했습니다. 이러한 항목이 삭제된Purchase#getSku
와PurchaseHistoryRecord#getSku
를 대체합니다.BillingFlowParams#getSku
,BillingFlowParams#getSkuDetails
및BillingFlowParams#getSkuType
을 삭제했습니다.
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 지원이 삭제되었습니다.
ChildDirected
및UnderAgeOfConsent
매개변수가 삭제되었습니다.- 지원 중단된 개발자 페이로드 메서드가 삭제되었습니다.
- 지원 중단된 메서드
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 결제 라이브러리
AcknowledgePurchaseParams
에서setDeveloperPayload()
및getDeveloperPayload()
메서드가 지원 중단되었습니다.ConsumeParams
에서setDeveloperPayload()
및getDeveloperPayload()
메서드가 지원 중단되었습니다.BillingFlowParams
에서setAccountId()
가setObfuscatedAccountId()
로 이름이 변경되었으며 64자의 길이 제한 및 이 필드의 개인 식별 정보(PII) 사용 중지 제한이 기록되었습니다.setAccountId()
는 지원 중단된 것으로 표시되었으며 향후 라이브러리 버전에서 삭제될 예정입니다.BillingFlowParams
에setObfuscatedAccountId()
와 비슷하게 작동하는setObfuscatedProfileId()
가 추가되었습니다. 자세한 내용은 개발자 페이로드 업데이트 및 대안을 참고하세요.Purchase
에BillingFlowParams
에서 설정된 난독화된 계정 식별자를 반환하기 위한getAccountIdentifiers()
메서드가 추가되었습니다.BillingClient
에서 지원 중단된 보상 SKU의 일부로loadRewardedSku()
메서드가 지원 중단으로 표시되었습니다. Play Console 고객센터에서 지원 중단에 관한 자세한 정보를 확인할 수 있습니다.
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.products
및 Purchases.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개의 새로운 메서드가 포함되어 있습니다.
getOriginalPriceAmountMicros()
- 할인 전의 원래 SKU 가격을 형식 없이 반환합니다.getOriginalPrice()
- 원래 가격에 통화 형식을 추가하여 반환합니다.
대기 중인 거래
Google Play 결제 라이브러리 버전 2.0을 사용하면 자격을 부여하기 전에 추가 작업이 필요한 구매를 지원해야 합니다. 예를 들어 사용자가 오프라인 상점에서 현금으로 인앱 상품을 구매할 수도 있습니다. 이는 앱 외부에서 완료된 거래입니다. 이 시나리오에서는 사용자가 거래를 완료한 후에만 자격을 부여해야 합니다.
대기 중인 구매를 사용 설정하려면 앱 초기화의 일부인 enablePendingPurchases()
를 호출하세요.
Purchase.getPurchaseState()
를 사용하면 구매 상태가 PURCHASED
인지 또는 PENDING
인지 확인할 수 있습니다. 상태가 PURCHASED
인 경우에만 자격을 부여해야 합니다. 다음과 같이 Purchase
상태 업데이트를 확인해야 합니다.
- 앱을 시작할 때
BillingClient.queryPurchases()
를 호출하여 사용자와 연관된 소비되지 않은 제품의 목록을 가져옵니다. - 반환된 각
Purchase
객체에서Purchase.getPurchaseState()
를 호출합니다. 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 언어를 사용하며 최종 사용자에게 표시되지 않습니다.
버그 수정
- 이제
SkuDetails.getIntroductoryPriceAmountMicros()
는String
대신long
을 반환합니다.
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을 사용할 수 있습니다. 이 버전에 포함된 변경사항은 다음과 같습니다.
주요 변경사항
- 리워드 제품 지원이 추가되었습니다. 수익 창출 옵션에 관한 자세한 내용은 리워드 제품별 기능 추가를 참조하세요.
기타 변경사항
- 더 쉽게 테스트할 수 있도록
PurchasesResult
및SkuDetailsResult
의 공개 생성자가 추가되었습니다. 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. } })
자바
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
에 비례 배분 모드를 지정하는 기능이 추가되었습니다. BillingFlowParams
의replaceSkusProration
부울 플래그는 더 이상 지원되지 않으며 대신replaceSkusProrationMode
를 사용합니다.launchBillingFlow()
에서 이제 실패한 응답을 위한 콜백을 트리거합니다.
동작 변경사항
Google Play 결제 라이브러리 버전 1.1에는 다음과 같은 동작 변경사항이 포함되어 있습니다.
개발자는 BillingFlowParams
클래스에 replaceSkusProrationMode
를 설정할 수 있음
ProrationMode
에서는 사용자의 정기 결제를 업그레이드하거나 다운그레이드할 때 비례 배분 유형에 관한 추가 세부정보를 제공합니다.
Kotlin
BillingFlowParams.newBuilder() .setSku(skuId) .setType(billingType) .setOldSku(oldSku) .setReplaceSkusProrationMode(replaceSkusProrationMode) .build()
자바
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 |
교체가 즉시 적용되며, 다음번 반복에 새 가격이 부과됩니다. 결제 주기는 동일하게 유지됩니다. |
replaceSkusProration
이 BillingFlowParams
클래스에서 더 이상 지원되지 않음
지금까지 개발자는 불리언 플래그를 설정하여 정기 결제 업그레이드 요청의 비례 배분된 금액을 청구할 수 있었습니다. 그러나 이제 더 자세한 비례 배분 명령이 포함된 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() { ... })
자바
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>)
자바
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)
버그 수정
- PURCHASES_UPDATED 번들에 응답 코드 없음
- 기기가 회전하는 동안 발생하는 ProxyBillingActivity 및 PurchasesUpdatedListener 문제 해결
개발자 프리뷰 1 출시(2017년 6월 12일, 공지)
결제와 관련된 개발 프로세스를 단순화하고 개발자가 애플리케이션 아키텍처 및 탐색 구조와 같은 Android 앱 관련 로직을 구현하는 데 집중할 수 있도록 개발자 미리보기가 출시되었습니다.
라이브러리에는 Android 앱을 Google Play Billing API와 통합할 때 사용할 수 있는 여러 편리한 클래스와 기능이 포함되어 있습니다. 또한 라이브러리는 개발자가 앱과 Google Play Billing API 간에 인터페이스를 더 쉽게 정의할 수 있도록 Android 인터페이스 정의 언어(AIDL) 서비스 외에 추상화 레이어를 제공합니다.