구독이 아닌 "일회성 구매"를 구현할 것이다.
Google Play에서는 구매 토큰과 주문 ID를 사용하여 제품 및 거래를 추적합니다.
구매 토큰은 Google Play에서 제품에 대한 구매자의 자격을 나타내는 문자열
위의 문자열은 Google 사용자가 SKU로 표시되는 특정 제품과 관련하여 자격이 있음을 나타냄
개발자는 구매 토큰을 Google Play Developer API와 함께 사용할 수 있음.
주문 ID는 Google Play에서 금융 거래를 나타내는 문자열
이 문자열은 구매자에게 이메일로 전송되는 영수증에 포함
주문 ID를 사용하여 환불을 관리할 수 있습니다
주문 ID는 판매 및 판매 대금 보고서에서도 사용
주문 ID는 금융 거래가 발생할 때마다 생성
구매 토큰은 사용자가 구매 흐름을 완료할 때만 생성
일회성 제품의 경우 모든 구매 시 새 구매 토큰이 생성
대부분의 구매 시 새 주문 ID도 생성.
오류 처리
Google Play 결제 라이브러리는 BillingResult 형식으로 오류를 반환
BillingResult에는 BillingResponseCode가 포함되어 있어 앱에서 발생할 수 있는 결제 관련 오류를 분류
BillingResult에는 개발 중에 오류를 진단하는 데 유용한 디버그 메시지가 포함
BillingClient 초기화
Google Play 결제 라이브러리의 종속 항목을 추가한 후
BillingClient 인스턴스를 초기화해야 한다.
BillingClient는 Google Play 결제 라이브러리와 나머지 앱 간의 통신을 위한 기본 인터페이스이다.
BillingClient는 많은 일반적인 결제 작업에 편의 메서드(동기 메서드와 비동기 메서드 모두)를 제공
BillingClient를 생성하려면 newBuilder()를 사용
구매 관련 업데이트를 수신하려면 setListener()를 호출하여 PurchasesUpdatedListener에 대한 참조를 전달
이 리스너는 앱의 모든 구매 관련 업데이트를 수신한다.
BillingClient를 만든 후 Google Play에 연결해야 합니다.
Google Play에 연결하려면 startConnection()을 호출합니다.
연결 프로세스는 비동기적입니다.
그리고 클라이언트 설정이 완료되고 추가로 요청할 준비가 되면 BillingClientStateListener를 구현하여 콜백을 수신해야 합니다.
또한 Google Play와 연결이 끊어진 문제를 처리하려면 재시도 로직을 구현해야 합니다.
재시도 로직을 구현하려면 onBillingServiceDisconnected() 콜백 메서드를 재정의합니다.
그리고 추가 요청을 하기 전에 BillingClient가 startConnection() 메서드를 호출하여 Google Play에 다시 연결하도록 해야 합니다.
다음 예는 연결을 시작하고 사용 준비가 되었는지 테스트하는 방법을 보여줍니다.
구입 가능한 제품 표시
Google Play에 연결한 후에는 구매 가능한 제품을 쿼리하여 사용자에게 표시할 준비가 된 것.
Google Play에 인앱 상품 세부정보를 쿼리하려면 querySkuDetailsAsync()를 호출.
SKU 세부정보 쿼리는 현지화된 제품 정보를 반환하므로 사용자에게 제품을 표시하기 전에 중요한 단계.
querySkuDetailsAsync()를 호출할 때 SkuType과 함께 Google Play Console에서 생성된 제품 ID 문자열 목록을 지정하는 SkuDetailsParams의 인스턴스를 전달.
SkuType은 일회성 제품의 경우 SkuType.INAPP, 정기 결제의 경우 SkuType.SUBS가 될 수 있다.
비동기 작업의 결과를 처리하려면 SkuDetailsResponseListener 인터페이스를 구현하는 리스너도 지정해야 한다.
그런 후 다음 예에서와 같이 쿼리가 완료되면 리스너에 알리는 onSkuDetailsResponse()를 재정의할 수 했음.
Google Play 결제 라이브러리는 SkuDetails 객체의 List에 쿼리 결과를 저장한다.
그런 후 목록의 각 SkuDetails 객체에서 다양한 메서드를 호출하여 가격 또는 설명과 같은 인앱 상품에 관한 적절한 정보를 볼 수 있습니다. 사용 가능한 제품 세부정보를 보려면 SkuDetails 클래스의 메서드 목록을 참조.
판매할 항목을 제공하기 전에 사용자가 그 항목을 이미 소유하고 있지 않은지 확인합니다. 사용자의 항목 라이브러리에 소비성 항목이 여전히 있다면 사용자가 항목을 다시 구입하기 전에 먼저 항목을 소비해야 한다.
정기 결제를 제공하기 전에 사용자가 이미 정기 결제하지 않았는지 확인
구매 흐름 시작
앱에서 구매 요청을 시작하려면 앱의 기본 스레드에서 launchBillingFlow() 메서드를 호출한다.
이 메서드는 querySkuDetailsAsync() 호출에서 얻은 관련 SkuDetails 객체가 포함된 BillingFlowParams 객체를 참조한다.
BillingFlowParams 객체를 생성하려면 BillingFlowParams.Builder 클래스를 사용한다.
launchBillingFlow() 메서드는 BillingClient.BillingResponseCode에 나열된 몇 가지 응답 코드 중 하나를 반환한다.
이 결과를 검토하여 구매 흐름을 시작하는 동안 발생한 오류가 없는지 확인한다.
OK의 BillingResponseCode는 성공적으로 시작되었음을 나타낸다.
launchBillingFlow() 호출에 성공하면 시스템에서 Google Play 구매 화면을 표시함.
그림 1은 일회성 제품의 구매 화면을 보여줌.
Google Play는 onPurchasesUpdated()를 호출하여 PurchasesUpdatedListener 인터페이스를 구현하는 리스너에 구매 작업의 결과를 제공합니다.
리스너는 클라이언트를 초기화할 때 setListener() 메서드를 사용하여 지정됩니다.
가능한 응답 코드를 처리하려면 onPurchasesUpdated()를 구현해야 합니다.
다음 예는 onPurchasesUpdated()를 재정의하는 방법을 보여줍니다.
override fun onPurchasesUpdated(billingResult: BillingResult, purchases: List<Purchase>?) {
if (billingResult.responseCode == BillingResponseCode.OK && purchases != null) {
for (purchase in purchases) {
handlePurchase(purchase)
}
} else if (billingResult.responseCode == BillingResponseCode.USER_CANCELED) {
// Handle an error caused by a user cancelling the purchase flow.
} else {
// Handle any other error codes.
}
}
구매 성공 시 그림 2와 유사한 Google Play 구매 성공 화면이 생성
또한 구매 성공 시 사용자가 구매한 인앱 상품의 사용자 및 제품 ID를 나타내는 고유 식별자인 구매 토큰도 생성됩니다. 앱은 구매 토큰을 로컬에 저장할 수 있습니다
하지만, 구매를 인증하고 사기로부터 보호할 수 있는 보안 백엔드 서버로 토큰을 전달하는 것이 좋습니다.
이 프로세스는 다음 섹션에서 자세히 설명합니다.
또한 사용자는 주문 ID 또는 거래의 고유 ID가 포함된 거래 영수증을 이메일로 받습니다.
사용자는 일회성 제품 구매 시마다 그리고 최초 정기 결제 구매 및 이후의 반복적인 자동 갱신 시에도 고유 주문 ID가 포함된 이메일을 받습니다.
Google Play Console에서 주문 ID를 사용하여 환불을 관리할 수 있습니다.
구매 처리
사용자가 구매를 완료하면 앱에서 구매를 처리해야 합니다.
대부분의 경우 앱은 PurchasesUpdatedListener를 통해 구매 알림을 받습니다.
그러나 구매 가져오기에 설명된 것처럼 앱이 BillingClient.queryPurchases() 호출을 인식하는 경우가 있습니다.
앱은 다음과 같은 방식으로 구매를 처리해야 합니다.
- 구매를 인증합니다.
- 사용자에게 콘텐츠를 제공하고 콘텐츠 전송을 확인합니다. 선택적으로, 사용자가 항목을 다시 구입할 수 있도록 항목을 소비됨으로 표시합니다.
구매를 인증하려면 먼저 구매 상태가 PURCHASED인지 확인합니다.
구매가 PENDING이라면 대기 중인 거래 처리에 설명된 대로 구매를 처리해야 합니다.
onPurchaseUpdated() 또는 queryPurchases에서 수신한 구매의 경우 앱이 자격을 부여하기 전에 구매를 추가로 인증하여 정당성을 확인해야 합니다.
구매를 적절하게 인증하는 방법을 알아보려면 자격을 부여하기 전에 구매 확인을 참조하세요.
구매를 인증했다면 앱에서 사용자에게 자격을 부여할 준비가 된 것입니다. 자격을 부여한 후 앱에서 구매를 확인해야 합니다.
이 확인은 구매와 관련된 자격을 부여했음을 Google Play에 알려줍니다.
자격을 부여하고 구매를 확인하는 프로세스는 구매가 비소비성인지, 소비성인지 아니면 정기 결제인지에 따라 다릅니다.
소비성인 경우 consumeAsync() 메서드는 확인 요구사항을 충족하며 앱이 사용자에게 자격을 부여했음을 나타냅니다. 또한 이 메서드를 사용하면 앱에서 일회성 제품을 다시 구매할 수 있습니다.
일회성 제품이 소비되었음을 나타내려면 consumeAsync()를 호출하고 Google Play에서 다시 구매할 수 있게 할 구매 토큰을 포함합니다.
또한 ConsumeResponseListener 인터페이스를 구현하는 객체를 전달해야 합니다.
이 객체는 소비 작업의 결과를 처리합니다.
작업 완료 시 Google Play 결제 라이브러리가 호출하는 onConsumeResponse() 메서드를 재정의할 수 있습니다.
다음 예는 관련 구매 토큰을 사용하여 제품을 소비하는 것을 보여준다.
참고: 소비 요청이 때로 실패할 수 있으므로 보안 백엔드 서버를 확인하여 각 구매 토큰이 사용되지 않았는지 확인해야 합니다.
그래야 앱이 동일한 구매에 대해 여러 번 자격을 부여하지 않습니다.
또는 자격을 부여하기 전에 앱이 Google Play에서 성공적인 소비 응답을 받을 때까지 기다릴 수 있습니다.
Google Play에서 성공적인 소비 응답을 보낼 때까지 사용자의 구매를 보류하도록 선택하는 경우 소비 요청 이후 구매 추적을 놓치지 않도록 매우 주의해야 합니다.
다음 예는 Google Play 결제 라이브러리를 사용하여 구매를 확인하는 방법을 보여줍니다.
정기 결제 구매는 비소비성 구매와 유사하게 처리됩니다.
Google Play 결제 라이브러리의 BillingClient.acknowledgePurchase() 또는 Google Play Developer API의 Purchases.Subscriptions.Acknowledge를 사용하여 정기 결제 확인을 확인할 수 있습니다.
최초 정기 결제 구매는 모두 확인해야 합니다. 정기 결제 갱신은 확인하지 않아도 됩니다.
정기 결제를 확인해야 하는 경우에 관한 자세한 내용은 정기 결제 판매 주제를 참조하세요.
(아래는 생략함)
구매 가져오기
앱 외부에서 이루어진 구매 처리
대기 중인 거래 처리
'Android Dev > Google Billing API' 카테고리의 다른 글
구글 결제 시스템 Billing API 설계 절차(4) - TrivialDriveKotlin 분석 - 동작 메커니즘. (0) | 2020.12.27 |
---|---|
구글 결제 시스템 Billing API 설계 절차(3) - TrivialDriveKotlin 분석 - BillingRepository.kt (0) | 2020.12.27 |
구글 결제 시스템 Billing API 설계 절차(1) (0) | 2020.12.21 |