Development/Android

[Android] 구독형 인앱 결제 상품의 재구독 처리

SeungYong.Lee 2025. 5. 15. 10:33
반응형

- 구독형 상품에는 만료일이 존재한다.

- 우리가 넷플릭스 같은 구독형 서비스를 첫 결제한 일자 + 1달 / 1년 정도가 보통 이번 구독 만료일이다.

 

- 그리고 사용자가 만일 구독을 중단하고 싶으면 플레이 스토어에서 정기 결제 취소를 진행하는데, 이때 서비스에서는 사용자가 이탈하지 않도록 재구독을 권하는 로직을 구성할 수도 있다.

 

- 이때 인앱 결제 영수증으로부터 ExpiredTime 데이터를 가져와서 처리함

 

- 그래서 재구독 버튼을 만들던 무언가 UIUX를 구성하는데, 이 재구독 기능은 특별히 구글 인앱 결제 모듈에 따로 구분이 되어있지는 않다.

 

- 단순히 사용자가 이용하던 구독 상품 ID를 찾고, 해당 상품의 결제 로직을 다시 호출하면 된다.

fun checkUnConfirmedPurchases(
    productType: String,
    onResult: (BillingResult, List<Purchase>) -> Unit
) {
    val params = QueryPurchasesParams.newBuilder().setProductType(productType)
    billingClient?.queryPurchasesAsync(params.build()) { billingResult, purchasesList ->
        onResult(billingResult, purchasesList)
    }
}

fun premiumReSubscribe(activity: Activity) {
    var lastProductId: String
    checkUnConfirmedPurchases(ProductType.SUBS) { billingResult, purchasesList ->
        if (billingResult.responseCode != BillingClient.BillingResponseCode.OK || purchasesList.isEmpty()) return@checkUnConfirmedPurchases
        //사용자가 구독을 취소한 상품을 찾아내는 부분
        lastProductId = purchasesList.find { !it.isAutoRenewing }?.products?.first() ?: return@checkUnConfirmedPurchases
        mainAsync {
            getPurchaseListDetails(arrayListOf('자사 서비스 상품 ID 목록'), ProductType.SUBS) { products ->
                if (products.isEmpty()) return@getPurchaseListDetails
                val product = products.find { it.productId == lastProductId } ?: return@getPurchaseListDetails
                startPurchase(product, activity)
            }
        }
    }
}

 

- AutoRenewing을 기준으로 정기 결제 취소된 상품을 골라낼 수 있다.

 

- 이후에 재구독 버튼을 클릭하면 구글 결제 창이 나타나는데, 기존의 만료일자까지는 추가 결제가 없는 것을 확인할 수 있다.

2025.05.15가 마지막 만료일이다.

 

반응형