{"id":138012,"date":"2021-03-24T00:00:00","date_gmt":"2021-03-24T00:00:00","guid":{"rendered":"https:\/\/adapty.io\/blog\/android-in-app-purchases-google-play-billing-library-part-2\/"},"modified":"2025-06-26T13:05:11","modified_gmt":"2025-06-26T13:05:11","slug":"android-in-app-purchases-google-play-billing-library-part-2","status":"publish","type":"post","link":"https:\/\/adapty.io\/ko\/blog\/android-in-app-purchases-google-play-billing-library-part-2\/","title":{"rendered":"Android \uc778\uc571 \uad6c\ub9e4, 2\ubd80: Google Play \uacb0\uc81c \ub77c\uc774\ube0c\ub7ec\ub9ac (Google Play Billing Library)\ub85c \uad6c\ub9e4 \ucc98\ub9ac\ud558\uae30"},"content":{"rendered":"

\uc774\uc804\uae30\uc0ac\uc5d0\uc11c \uacb0\uc81c \ub77c\uc774\ube0c\ub7ec\ub9ac\uc640 \ud568\uaed8 \uc791\ub3d9\ud558\ub294 \ub798\ud37c\ud074\ub798\uc2a4\ub97c \uc0dd\uc131\ud588\uc2b5\ub2c8\ub2e4.<\/p>

<\/path><\/path><\/svg><\/span>
import<\/span> <\/span>android.content.Context<\/span><\/span> import<\/span> <\/span>com.android.billingclient.api.*<\/span><\/span> class<\/span> <\/span>BillingClientWrapper<\/span>(<\/span>context<\/span>:<\/span> <\/span>Context<\/span>)<\/span> <\/span>:<\/span> <\/span>PurchasesUpdatedListener<\/span> <\/span>{<\/span><\/span>    <\/span>interface<\/span> <\/span>OnQueryProductsListener<\/span> <\/span>{<\/span><\/span>        <\/span>fun<\/span> <\/span>onSuccess<\/span>(<\/span>products<\/span>:<\/span> <\/span>List<\/span><<\/span>SkuDetails<\/span>><\/span>)<\/span><\/span>        <\/span>fun<\/span> <\/span>onFailure<\/span>(<\/span>error<\/span>:<\/span> <\/span>Error<\/span>)<\/span><\/span>    <\/span>}<\/span><\/span>    <\/span>class<\/span> <\/span>Error<\/span>(<\/span>val<\/span> <\/span>responseCode<\/span>:<\/span> <\/span>Int<\/span>,<\/span> <\/span>val<\/span> <\/span>debugMessage<\/span>:<\/span> <\/span>String<\/span>)<\/span><\/span>    <\/span>private<\/span> <\/span>val<\/span> billingClient <\/span>=<\/span> <\/span>BillingClient<\/span><\/span>        <\/span>.<\/span>newBuilder<\/span>(<\/span>context<\/span>)<\/span><\/span>        <\/span>.<\/span>enablePendingPurchases<\/span>()<\/span><\/span>        <\/span>.<\/span>setListener<\/span>(<\/span>this<\/span>)<\/span><\/span>        <\/span>.<\/span>build<\/span>()<\/span><\/span>    <\/span>fun<\/span> <\/span>queryProducts<\/span>(<\/span>listener<\/span>:<\/span> <\/span>OnQueryProductsListener<\/span>)<\/span> <\/span>{<\/span><\/span>        <\/span>val<\/span> skusList <\/span>=<\/span> <\/span>listOf<\/span>(<\/span>"<\/span>premium_sub_month<\/span>"<\/span>,<\/span> <\/span>"<\/span>premium_sub_year<\/span>"<\/span>,<\/span> <\/span>"<\/span>some_inapp<\/span>"<\/span>)<\/span><\/span>        queryProductsForType<\/span>(<\/span><\/span>            skusList<\/span>,<\/span><\/span>            <\/span>BillingClient<\/span>.<\/span>SkuType<\/span>.<\/span>SUBS<\/span><\/span>        <\/span>)<\/span> <\/span>{<\/span> billingResult<\/span>,<\/span> skuDetailsList <\/span>-><\/span><\/span>            <\/span>if<\/span> <\/span>(<\/span>billingResult<\/span>.<\/span>responseCode <\/span>==<\/span> <\/span>BillingClient<\/span>.<\/span>BillingResponseCode<\/span>.<\/span>OK<\/span>)<\/span> <\/span>{<\/span><\/span>                <\/span>val<\/span> products <\/span>=<\/span> skuDetailsList <\/span>?:<\/span> <\/span>mutableListOf<\/span>()<\/span><\/span>                queryProductsForType<\/span>(<\/span><\/span>                    skusList<\/span>,<\/span><\/span>                    <\/span>BillingClient<\/span>.<\/span>SkuType<\/span>.<\/span>INAPP<\/span><\/span>                <\/span>)<\/span> <\/span>{<\/span> billingResult<\/span>,<\/span> skuDetailsList <\/span>-><\/span><\/span>                    <\/span>if<\/span> <\/span>(<\/span>billingResult<\/span>.<\/span>responseCode <\/span>==<\/span> <\/span>BillingClient<\/span>.<\/span>BillingResponseCode<\/span>.<\/span>OK<\/span>)<\/span> <\/span>{<\/span><\/span>                        products<\/span>.<\/span>addAll<\/span>(<\/span>skuDetailsList <\/span>?:<\/span> <\/span>listOf<\/span>())<\/span><\/span>                        listener<\/span>.<\/span>onSuccess<\/span>(<\/span>products<\/span>)<\/span><\/span>                    <\/span>}<\/span> <\/span>else<\/span> <\/span>{<\/span><\/span>                        listener<\/span>.<\/span>onFailure<\/span>(<\/span><\/span>                            <\/span>Error<\/span>(<\/span>billingResult<\/span>.<\/span>responseCode<\/span>,<\/span> billingResult<\/span>.<\/span>debugMessage<\/span>)<\/span><\/span>                        <\/span>)<\/span><\/span>                    <\/span>}<\/span><\/span>                <\/span>}<\/span><\/span>            <\/span>}<\/span> <\/span>else<\/span> <\/span>{<\/span><\/span>                listener<\/span>.<\/span>onFailure<\/span>(<\/span><\/span>                    <\/span>Error<\/span>(<\/span>billingResult<\/span>.<\/span>responseCode<\/span>,<\/span> billingResult<\/span>.<\/span>debugMessage<\/span>)<\/span><\/span>                <\/span>)<\/span><\/span>            <\/span>}<\/span><\/span>        <\/span>}<\/span><\/span>    <\/span>}<\/span><\/span>    <\/span>private<\/span> <\/span>fun<\/span> <\/span>queryProductsForType<\/span>(<\/span><\/span>        <\/span>skusList<\/span>:<\/span> <\/span>List<\/span><<\/span>String<\/span>><\/span>,<\/span><\/span>        <\/span>@BillingClient.SkuType<\/span> <\/span>type<\/span>:<\/span> <\/span>String<\/span>,<\/span><\/span>        <\/span>listener<\/span>:<\/span> <\/span>SkuDetailsResponseListener<\/span><\/span>    <\/span>)<\/span> <\/span>{<\/span><\/span>        onConnected <\/span>{<\/span><\/span>            billingClient<\/span>.<\/span>querySkuDetailsAsync<\/span>(<\/span><\/span>                <\/span>SkuDetailsParams<\/span>.<\/span>newBuilder<\/span>().<\/span>setSkusList<\/span>(<\/span>skusList<\/span>).<\/span>setType<\/span>(<\/span>type<\/span>).<\/span>build<\/span>(),<\/span><\/span>                listener<\/span><\/span>            <\/span>)<\/span><\/span>        <\/span>}<\/span><\/span>    <\/span>}<\/span><\/span>    <\/span>private<\/span> <\/span>fun<\/span> <\/span>onConnected<\/span>(<\/span>block<\/span>:<\/span> <\/span>()<\/span> <\/span>-><\/span> <\/span>Unit<\/span>)<\/span> <\/span>{<\/span><\/span>        billingClient<\/span>.<\/span>startConnection<\/span>(<\/span>object<\/span> <\/span>:<\/span> <\/span>BillingClientStateListener<\/span> {<\/span><\/span>            override fun onBillingSetupFinished<\/span>(<\/span>billingResult<\/span>:<\/span> <\/span>BillingResult<\/span>)<\/span> {<\/span><\/span>                block<\/span>()<\/span><\/span>            }<\/span><\/span>            override fun onBillingServiceDisconnected<\/span>()<\/span> {<\/span><\/span>                <\/span>\/\/<\/span> <\/span>Try<\/span> to restart the connection on the next request to<\/span><\/span>                <\/span>\/\/<\/span> <\/span>Google<\/span> <\/span>Play<\/span> by calling the startConnection<\/span>()<\/span> method<\/span>.<\/span><\/span>            }<\/span><\/span>        }<\/span>)<\/span><\/span>    <\/span>}<\/span><\/span>    <\/span>override<\/span> <\/span>fun<\/span> <\/span>onPurchasesUpdated<\/span>(<\/span>billingResult<\/span>:<\/span> <\/span>BillingResult<\/span>,<\/span> <\/span>purchaseList<\/span>:<\/span> <\/span>MutableList<\/span><<\/span>Purchase<\/span>><\/span>?<\/span>)<\/span> <\/span>{<\/span><\/span>        <\/span>\/\/ here come callbacks about new purchases<\/span><\/span>    <\/span>}<\/span><\/span> }<\/span><\/span><\/code><\/pre><\/div>    

\uad6c\ub9e4\uad6c\ud604(purchaseimplementation)\uc73c\ub85c\uc9c4\ud589\ud558\uc5ec \ud074\ub798\uc2a4\ub97c \uac1c\uc120\ud574 \ubcf4\uaca0\uc2b5\ub2c8\ub2e4.<\/p>

\uad6c\ub3c5\ud654\uba74 \ub514\uc790\uc778\ud558\uae30<\/h2>

\uc778\uc571\uad6c\ub9e4 \uae30\ub2a5\uc774 \uc788\ub294 \ubaa8\ub4e0 \uc571 (app)\uc5d0\ub294\ud398\uc774\uc6d4 (paywall)\ud654\uba74\uc774\uc788\uc2b5\ub2c8\ub2e4.Google\uc815\ucc45<\/a>\uc774\uc774\ub7ec\ud55c \ud654\uba74\uc5d0 \ubc18\ub4dc\uc2dc \uc788\uc5b4\uc57c \ud558\ub294 \ucd5c\uc18c\ud55c\uc758 \uc694\uc18c\uc640\uc9c0\uce68 \ud14d\uc2a4\ud2b8\ub97c \uc815\uc758\ud569\ub2c8\ub2e4.\uc694\uc57d\ud558\uc790\uba74\ub2e4\uc74c\uacfc \uac19\uc2b5\ub2c8\ub2e4.\ud398\uc774\uc6d4\ud654\uba74\uc5d0\uc11c \uad6c\ub3c5 \uc870\uac74,\ube44\uc6a9\ubc0f \uae30\uac04\uc744 \uba85\uc2dc\ud558\uace0 \uc571\uc744 \uc0ac\uc6a9\ud558\uae30 \uc704\ud574 \uad6c\ub3c5\uc774 \ud544\uc694\ud55c\uc9c0\uc5ec\ubd80\ub97c \uad6c\uccb4\uc801\uc73c\ub85c \uc9c0\uc815\ud574\uc57c \ud569\ub2c8\ub2e4.\ub610\ud55c\uc0ac\uc6a9\uc790\uac00 \uc870\uac74\uc744 \uac80\ud1a0\ud558\uae30 \uc704\ud574 \ucd94\uac00 \uc791\uc5c5\uc744 \uc218\ud589\ud558\ub3c4\ub85d\uac15\uc694\ud574\uc11c\ub294 \uc548 \ub429\ub2c8\ub2e4.<\/p>

\uc5ec\uae30\uc11c\ub294\ub2e8\uc21c\ud654\ub41c \ud398\uc774\uc6d4 \ud654\uba74\uc744 \uc608\ub85c \uc0ac\uc6a9\ud569\ub2c8\ub2e4.<\/p>

\"android
Android\uc0d8\ud50c\ud398\uc774\uc6d4<\/em><\/figcaption><\/figure><\/div>

\ud398\uc774\uc6d4\ud654\uba74\uc5d0\ub294 \ub2e4\uc74c \uc694\uc18c\uac00 \uc788\uc2b5\ub2c8\ub2e4.<\/p>